ZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvci8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1lZGlhdG9yLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1lZGlhdG9yLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3IvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3IvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3IvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NWUxY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1lZGlhdG9yLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWI1ZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1lZGlhdG9yL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQUNURiBNZWRpYXRvciBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5hY3RmLm1lZGlhdG9yCi1CdW5kbGUtVmVyc2lvbjogMC41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS51aS52aWV3cywKLSBvcmcuZWNsaXBzZS5hY3RmLmNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5hY3RmLnVpCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1lZGlhdG9yL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3IvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxZGJjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3IvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIAotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1lZGlhdG9yL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3IvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkYWE1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3IvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvci9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tZWRpYXRvci9JQUNURlJlcG9ydC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1lZGlhdG9yL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21lZGlhdG9yL0lBQ1RGUmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5Y2E5ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1lZGlhdG9yL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21lZGlhdG9yL0lBQ1RGUmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3I7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSB1c2VkIGJ5IEFDVEYgcmVwb3J0IGdlbmVyYXRvcnMgKHtAbGluayBJQUNURlJlcG9ydEdlbmVyYXRvcn0pCi0gKiB0byBlbmNhcHN1bGF0ZSBhIHJlcG9ydC4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBQ1RGUmVwb3J0IHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1lZGlhdG9yL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21lZGlhdG9yL0lBQ1RGUmVwb3J0R2VuZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3Ivc3JjL29yZy9lY2xpcHNlL2FjdGYvbWVkaWF0b3IvSUFDVEZSZXBvcnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlZDI2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3Ivc3JjL29yZy9lY2xpcHNlL2FjdGYvbWVkaWF0b3IvSUFDVEZSZXBvcnRHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciByZXBvcnQgZ2VuZXJhdG9ycyBpbiBBQ1RGLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gKiBJQUNURlJlcG9ydEdlbmVyYXRvciB3aWxsIHJlY2VpdmUgdGhlIHN0YXR1cyBjaGFuZ2UgaW4gQUNURiBhcyBhCi0gKiBNZWRpYXRvckV2ZW50LiBXaGVuIHVzZXJzIGFjdGl2YXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSwgaXQKLSAqIHdpbGwgYXV0b21hdGljYWxseSBpbmZvcm1lZCB0byBvdGhlciBBQ1RGIGNvbXBvbmVudHMgYXMgYSBNZWRpYXRvckV2ZW50LgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFDVEZSZXBvcnRHZW5lcmF0b3IgZXh0ZW5kcyBJVmlld1BhcnQsIElNZWRpYXRvckV2ZW50TGlzdGVuZXIgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3Ivc3JjL29yZy9lY2xpcHNlL2FjdGYvbWVkaWF0b3IvSUFDVEZSZXBvcnRWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvci9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tZWRpYXRvci9JQUNURlJlcG9ydFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDcxMmFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvci9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tZWRpYXRvci9JQUNURlJlcG9ydFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1lZGlhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHJlcG9ydCB2aWV3ZXJzIGluIEFDVEYuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIElBQ1RGUmVwb3J0Vmlld2VyIHdpbGwgcmVjZWl2ZSB0aGUgc3RhdHVzIGNoYW5nZSBpbiBBQ1RGIGFzIGEgTWVkaWF0b3JFdmVudC4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBQ1RGUmVwb3J0Vmlld2VyIGV4dGVuZHMgSVZpZXdQYXJ0LCBJTWVkaWF0b3JFdmVudExpc3RlbmVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1lZGlhdG9yL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21lZGlhdG9yL0lNZWRpYXRvckV2ZW50TGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvci9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tZWRpYXRvci9JTWVkaWF0b3JFdmVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMTQyNDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1lZGlhdG9yL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21lZGlhdG9yL0lNZWRpYXRvckV2ZW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgbGlzdGVuZXIgaW50ZXJmYWNlIG1heSBiZSBpbXBsZW1lbnRlZCBpbiBvcmRlciB0byByZWNlaXZlIGEKLSAqIHtAbGluayBNZWRpYXRvckV2ZW50fSBub3RpZmljYXRpb24gd2hlbiBhIHtAbGluayBNZWRpYXRvcn0gZGV0ZWN0cyBhIHN0YXR1cwotICogY2hhbmdlIGluIEFDVEYgY29tcG9uZW50cy4KLSAqIAotICogQHNlZSBNZWRpYXRvciNhZGRNZWRpYXRvckV2ZW50TGlzdGVuZXIoSU1lZGlhdG9yRXZlbnRMaXN0ZW5lcikKLSAqIEBzZWUgTWVkaWF0b3IjcmVtb3ZlTWVkaWF0b3JFdmVudExpc3RlbmVyKElNZWRpYXRvckV2ZW50TGlzdGVuZXIpCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVkaWF0b3JFdmVudExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcmVwb3J0ICh7QGxpbmsgSUFDVEZSZXByb3R9KSB3YXMKLQkgKiBzdWJtaXR0ZWQgdG8gdGhlIHtAbGluayBNZWRpYXRvcn0KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgTWVkaWF0b3JFdmVudH0gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JICogICAgICAgICAgICBldmVudC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXBvcnRDaGFuZ2VkKE1lZGlhdG9yRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSByZXBvcnQgZ2VuZXJhdG9yICh7QGxpbmsgSUFDVEZSZXByb3RHZW5lcmF0b3J9KQotCSAqIHdhcyBzZWxlY3RlZCBieSB1c2VyLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgVGhlIHtAbGluayBNZWRpYXRvckV2ZW50fSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQkgKiAgICAgICAgICAgIGV2ZW50LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcG9ydEdlbmVyYXRvckNoYW5nZWQoTWVkaWF0b3JFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIG1vZGVsIHNlcnZpY2Ugd2FzIHNlbGVjdGVkIGJ5IHVzZXIuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUge0BsaW5rIE1lZGlhdG9yRXZlbnR9IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCSAqICAgICAgICAgICAgZXZlbnQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgbW9kZWxzZXJ2aWNlQ2hhbmdlZChNZWRpYXRvckV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGlucHV0IGNoYW5nZSBldmVudCB3YXMgb2NjdXJlZCBpbiB0aGUKLQkgKiBhY3RpdmUgbW9kZWwgc2VydmljZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIFRoZSB7QGxpbmsgTWVkaWF0b3JFdmVudH0gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JICogICAgICAgICAgICBldmVudC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBtb2RlbHNlcnZpY2VJbnB1dENoYW5nZWQoTWVkaWF0b3JFdmVudCBldmVudCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3Ivc3JjL29yZy9lY2xpcHNlL2FjdGYvbWVkaWF0b3IvTWVkaWF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvci9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tZWRpYXRvci9NZWRpYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjJlOGNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvci9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tZWRpYXRvci9NZWRpYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1lZGlhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuSU1vZGVsU2VydmljZUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnVpLnV0aWwuQWJzdHJhY3RQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQSA8Y29kZT5NZWRpYXRvcjwvY29kZT4gbWFuYWdlcyBjb21wb25lbnRzIGFuZCBkYXRhZmxvd3MgaW4gdGhlIEFDVEYgYnkKLSAqIGNvbGxhYm9yYXRpbmcgd2l0aCB0aGUgRWNsaXBzZSBmcmFtZXdvcmsuIElmIDxjb2RlPk1lZGlhdG9yPC9jb2RlPiBkZXRlY3RzCi0gKiBhIHN0YXR1cyBjaGFuZ2UgaW4gQUNURiBjb21wb25lbnRzLCBpdCB3aWxsIHNlbmQgPGNvZGU+TWVkaWF0b3JFdmVudDwvY29kZT4KLSAqIHRvIEFDVEYgY29tcG9uZW50cyBhbmQgb3RoZXIgcmVnaXN0ZXJlZCBFdmVudExpc3RlbmVycy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWVkaWF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgTWVkaWF0b3IgaW5zdGFuY2UgPSBuZXcgTWVkaWF0b3IoKTsKLQotCXByaXZhdGUgSUFDVEZSZXBvcnRHZW5lcmF0b3IgY3VyUmVwb3RlcjsKLQotCXByaXZhdGUgSU1vZGVsU2VydmljZUhvbGRlciBjdXJyZW50TW9kZWxTZXJ2aWNlSG9sZGVyOwotCi0JLy8gVE9ETyBtb2RlbC92aXp2aWV3IGNvbWJpbmF0aW9uIHRvIHN0b3JlIHRoZSByZXN1bHQKLQlwcml2YXRlIEhhc2hNYXA8SUFDVEZSZXBvcnRHZW5lcmF0b3IsIElBQ1RGUmVwb3J0PiByZXBvcnRNYXAgPSBuZXcgSGFzaE1hcDxJQUNURlJlcG9ydEdlbmVyYXRvciwgSUFDVEZSZXBvcnQ+KCk7Ci0KLQlwcml2YXRlIFZlY3RvcjxJTWVkaWF0b3JFdmVudExpc3RlbmVyPiBtZWRpYXRvckV2ZW50TGlzbnRlclYgPSBuZXcgVmVjdG9yPElNZWRpYXRvckV2ZW50TGlzdGVuZXI+KCk7Ci0KLQkvKioKLQkgKiBHZXRzIE1lZGlhdG9yIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gTWVkaWF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1lZGlhdG9yIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBNZWRpYXRvcigpIHsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlcG9ydCB0byBNZWRpYXRvci4gT3RoZXIgQUNURiBjb21wb25lbnRzIHdpbGwgcmVjZWl2ZSB0aGUKLQkgKiA8Y29kZT5NZWRpYXRvckV2ZW50PC9jb2RlPiAocmVwb3J0IGNoYW5nZWQpLgotCSAqIAotCSAqIEBwYXJhbSBnZW5lcmF0b3IKLQkgKiAgICAgICAgICAgIGdlbmVyYXRvciBvZiB0aGUgcmVwb3J0Ci0JICogQHBhcmFtIHJlcG9ydAotCSAqICAgICAgICAgICAgbmV3IHJlcG9ydCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBvcnQoSUFDVEZSZXBvcnRHZW5lcmF0b3IgZ2VuZXJhdG9yLCBJQUNURlJlcG9ydCByZXBvcnQpIHsKLQkJcmVwb3J0TWFwLnB1dChnZW5lcmF0b3IsIHJlcG9ydCk7Ci0JCXJlcG9ydENoYW5nZWQobmV3IE1lZGlhdG9yRXZlbnQodGhpcywgY3VycmVudE1vZGVsU2VydmljZUhvbGRlciwKLQkJCQlnZW5lcmF0b3IsIHJlcG9ydCkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgY3VycmVudCByZXBvcnQgc3VibWl0dGVkIGZyb20gdGhlIHJlcG9ydCBnZW5lcmF0b3IuCi0JICogCi0JICogQHBhcmFtIGdlbmVyYXRvcgotCSAqICAgICAgICAgICAgdGFyZ2V0IHJlcG9ydCBnZW5lcmF0b3IKLQkgKiBAcmV0dXJuIGN1cnJlbnQgcmVwb3J0IHN1Ym1pdHRlZCBmcm9tIHRoZSByZXBvcnQgZ2VuZXJhdG9yCi0JICovCi0JcHVibGljIElBQ1RGUmVwb3J0IGdldFJlcG9ydChJQUNURlJlcG9ydEdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQkJcmV0dXJuIGdldEV2YWx1YXRpb25SZXN1bHQobnVsbCwgZ2VuZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIElBQ1RGUmVwb3J0IGdldEV2YWx1YXRpb25SZXN1bHQoSU1vZGVsU2VydmljZUhvbGRlciBob2xkZXIsCi0JCQlJQUNURlJlcG9ydEdlbmVyYXRvciByZXBvcnRlcikgewotCQlpZiAocmVwb3J0TWFwLmNvbnRhaW5zS2V5KHJlcG9ydGVyKSkgewotCQkJcmV0dXJuICgoSUFDVEZSZXBvcnQpIHJlcG9ydE1hcC5nZXQocmVwb3J0ZXIpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQkJLy8gcmV0dXJuIChuZXcgRXZhbHVhdGlvblJlc3VsdEltcGwoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQotCQlJVmlld1JlZmVyZW5jZVtdIHZpZXdzID0gYWN0aXZlUGFnZS5nZXRWaWV3UmVmZXJlbmNlcygpOwotCQlJVmlld1BhcnQgdG1wVmlld1BhcnQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmlld3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgodG1wVmlld1BhcnQgPSB2aWV3c1tpXS5nZXRWaWV3KGZhbHNlKSkgIT0gbnVsbCkgewotCQkJCWlmICh0bXBWaWV3UGFydCBpbnN0YW5jZW9mIElNZWRpYXRvckV2ZW50TGlzdGVuZXIpIHsKLQkJCQkJbWVkaWF0b3JFdmVudExpc250ZXJWCi0JCQkJCQkJLmFkZCgoSU1lZGlhdG9yRXZlbnRMaXN0ZW5lcikgdG1wVmlld1BhcnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWFjdGl2ZVBhZ2UuYWRkUGFydExpc3RlbmVyKG5ldyBBYnN0cmFjdFBhcnRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHBhcnRSZWYuZ2V0UGFydChmYWxzZSk7Ci0JCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJQUNURlJlcG9ydEdlbmVyYXRvciAmJiBwYXJ0ICE9IGN1clJlcG90ZXIpIHsKLQkJCQkJY3VyUmVwb3RlciA9IChJQUNURlJlcG9ydEdlbmVyYXRvcikgcGFydDsKLQkJCQkJcmVwb3J0ZXJWaWV3Q2hhbmdlZChuZXcgTWVkaWF0b3JFdmVudChNZWRpYXRvci50aGlzLAotCQkJCQkJCWN1cnJlbnRNb2RlbFNlcnZpY2VIb2xkZXIsIGN1clJlcG90ZXIsCi0JCQkJCQkJZ2V0UmVwb3J0KGN1clJlcG90ZXIpKSk7Ci0JCQkJfQotCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSU1vZGVsU2VydmljZUhvbGRlcgotCQkJCQkJJiYgcGFydCAhPSBjdXJyZW50TW9kZWxTZXJ2aWNlSG9sZGVyKSB7Ci0JCQkJCWN1cnJlbnRNb2RlbFNlcnZpY2VIb2xkZXIgPSAoSU1vZGVsU2VydmljZUhvbGRlcikgcGFydDsKLQkJCQkJbW9kZWxzZXJ2aWNlQ2hhbmdlZChuZXcgTWVkaWF0b3JFdmVudChNZWRpYXRvci50aGlzLAotCQkJCQkJCWN1cnJlbnRNb2RlbFNlcnZpY2VIb2xkZXIsIGN1clJlcG90ZXIsCi0JCQkJCQkJZ2V0UmVwb3J0KGN1clJlcG90ZXIpKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBwYXJ0UmVmLmdldFBhcnQoZmFsc2UpOwotCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSU1lZGlhdG9yRXZlbnRMaXN0ZW5lcikgewotCQkJCQltZWRpYXRvckV2ZW50TGlzbnRlclYucmVtb3ZlKChJTWVkaWF0b3JFdmVudExpc3RlbmVyKSBwYXJ0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHBhcnRSZWYuZ2V0UGFydChmYWxzZSk7Ci0JCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJQUNURlJlcG9ydFZpZXdlcikgewotCQkJCQlJQUNURlJlcG9ydFZpZXdlciB2aWV3ZXIgPSAoSUFDVEZSZXBvcnRWaWV3ZXIpIHBhcnQ7Ci0JCQkJCWlmIChjdXJyZW50TW9kZWxTZXJ2aWNlSG9sZGVyICE9IG51bGwpIHsKLQkJCQkJCXZpZXdlci5yZXBvcnRDaGFuZ2VkKG5ldyBNZWRpYXRvckV2ZW50KE1lZGlhdG9yLnRoaXMsCi0JCQkJCQkJCWN1cnJlbnRNb2RlbFNlcnZpY2VIb2xkZXIsIGN1clJlcG90ZXIsCi0JCQkJCQkJCWdldFJlcG9ydChjdXJSZXBvdGVyKSkpOwotCQkJCQl9Ci0JCQkJCW1lZGlhdG9yRXZlbnRMaXNudGVyVi5hZGQodmlld2VyKTsKLQkJCQl9IGVsc2UgaWYgKHBhcnQgaW5zdGFuY2VvZiBJQUNURlJlcG9ydEdlbmVyYXRvcikgewotCQkJCQltZWRpYXRvckV2ZW50TGlzbnRlclYuYWRkKChJQUNURlJlcG9ydEdlbmVyYXRvcikgcGFydCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBUT0RPIENhbGwgSW5wdXRDaGFuZ2VkIHdoZW4gdGhlIHRhcmdldCBVUkwgb2YgdGhlIEVkaXRvciBjaGFuZ2VzCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHBhcnRJbnB1dENoYW5nZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBwYXJ0UmVmLmdldFBhcnQoZmFsc2UpOwotCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSU1vZGVsU2VydmljZUhvbGRlcikgewotCQkJCQljdXJyZW50TW9kZWxTZXJ2aWNlSG9sZGVyID0gKElNb2RlbFNlcnZpY2VIb2xkZXIpIHBhcnQ7Ci0JCQkJCW1vZGVsc2VydmljZUlucHV0Q2hhbmdlZChuZXcgTWVkaWF0b3JFdmVudChNZWRpYXRvci50aGlzLAotCQkJCQkJCWN1cnJlbnRNb2RlbFNlcnZpY2VIb2xkZXIsIGN1clJlcG90ZXIsCi0JCQkJCQkJZ2V0UmVwb3J0KGN1clJlcG90ZXIpKSk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoZSA8Y29kZT5JTWVkaWF0b3JFdmVudExpc3RlbmVyPC9jb2RlPiB0byB0aGUgTWVkaWF0b3IuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gcmVnaXN0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNZWRpYXRvckV2ZW50TGlzdGVuZXIoSU1lZGlhdG9yRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQltZWRpYXRvckV2ZW50TGlzbnRlclYuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSA8Y29kZT5JTWVkaWF0b3JFdmVudExpc3RlbmVyPC9jb2RlPiBmcm9tIHRoZSBNZWRpYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byByZW1vdmUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxpc3RlbmVyIGlzIHJlbW92ZWQgZnJvbSB0aGUgTWVkaWF0b3IKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVNZWRpYXRvckV2ZW50TGlzdGVuZXIoSU1lZGlhdG9yRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZXR1cm4gbWVkaWF0b3JFdmVudExpc250ZXJWLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1vZGVsc2VydmljZUNoYW5nZWQoTWVkaWF0b3JFdmVudCBldmVudCkgewotCQlmb3IgKElNZWRpYXRvckV2ZW50TGlzdGVuZXIgaSA6IG1lZGlhdG9yRXZlbnRMaXNudGVyVikgewotCQkJaS5tb2RlbHNlcnZpY2VDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBtb2RlbHNlcnZpY2VJbnB1dENoYW5nZWQoTWVkaWF0b3JFdmVudCBldmVudCkgewotCQlmb3IgKElNZWRpYXRvckV2ZW50TGlzdGVuZXIgaSA6IG1lZGlhdG9yRXZlbnRMaXNudGVyVikgewotCQkJaS5tb2RlbHNlcnZpY2VJbnB1dENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydENoYW5nZWQoTWVkaWF0b3JFdmVudCBldmVudCkgewotCQlmb3IgKElNZWRpYXRvckV2ZW50TGlzdGVuZXIgaSA6IG1lZGlhdG9yRXZlbnRMaXNudGVyVikgewotCQkJaS5yZXBvcnRDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXBvcnRlclZpZXdDaGFuZ2VkKE1lZGlhdG9yRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChJTWVkaWF0b3JFdmVudExpc3RlbmVyIGkgOiBtZWRpYXRvckV2ZW50TGlzbnRlclYpIHsKLQkJCWkucmVwb3J0R2VuZXJhdG9yQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvci9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tZWRpYXRvci9NZWRpYXRvckV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3Ivc3JjL29yZy9lY2xpcHNlL2FjdGYvbWVkaWF0b3IvTWVkaWF0b3JFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmRkYmZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tZWRpYXRvci9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tZWRpYXRvci9NZWRpYXRvckV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubWVkaWF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLklNb2RlbFNlcnZpY2VIb2xkZXI7Ci0KLS8qKgotICogQSA8Y29kZT5NZWRpYXRvckV2ZW50PC9jb2RlPiBpcyBzZW50IGJ5IGEge0BsaW5rIE1lZGlhdG9yfSB0bwotICoge0BsaW5rIElNZWRpYXRvckV2ZW50TGlzdGVuZXJ9cyB3aGVuIHRoZSA8Y29kZT5NZWRpYXRvcjwvY29kZT4KLSAqIGRldGVjdHMgYSBzdGF0dXMgY2hhbmdlIGluIEFDVEYgY29tcG9uZW50cy4gVGhpcyBub3RpZmljYXRpb24gdHlwaWNhbGx5IAotICogb2NjdXJzIHdoZW4gdGhlIHVzZXIgYWN0aXZhdGVzIGFuIEFDVEYgTW9kZWwgU2VydmljZSAodXN1YWxseSBFZGl0b3IgdGhhdAotICogaW1wbGVtZW50cyA8Y29kZT5JTW9kZWxTZXJ2aWNlPC9jb2RlPikgb3IgYW4gQUNURiBSZXBvcnRlciBWaWV3cyAKLSAqIChpbXBsZW1lbnRzIDxjb2RlPklBQ1RGUmVwb3J0ZXJWaWV3PC9jb2RlPiB0aGF0IGdlbmVyYXRlcyBhbiBBQ1RGIFJlcG9ydCkuCi0gKiBUaGlzIGV2ZW50IGlzIGFsc28gbm90aWZpZWQgd2hlbiB0aGUgcmVwb3J0IAotICogKGltcGxlbWVudHMgPGNvZGU+SUFDVEZSZXBvcnQ8L2NvZGU+KSB3YXMgY2hhbmdlZC4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWVkaWF0b3JFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MzA4ODYwNDM0MjEzNzE2NTU0TDsKLQotCXByaXZhdGUgSU1vZGVsU2VydmljZUhvbGRlciBtb2RlbFNlcnZpY2VIb2xkZXI7Ci0JcHJpdmF0ZSBJQUNURlJlcG9ydEdlbmVyYXRvciB2aWV3OwotCXByaXZhdGUgSUFDVEZSZXBvcnQgcmVwb3J0OwotCQkKLQlNZWRpYXRvckV2ZW50KE1lZGlhdG9yIHNvdXJjZSwgSU1vZGVsU2VydmljZUhvbGRlciBtb2RlbFNlcnZpY2VIb2xkZXIsIElBQ1RGUmVwb3J0R2VuZXJhdG9yIHZpZXcsIElBQ1RGUmVwb3J0IHJlcG9ydCkgewotCQlzdXBlcihzb3VyY2UpOwotCQl0aGlzLm1vZGVsU2VydmljZUhvbGRlciA9IG1vZGVsU2VydmljZUhvbGRlcjsKLQkJdGhpcy52aWV3ID0gdmlldzsKLQkJdGhpcy5yZXBvcnQgPSByZXBvcnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTW9kZWxTZXJ2aWNlSG9sZGVyIHRoYXQgaXMgcmVsYXRlZCB0byB0aGlzIGV2ZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIDxjb2RlPklNb2RlbFNlcnZpY2VIb2xkZXI8L2NvZGU+IHJlbGF0ZWQgdG8gdGhpcyBldmVudAotCSAqLwotCXB1YmxpYyBJTW9kZWxTZXJ2aWNlSG9sZGVyIGdldE1vZGVsU2VydmljZUhvbGRlcigpIHsKLQkJcmV0dXJuIG1vZGVsU2VydmljZUhvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBBQ1RGUmVwb3J0R2VuZXJhdG9yIHRoYXQgaXMgcmVsYXRlZCB0byB0aGlzIGV2ZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIDxjb2RlPklBQ1RGUmVwb3J0R2VuZXJhdG9yPC9jb2RlPiByZWxhdGVkIHRvIHRoaXMgZXZlbnQKLQkgKi8KLQlwdWJsaWMgSUFDVEZSZXBvcnRHZW5lcmF0b3IgZ2V0VmlldygpIHsKLQkJcmV0dXJuIHZpZXc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQUNURlJlcG9ydCB0aGF0IGlzIHJlbGF0ZWQgdG8gdGhpcyBldmVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5JQUNURlJlcG9ydDwvY29kZT4gcmVsYXRlZCB0byB0aGlzIGV2ZW50Ci0JICovCi0JcHVibGljIElBQ1RGUmVwb3J0IGdldFJlcG9ydCgpIHsKLQkJcmV0dXJuIHJlcG9ydDsKLQl9CQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MjRmNDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDc2MDUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEFDVEYgRG9tQnlDb20gRmxhc2ggRnJhZ21lbnQgKEluY3ViYXRpb24pCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbTtidW5kbGUtdmVyc2lvbj0iMC4wLjEiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaCwKLSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxZGJjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk2ODFlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGZyYWdtZW50LnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9mcmFnbWVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL2ZyYWdtZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjMDE5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL2ZyYWdtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08ZnJhZ21lbnQ+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZWxlbWVudEZhY3RvcnkiPgotICAgICAgPG9iamVjdEVsZW1lbnRGYWN0b3J5Ci0gICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnM9Im9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuZmxhc2guRmxhc2hFbGVtZW50RmFjdG9yeSI+Ci0gICAgICA8L29iamVjdEVsZW1lbnRGYWN0b3J5PgotICAgPC9leHRlbnNpb24+Ci0KLTwvZnJhZ21lbnQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2ZsYXNoL0ZsYXNoRWxlbWVudEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hFbGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzAzYmM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hFbGVtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5mbGFzaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklPYmplY3RFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSURpc3BhdGNoOwotCi1wdWJsaWMgY2xhc3MgRmxhc2hFbGVtZW50RmFjdG9yeSBpbXBsZW1lbnRzIElPYmplY3RFbGVtZW50RmFjdG9yeSB7Ci0KLQlwdWJsaWMgRmxhc2hFbGVtZW50RmFjdG9yeSgpIHsKLQl9Ci0JCi0JcHVibGljIE5vZGVJbXBsIGNyZWF0ZVRvcE5vZGUoTm9kZUltcGwgYmFzZSwgSURpc3BhdGNoIGlub2RlKSB7Ci0JCXJldHVybiBGbGFzaFRvcE5vZGVJbXBsLm5ld0ZsYXNoTm9kZShiYXNlLCBpbm9kZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaE1TQUFOb2RlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaE1TQUFOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGNkZDMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hNU0FBTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5mbGFzaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JRmxhc2hNU0FBTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JTm9kZUV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5odG1sLkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gudXRpbC5GbGFzaE1TQUFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5GbGFzaE1TQUFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLkZsYXNoTVNBQU9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JVW5rbm93bjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIubXNhYS5NU0FBOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0KLXB1YmxpYyBjbGFzcyBGbGFzaE1TQUFOb2RlSW1wbCBleHRlbmRzIEVsZW1lbnRJbXBsIGltcGxlbWVudHMgSUZsYXNoTVNBQU5vZGUgewotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0gICAgICAgIHJldHVybiBhT2JqZWN0LmdldEFjY0tleWJvYXJkU2hvcnRjdXQoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gdGhpcy5nZXRJRCgpOwotICAgICAgICBpZiAoaWQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotICAgICAgICByZXR1cm4gaWQuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBJRmxhc2hNU0FBTm9kZSkpCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG8pOwotICAgICAgICBJRmxhc2hNU0FBTm9kZSBtc2FhID0gKElGbGFzaE1TQUFOb2RlKSBvOwotICAgICAgICBTdHJpbmcgaWQxID0gdGhpcy5nZXRJRCgpOwotICAgICAgICBTdHJpbmcgaWQyID0gbXNhYS5nZXRJRCgpOwotICAgICAgICBpZiAoaWQxID09IG51bGwgfHwgaWQyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG8pOwotICAgICAgICByZXR1cm4gaWQxLmVxdWFscyhpZDIpOwotICAgIH0KLSAgIAotICAgIEZsYXNoTVNBQU9iamVjdCBhT2JqZWN0OwotICAgIAotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1RvcDsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIEZsYXNoTVNBQU5vZGVJbXBsIHRvcE5vZGU7Ci0KLSAgICBwcm90ZWN0ZWQgRWxlbWVudEltcGwgYmFzZTsKLQotICAgIHByaXZhdGUgTm9kZUltcGwgcGFyZW50OwotCi0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyOwotCi0gICAgcHJpdmF0ZSBGbGFzaE1TQUFOb2RlSW1wbChFbGVtZW50SW1wbCBpbXBsLCBJRGlzcGF0Y2ggaW5vZGUsIEZsYXNoTVNBQU9iamVjdCBhT2JqZWN0KSB7Ci0gICAgICAgIHN1cGVyKGltcGwsIGlub2RlKTsKLSAgICAgICAgdGhpcy5iYXNlID0gaW1wbDsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsOwotICAgICAgICB0aGlzLmFPYmplY3QgPSBzZWFyY2hGbGFzaChhT2JqZWN0KTsKLSAgICAgICAgdGhpcy50b3BOb2RlID0gdGhpczsKLSAgICAgICAgdGhpcy5pc1RvcCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGbGFzaE1TQUFPYmplY3Qgc2VhcmNoRmxhc2goRmxhc2hNU0FBT2JqZWN0IHRvcCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHNlYXJjaEZsYXNoKHRvcCwgMTAwKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGbGFzaE1TQUFPYmplY3Qgc2VhcmNoRmxhc2goRmxhc2hNU0FBT2JqZWN0IHRvcCwgaW50IG4pIHsKLSAgICAgICAgaWYgKHRvcCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIEZsYXNoTVNBQU9iamVjdFtdIGNoaWxkcmVuID0gdG9wLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGNoaWxkcmVuLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKEZsYXNoTVNBQVV0aWwuaXNGbGFzaChjaGlsZHJlbltpXSkpIHsKLSAgICAgICAgICAgICAgICBJRGlzcGF0Y2ggaHRtbEVsZW0gPSBGbGFzaE1TQUFVdGlsLmdldEh0bWxFbGVtZW50RnJvbU9iamVjdChjaGlsZHJlbltpXSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaHRtbEVsZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0VW5pcXVlSUQgPSAoU3RyaW5nKSBIZWxwZXIuZ2V0KGh0bWxFbGVtLCAidW5pcXVlSUQiKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG15VW5pcXVlSUQgPSAoU3RyaW5nKSBiYXNlLmdldFVuaXF1ZUlEKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChteVVuaXF1ZUlELmVxdWFscyh0YXJnZXRVbmlxdWVJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobiA+IDApIHsKLSAgICAgICAgICAgICAgICBGbGFzaE1TQUFPYmplY3QgaWFjYyA9IHNlYXJjaEZsYXNoKGNoaWxkcmVuW2ldLCBuIC0gMSk7Ci0gICAgICAgICAgICAgICAgaWYoaWFjYyAhPSBudWxsKQotCSAgICAgICAgICAgICAgICByZXR1cm4gaWFjYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZsYXNoTVNBQU5vZGVJbXBsKEVsZW1lbnRJbXBsIG1zYWFCYXNlLCBOb2RlSW1wbCBwYXJlbnQsIEZsYXNoTVNBQU5vZGVJbXBsIHRvcE5vZGUsIEZsYXNoTVNBQU9iamVjdCBhT2JqZWN0KSB7Ci0gICAgICAgIHN1cGVyKG1zYWFCYXNlLCBudWxsKTsKLSAgICAgICAgdGhpcy5iYXNlID0gbXNhYUJhc2U7Ci0gICAgICAgIHRoaXMuYU9iamVjdCA9IGFPYmplY3Q7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICB0aGlzLnRvcE5vZGUgPSB0b3BOb2RlOwotICAgICAgICB0aGlzLmlzVG9wID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGbGFzaE1TQUFOb2RlSW1wbCBuZXdNU0FBTm9kZShFbGVtZW50SW1wbCBpbXBsLCBJRGlzcGF0Y2ggaW5vZGUpIHsKLSAgICAJRmxhc2hNU0FBT2JqZWN0IGlhY2MgPSBGbGFzaE1TQUFPYmplY3RGYWN0b3J5LmdldEZsYXNoTVNBQU9iamVjdEZyb21FbGVtZW50KGlub2RlKTsKLSAgICAJCi0gICAgCWlmIChpYWNjICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZsYXNoTVNBQU5vZGVJbXBsIHJldCA9IG5ldyBGbGFzaE1TQUFOb2RlSW1wbChpbXBsLCBpbm9kZSwgaWFjYyk7Ci0gICAgICAgICAgICBpZiAocmV0LmFPYmplY3QgPT0gbnVsbCkKLSAgICAgICAgICAgIAlyZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgCX0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRIV05ERnJvbU9iamVjdChJVW5rbm93biB1bmtub3duKSB7Ci0gICAgCUZsYXNoTVNBQU9iamVjdCBpYWNjID0gRmxhc2hNU0FBT2JqZWN0RmFjdG9yeS5nZXRGbGFzaE1TQUFPYmplY3RGcm9tRWxlbWVudCh1bmtub3duKTsKLQotICAgIAlpZiAoaWFjYyA9PSBudWxsKQotICAgIAkJcmV0dXJuIDA7Ci0gICAgCQotICAgIAlyZXR1cm4gaWFjYy5nZXRXaW5kb3coKTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb2RlTGlzdEltcGwgaW1wbGVtZW50cyBOb2RlTGlzdCB7Ci0gICAgICAgIEFycmF5TGlzdDxOb2RlPiBsaXN0OwotCi0gICAgICAgIEZsYXNoTVNBQU5vZGVJbXBsIHBhcmVudDsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2hvd09mZnNjcmVlbiA9IHRydWU7Ci0KLSAgICAgICAgcHJpdmF0ZSBOb2RlTGlzdEltcGwoRmxhc2hNU0FBT2JqZWN0W10gYU9iamVjdHMsIEZsYXNoTVNBQU5vZGVJbXBsIHBhcmVudCwgYm9vbGVhbiBpc1RvcCwgaW50IHRvdGFsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFPYmplY3RzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFjY1N0YXRlID0gYU9iamVjdHNbaV0uZ2V0QWNjU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgRmxhc2hNU0FBTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgwID09IChhY2NTdGF0ZSAmIE1TQUEuU1RBVEVfSU5WSVNJQkxFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBGbGFzaE1TQUFOb2RlSW1wbChwYXJlbnQuYmFzZSwgcGFyZW50LCBwYXJlbnQudG9wTm9kZSwgYU9iamVjdHNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNob3dPZmZzY3JlZW4gJiYgMCAhPSAoYWNjU3RhdGUgJiBNU0FBLlNUQVRFX09GRlNDUkVFTikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgRmxhc2hNU0FBTm9kZUltcGwocGFyZW50LmJhc2UsIHBhcmVudCwgcGFyZW50LnRvcE5vZGUsIGFPYmplY3RzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2RlLm51bWJlciA9IHRvdGFsKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotICAgICAgICAgICAgcmV0dXJuIGxpc3Quc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBsaXN0LmdldChpbmRleCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGlua1VSSSgpIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRvQ2xpY2soKSB7Ci0gICAgICAgIHJldHVybiBhT2JqZWN0LmRvRGVmYXVsdEFjdGlvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotICAgICAgICBpZiAoYU9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVMaXN0SW1wbChuZXcgRmxhc2hNU0FBT2JqZWN0WzBdLCB0aGlzLCBpc1RvcCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoYU9iamVjdC5nZXRDaGlsZHJlbigpLCB0aGlzLCBpc1RvcCwgMCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLSAgICAgICAgaWYgKGFPYmplY3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGFPYmplY3QuZ2V0Q2hpbGRDb3VudCgpID4gMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkgewotICAgICAgICBOb2RlTGlzdCBsaXN0ID0gbmV3IE5vZGVMaXN0SW1wbChhT2JqZWN0LmdldENoaWxkcmVuKCksIHRoaXMsIGlzVG9wLCAwKTsKLSAgICAgICAgaWYgKGxpc3QuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgcmV0dXJuIGxpc3QuaXRlbSgwKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkgewotICAgICAgICBOb2RlTGlzdCBsaXN0ID0gbmV3IE5vZGVMaXN0SW1wbChhT2JqZWN0LmdldENoaWxkcmVuKCksIHRoaXMsIGlzVG9wLCAwKTsKLSAgICAgICAgaWYgKGxpc3QuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgcmV0dXJuIGxpc3QuaXRlbShsaXN0LmdldExlbmd0aCgpIC0gMSk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlIGdldE5leHRTaWJsaW5nKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGV4dHJhY3RTdHJpbmcoKSB7Ci0gICAgICAgIGlmIChhT2JqZWN0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgaW50IHIgPSBhT2JqZWN0LmdldEFjY1JvbGUoKTsKLSAgICAgICAgU3RyaW5nIGFjY05hbWUgPSBhT2JqZWN0LmdldEFjY05hbWUoKTsKLSAgICAgICAgaWYgKGFjY05hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIGFjY05hbWUgPSAiIjsKLQotICAgICAgICBpZiAociA9PSBNU0FBLlJPTEVfU1lTVEVNX1BVU0hCVVRUT04pIHsKLSAgICAgICAgICAgIGlmIChhY2NOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBhY2NOYW1lID0gIiIgKyBudW1iZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFjY05hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgcmV0dXJuIGFjY05hbWU7Ci0gICAgICAgIHJldHVybiBhY2NOYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRhZ05hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoaWdobGlnaHQoKSB7Ci0gICAgICAgIGFPYmplY3Quc2VsZWN0KE1TQUEuU0VMRkxBR19UQUtFRk9DVVMpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHNldEZvY3VzKCkgewotICAgICAgICBpZiAoYU9iamVjdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBhT2JqZWN0LnNlbGVjdChNU0FBLlNFTEZMQUdfVEFLRUZPQ1VTKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gdW5oaWdobGlnaHQoKSB7Ci0gICAgICAgIGlmIChhT2JqZWN0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGFPYmplY3Quc2VsZWN0KE1TQUEuU0VMRkxBR19SRU1PVkVTRUxFQ1RJT04pOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotICAgICAgICBpZiAoYU9iamVjdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICIiOwotLy8gICAgICAgIFN0cmluZyBpZCA9IGFPYmplY3QuZ2V0QWNjS2V5Ym9hcmRTaG9ydGN1dCgpOwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSUQgPSAiICsgaWQpOwotICAgICAgICAvLwotICAgICAgICBTdHJpbmcgcm9sZSA9IE1TQUEuZ2V0Um9sZVRleHQoYU9iamVjdC5nZXRBY2NSb2xlKCkpOwotICAgICAgICBTdHJpbmcgYWNjTmFtZSA9IGFPYmplY3QuZ2V0QWNjTmFtZSgpOwotICAgICAgICBpZiAoYWNjTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgYWNjTmFtZSA9ICIiOwotICAgICAgICAvL3JldHVybiBhT2JqZWN0LmdldEFjY0xvY2F0aW9uKCkgKyAiKCIgKyByb2xlICsgIikiICsgYWNjTmFtZTsKLSAgICAgICAgcmV0dXJuICIoIiArIHJvbGUgKyAiKSIgKyBhY2NOYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0gICAgICAgIC8vIHJldHVybiBGTEFTSF9OT0RFOwotICAgICAgICByZXR1cm4gTm9kZS5FTEVNRU5UX05PREU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFdpbmRvdygpIHsKLSAgICAgICAgcmV0dXJuIGFPYmplY3QuZ2V0V2luZG93KCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBYnN0cmFjdFRlcm1zIGdldFRlcm1zKCl7Ci0gICAgICAgIHJldHVybiBGbGFzaE1TQUFUZXJtcy5nZXRJbnN0YW5jZSgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElGbGFzaE1TQUFOb2RlIHNlYXJjaEJ5SURJbnRlcm5hbChTdHJpbmcgaWQpIHsKLSAgICAgICAgU3RyaW5nIHRhcmdldCA9IGFPYmplY3QuZ2V0QWNjS2V5Ym9hcmRTaG9ydGN1dCgpOwotICAgICAgICBpZiAoaWQuZXF1YWxzKHRhcmdldCkpIHJldHVybiB0aGlzOwotICAgICAgICBOb2RlTGlzdCBubCA9IGdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgaW50IGxlbiA9IG5sLmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBGbGFzaE1TQUFOb2RlSW1wbCBuID0gKEZsYXNoTVNBQU5vZGVJbXBsKSBubC5pdGVtKGkpOwotICAgICAgICAgICAgSUZsYXNoTVNBQU5vZGUgcmV0ID0gbi5zZWFyY2hCeUlESW50ZXJuYWwoaWQpOwotICAgICAgICAgICAgaWYgKHJldCAhPSBudWxsKSByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJRmxhc2hNU0FBTm9kZSBzZWFyY2hCeUlEKFN0cmluZyBpZCkgewotICAgICAgICByZXR1cm4gdG9wTm9kZS5zZWFyY2hCeUlESW50ZXJuYWwoaWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBJTm9kZUV4IGdldEJhc2VOb2RlKCkgewotICAgICAgICByZXR1cm4gYmFzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc2hvcnQgZ2V0SGVhZGluZ0xldmVsKCkgewotICAgICAgICBpZiAoaXNUb3ApCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SGVhZGluZ0xldmVsKCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBiYXNlLmdldExvY2F0aW9uKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaE1TQUFUZXJtcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaE1TQUFUZXJtcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDRmMzNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hNU0FBVGVybXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmZsYXNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5tc2FhLk1TQUE7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRmxhc2hNU0FBVGVybXMgZXh0ZW5kcyBBYnN0cmFjdFRlcm1zIHsKLSAgICBwcml2YXRlIHN0YXRpYyBGbGFzaE1TQUFUZXJtcyBpbnN0YW5jZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgRmxhc2hNU0FBVGVybXMgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBGbGFzaE1TQUFUZXJtcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NsaWNrYWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZsYXNoTVNBQU5vZGVJbXBsKSB7Ci0gICAgICAgICAgICBGbGFzaE1TQUFOb2RlSW1wbCBub2RlID0gKEZsYXNoTVNBQU5vZGVJbXBsKSB0YXJnZXQ7Ci0KLSAgICAgICAgICAgIGludCByb2xlID0gbm9kZS5hT2JqZWN0LmdldEFjY1JvbGUoKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJvbGUgPT0gTVNBQS5ST0xFX1NZU1RFTV9QVVNIQlVUVE9OIHx8IHJvbGUgPT0gTVNBQS5ST0xFX1NZU1RFTV9SQURJT0JVVFRPTgotICAgICAgICAgICAgICAgICAgICB8fCByb2xlID09IE1TQUEuUk9MRV9TWVNURU1fQ0hFQ0tCVVRUT04gfHwgcm9sZSA9PSBNU0FBLlJPTEVfU1lTVEVNX0xJTks7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWRPYmplY3QoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0YWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZsYXNoTVNBQU5vZGVJbXBsKSB7Ci0gICAgICAgICAgICBGbGFzaE1TQUFOb2RlSW1wbCBub2RlID0gKEZsYXNoTVNBQU5vZGVJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCByb2xlID0gbm9kZS5hT2JqZWN0LmdldEFjY1JvbGUoKTsKLSAgICAgICAgICAgIGludCBzdGF0ZSA9IG5vZGUuYU9iamVjdC5nZXRBY2NTdGF0ZSgpOwotCi0gICAgICAgICAgICByZXR1cm4gcm9sZSA9PSBNU0FBLlJPTEVfU1lTVEVNX1RFWFQgJiYgc3RhdGUgIT0gTVNBQS5TVEFURV9SRUFET05MWTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZE5vZGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZU5vZGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQnV0dG9uKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmxhc2hNU0FBTm9kZUltcGwpIHsKLSAgICAgICAgICAgIEZsYXNoTVNBQU5vZGVJbXBsIG5vZGUgPSAoRmxhc2hNU0FBTm9kZUltcGwpIHRhcmdldDsKLQotICAgICAgICAgICAgaW50IHJvbGUgPSBub2RlLmFPYmplY3QuZ2V0QWNjUm9sZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcm9sZSA9PSBNU0FBLlJPTEVfU1lTVEVNX1BVU0hCVVRUT047Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbHRlcmFibGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEZsYXNoTVNBQU5vZGVJbXBsKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIWlzQ2xpY2thYmxlKHRhcmdldCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgRmxhc2hNU0FBTm9kZUltcGwgbW4gPSAoRmxhc2hNU0FBTm9kZUltcGwpIHRhcmdldDsKLSAgICAgICAgU3RyaW5nIGlkID0gbW4uZ2V0SUQoKTsKLSAgICAgICAgaWYgKGlkID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGlkLmxlbmd0aCgpID09IDApIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaE5vZGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2ZsYXNoL0ZsYXNoTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFiZjIyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2ZsYXNoL0ZsYXNoTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuZmxhc2g7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLkFuYWx5emVkUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklGbGFzaE1TQUFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklGbGFzaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU5vZGVFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLkFTQWNjSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU0JyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JRmxhc2hDb25zdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuZG9tLkVtcHR5Tm9kZUxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guQ29tUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5rZXlob29rLklTZW5kRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi1jbGFzcyBGbGFzaE5vZGVJbXBsIGltcGxlbWVudHMgSUZsYXNoTm9kZSwgSUZsYXNoQ29uc3QgewotCS8vIGZpbmFsIEFTT2JqZWN0IG5vZGVBU09iajsKLQlwcml2YXRlIGZpbmFsIEFTQWNjSW5mbyBhY2NJbmZvOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHRhcmdldDsKLQlwcml2YXRlIGZpbmFsIElGbGFzaE5vZGUgcGFyZW50OwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNDaGlsZHJlbjsKLQlwcml2YXRlIEZsYXNoVG9wTm9kZUltcGwgc3dmOwotCXByaXZhdGUgRG9jdW1lbnRJbXBsIGRvYzsKLQotCXByaXZhdGUgZmluYWwgSUFTTm9kZSBmbGFzaE5vZGU7Ci0JcHJpdmF0ZSBmaW5hbCBJQVNCcmlkZ2UgZmxhc2hQbGF5ZXI7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXQuaW50ZXJuKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBGbGFzaE5vZGVJbXBsKSB7Ci0JCQlGbGFzaE5vZGVJbXBsIGYgPSAoRmxhc2hOb2RlSW1wbCkgbzsKLQkJCXJldHVybiBzd2YuZXF1YWxzKGYuc3dmKSAmJiB0aGlzLnRhcmdldC5lcXVhbHMoZi50YXJnZXQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIEZsYXNoTm9kZUltcGwoSUFTTm9kZSBub2RlLCBJRmxhc2hOb2RlIHBhcmVudCkgewotCQl0aGlzLmZsYXNoTm9kZSA9IG5vZGU7Ci0JCXRoaXMuZmxhc2hQbGF5ZXIgPSBub2RlLmdldFBsYXllcigpOwotCQl0aGlzLnRhcmdldCA9IG5vZGUuZ2V0VGFyZ2V0KCk7Ci0JCXRoaXMuYWNjSW5mbyA9IG5vZGUuZ2V0QWNjSW5mbygpOwotCQlpZiAobm9kZS5pc09wYXF1ZU9iamVjdCgpKSB7Ci0JCQl0aGlzLmhhc0NoaWxkcmVuID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmhhc0NoaWxkcmVuID0gdHJ1ZTsKLQkJfQotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlGbGFzaE5vZGVJbXBsKEZsYXNoTm9kZUltcGwgYmFzZU5vZGUsIElBU05vZGUgbm9kZSkgewotCQl0aGlzKG5vZGUsIGJhc2VOb2RlKTsKLQkJdGhpcy5zd2YgPSBiYXNlTm9kZS5zd2Y7Ci0JCXRoaXMuZG9jID0gYmFzZU5vZGUuZG9jOwotCX0KLQotCUZsYXNoTm9kZUltcGwoRmxhc2hUb3BOb2RlSW1wbCBiYXNlTm9kZSwgSUFTTm9kZSBub2RlKSB7Ci0JCXRoaXMobm9kZSwgYmFzZU5vZGUpOwotCQl0aGlzLnN3ZiA9IGJhc2VOb2RlOwotCQl0aGlzLmRvYyA9IChEb2N1bWVudEltcGwpIGJhc2VOb2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcCkgewotCQlyZXR1cm4gZmxhc2hQbGF5ZXIuZ2V0UHJvcGVydHkoZ2V0VGFyZ2V0KCksIHByb3ApOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcCwgT2JqZWN0IHZhbHVlKSB7Ci0JCWZsYXNoUGxheWVyLnNldFByb3BlcnR5KGdldFRhcmdldCgpLCBwcm9wLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVNlbmRFdmVudCBzZW5kRXZlbnQ7Ci0KLQlwcml2YXRlIElTZW5kRXZlbnQgZ2V0U2VuZEV2ZW50KCkgewotCQlpZiAoc2VuZEV2ZW50ID09IG51bGwpIHsKLQkJCXNlbmRFdmVudCA9IENvbVBsdWdpbi5nZXREZWZhdWx0KCkubmV3U2VuZEV2ZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHNlbmRFdmVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiNmbGFzaE5vZGU6IiArIGdldFRhcmdldCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQkvLyByZXR1cm4gRkxBU0hfTk9ERTsKLQkJcmV0dXJuIE5vZGUuRUxFTUVOVF9OT0RFOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgTm9kZUxpc3QgewotCQlwcml2YXRlIGZpbmFsIElGbGFzaE5vZGVbXSBub2RlczsKLQotCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBub2Rlcy5sZW5ndGgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIG5vZGVzW2luZGV4XTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIG5vZGVzLmxlbmd0aDsKLQkJfQotCi0JCU5vZGVMaXN0SW1wbChJRmxhc2hOb2RlW10gbm9kZXMpIHsKLQkJCXRoaXMubm9kZXMgPSBub2RlczsKLQkJfQotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQlpZiAoIWhhc0NoaWxkcmVuKQotCQkJcmV0dXJuIEVtcHR5Tm9kZUxpc3RJbXBsLmdldEluc3RhbmNlKCk7Ci0JCUlGbGFzaE5vZGVbXSByID0gZ2V0U1dGQ2hpbGROb2RlcygpOwotCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbChyKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlpZiAoIWhhc0NoaWxkcmVuKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlGbGFzaE5vZGVbXSByID0gZ2V0U1dGQ2hpbGROb2RlcygpOwotCQlpZiAociA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChyLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiByWzBdOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldExhc3RDaGlsZCgpIHsKLQkJaWYgKCFoYXNDaGlsZHJlbikKLQkJCXJldHVybiBudWxsOwotCQlJRmxhc2hOb2RlW10gciA9IGdldFNXRkNoaWxkTm9kZXMoKTsKLQkJaWYgKHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoci5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcltyLmxlbmd0aCAtIDFdOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0TmV4dFNpYmxpbmcoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JcHVibGljIE5vZGUgaW5zZXJ0QmVmb3JlKE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSByZXBsYWNlQ2hpbGQoTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBOb2RlIHJlbW92ZUNoaWxkKE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBhcHBlbmRDaGlsZChOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLQkJLy8gSUZsYXNoTm9kZVtdIHIgPSBnZXRJbm5lck5vZGVzKCk7Ci0JCWlmICghaGFzQ2hpbGRyZW4pCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlGbGFzaE5vZGVbXSByID0gZ2V0U1dGQ2hpbGROb2RlcygpOwotCQlpZiAociA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoci5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3JtYWxpemUoKSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWQoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0JCVN0cmluZyB0YXJnZXQgPSBnZXRUYXJnZXQoKTsKLQkJaW50IGlkeCA9IHRhcmdldC5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaWR4IDwgMCkKLQkJCXJldHVybiB0YXJnZXQ7Ci0JCXJldHVybiB0YXJnZXQuc3Vic3RyaW5nKGlkeCArIDEpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VVUkkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzaG9ydCBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbihOb2RlIG90aGVyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0Q29udGVudCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gZXh0cmFjdFN0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRDb250ZW50KFN0cmluZyB0ZXh0Q29udGVudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2FtZU5vZGUoTm9kZSBvdGhlcikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBsb29rdXBQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBsb29rdXBOYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWFsTm9kZShOb2RlIGFyZykgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHNldFVzZXJEYXRhKFN0cmluZyBrZXksIE9iamVjdCBkYXRhLCBVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFVzZXJEYXRhKFN0cmluZyBrZXkpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBJTm9kZUV4IGludGVyZmFjZQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIFN0cmluZyBkZWNvZGVTdHJpbmcoU3RyaW5nIGlucHV0KSB7Ci0JCWlmIChpbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuICIiOwotCQl0cnkgewotCQkJcmV0dXJuIFVSTERlY29kZXIuZGVjb2RlKGlucHV0LCAiVVRGLTgiKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGlucHV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdFN0cmluZygpIHsKLQkJU3RyaW5nIHIgPSBudWxsOwotCQlpZiAobnVsbCAhPSBhY2NJbmZvKSB7Ci0JCQlhY2NJbmZvLmdldE5hbWUoKTsKLQkJfQotCQlpZiAociA9PSBudWxsKSB7Ci0JCQlyID0gZmxhc2hOb2RlLmdldFRleHQoZmFsc2UpOwotCQl9Ci0JCWlmIChyID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ci0JCS8vIHJldHVybiBkZWNvZGVTdHJpbmcocik7Ci0JCXJldHVybiByOwotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXRIZWFkaW5nTGV2ZWwoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua1VSSSgpIHsKLQkJLy8gVE9ETwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldFByb3BlcnR5KEFTTk9ERV9URVhULCB0ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCU9iamVjdCBvID0gZ2V0UHJvcGVydHkoQVNOT0RFX1RFWFQpOwotCQlpZiAobyBpbnN0YW5jZW9mIFN0cmluZykKLQkJCXJldHVybiAoU3RyaW5nKSBvOwotCQlyZXR1cm4gIiI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRvSGFyZHdhcmVDbGljaygpIHsKLQkJbG9uZyBod25kID0gc3dmLmdldEhXTkQoKTsKLQkJaW50IGl4ID0gKGludCkgZmxhc2hOb2RlLmdldFgoKTsKLQkJaW50IGl5ID0gKGludCkgZmxhc2hOb2RlLmdldFkoKTsKLQkJaW50IGl3ID0gKGludCkgZmxhc2hOb2RlLmdldFdpZHRoKCk7Ci0JCWludCBpaCA9IChpbnQpIGZsYXNoTm9kZS5nZXRIZWlnaHQoKTsKLQkJaW50IHggPSBpeCArIGl3IC8gNDsKLQkJaW50IHkgPSBpeSArIGloIC8gNDsKLQotCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oIkNsaWNrIHRvOiIgKyB4ICsgIiwiICsgeSk7Ci0KLQkJLy8gZ2V0U2VuZEV2ZW50KCkucG9zdE1vdXNlKHgsIHksIGZhbHNlKTsKLQkJZ2V0U2VuZEV2ZW50KCkuZm9jdXNXaW5kb3coaHduZCk7Ci0JCXNldEZvY3VzKCk7Ci0JCWdldFNlbmRFdmVudCgpLnBvc3RNb3VzZSh4LCB5LCBmYWxzZSk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZ2V0U2VuZEV2ZW50KCkucG9zdE1vdXNlKHgsIHksIHRydWUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCVN0cmluZyBnZXRDbGlja2FibGVUYXJnZXQoU3RyaW5nIGN1cnJlbnQpIHsKLQkJd2hpbGUgKGN1cnJlbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgdHJ5T25SZWxlYXNlID0gY3VycmVudCArIFBBVEhfT05fUkVMRUFTRTsKLQkJCWlmIChzd2YuZ2V0Tm9kZUZyb21QYXRoKHRyeU9uUmVsZWFzZSkgIT0gbnVsbCkgewotCQkJCXJldHVybiBjdXJyZW50OwotCQkJfQotCQkJU3RyaW5nIHRyeU9uUHJlc3MgPSBjdXJyZW50ICsgUEFUSF9PTl9QUkVTUzsKLQkJCWlmIChzd2YuZ2V0Tm9kZUZyb21QYXRoKHRyeU9uUHJlc3MpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY3VycmVudDsKLQkJCX0KLQkJCWludCBpZHggPSBjdXJyZW50Lmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoaWR4IDw9IDApCi0JCQkJYnJlYWs7Ci0JCQljdXJyZW50ID0gY3VycmVudC5zdWJzdHJpbmcoMCwgaWR4KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkb0NsaWNrKCkgewotCQlTdHJpbmcgY3VycmVudCA9IGdldFRhcmdldCgpOwotCQl3aGlsZSAoY3VycmVudC5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyB0cnlPblJlbGVhc2UgPSBjdXJyZW50ICsgUEFUSF9PTl9SRUxFQVNFOwotCQkJaWYgKHN3Zi5nZXROb2RlRnJvbVBhdGgodHJ5T25SZWxlYXNlKSAhPSBudWxsKSB7Ci0JCQkJZmxhc2hQbGF5ZXIuY2FsbE1ldGhvZChmbGFzaE5vZGUsIE1fT05fUkVMRUFTRSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdHJ5T25QcmVzcyA9IGN1cnJlbnQgKyBQQVRIX09OX1BSRVNTOwotCQkJaWYgKHN3Zi5nZXROb2RlRnJvbVBhdGgodHJ5T25QcmVzcykgIT0gbnVsbCkgewotCQkJCWZsYXNoUGxheWVyLmNhbGxNZXRob2QoZmxhc2hOb2RlLCBNX09OX1BSRVNTKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmICh0cnVlKQotCQkJCWJyZWFrOwotCQkJaW50IGlkeCA9IGN1cnJlbnQubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmIChpZHggPD0gMCkKLQkJCQlicmVhazsKLQkJCWN1cnJlbnQgPSBjdXJyZW50LnN1YnN0cmluZygwLCBpZHgpOwotCQl9Ci0JCWlmIChkb0hhcmR3YXJlQ2xpY2soKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGlnaGxpZ2h0KCkgewotCQlmbGFzaFBsYXllci5jYWxsTWV0aG9kKGZsYXNoTm9kZSwgTV9PTl9ST0xMX09WRVIpOwotCQlib29sZWFuIHJldDEgPSBzd2YuaGlnaGxpZ2h0KCk7Ci0JCWJvb2xlYW4gcmV0MiA9IGZsYXNoTm9kZS5zZXRNYXJrZXIoKTsKLQkJcmV0dXJuIHJldDEgJiYgcmV0MjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1bmhpZ2hsaWdodCgpIHsKLQkJZmxhc2hQbGF5ZXIuY2FsbE1ldGhvZChmbGFzaE5vZGUsIE1fT05fUk9MTF9PVVQpOwotCQlib29sZWFuIHJldDEgPSBzd2YudW5oaWdobGlnaHQoKTsKLQkJYm9vbGVhbiByZXQyID0gZmxhc2hQbGF5ZXIudW5zZXRNYXJrZXIoKTsKLQkJcmV0dXJuIHJldDEgJiYgcmV0MjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXRGb2N1cygpIHsKLQkJaWYgKCFzd2Yuc2V0Rm9jdXMoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGZsYXNoUGxheWVyLnNldEZvY3VzKGdldFRhcmdldCgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE50aCgpIHsKLQkJLy8gVE9ETyEKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBJRmxhc2hOb2RlIGludGVyZmFjZQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQlwdWJsaWMgSUZsYXNoTm9kZSBnZXROb2RlRnJvbVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIHN3Zi5nZXROb2RlRnJvbVBhdGgocGF0aCk7Ci0JfQotCi0JcHVibGljIElGbGFzaE5vZGUgZ2V0Tm9kZUF0RGVwdGgoaW50IGRlcHRoKSB7Ci0JCUlBU05vZGUgcmVzdWx0ID0gZmxhc2hQbGF5ZXIuZ2V0Tm9kZUF0RGVwdGhXaXRoUGF0aChnZXRUYXJnZXQoKSwgZGVwdGgpOwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBGbGFzaE5vZGVJbXBsKHN3ZiwgcmVzdWx0KTsKLQl9Ci0KLQlwcml2YXRlIElGbGFzaE5vZGVbXSBjcmVhdGVJRmxhc2hOb2RlQXJyYXkoSUFTTm9kZVtdIG5vZGVzKSB7Ci0JCUlGbGFzaE5vZGVbXSByZXN1bHRzID0gbmV3IElGbGFzaE5vZGVbbm9kZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0c1tpXSA9IG5ldyBGbGFzaE5vZGVJbXBsKHRoaXMsIG5vZGVzW2ldKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQlwdWJsaWMgSUZsYXNoTm9kZVtdIGdldElubmVyTm9kZXMoKSB7Ci0JCXJldHVybiBjcmVhdGVJRmxhc2hOb2RlQXJyYXkoZmxhc2hOb2RlLmdldENoaWxkcmVuKHRydWUpKTsKLQl9Ci0KLQlwdWJsaWMgSUZsYXNoTm9kZVtdIGdldFNXRkNoaWxkTm9kZXMoKSB7Ci0JCXJldHVybiBjcmVhdGVJRmxhc2hOb2RlQXJyYXkoZmxhc2hOb2RlLmdldENoaWxkcmVuKGZhbHNlKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZXB0aCgpIHsKLQkJcmV0dXJuIGZsYXNoTm9kZS5nZXREZXB0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q3VycmVudEZyYW1lKCkgewotCQlyZXR1cm4gZmxhc2hOb2RlLmdldEN1cnJlbnRGcmFtZSgpOwotCX0KLQotCXB1YmxpYyBJRmxhc2hOb2RlW10gdHJhbnNsYXRlKCkgewotCQlyZXR1cm4gY3JlYXRlSUZsYXNoTm9kZUFycmF5KGZsYXNoUGxheWVyLnRyYW5zbGF0ZVdpdGhQYXRoKGdldFRhcmdldCgpKSk7Ci0JfQotCi0JcHVibGljIElOb2RlRXggZ2V0QmFzZU5vZGUoKSB7Ci0JCXJldHVybiBzd2Y7Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBleHRlbnNpb25zLgotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQlib29sZWFuIGlzSW5wdXRhYmxlKCkgewotCQlyZXR1cm4gZmxhc2hOb2RlLmlzSW5wdXRhYmxlKCk7Ci0JfQotCi0JYm9vbGVhbiBpc1NpbGVudCgpIHsKLQkJcmV0dXJuIGFjY0luZm8uaXNTaWxlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgQW5hbHl6ZWRSZXN1bHQgYW5hbHl6ZShBbmFseXplZFJlc3VsdCBhcikgewotCQlyZXR1cm4gYXI7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0VGVybXMgZ2V0VGVybXMoKSB7Ci0JCXJldHVybiBGbGFzaFRlcm1zLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIFJlY3RhbmdsZSBnZXRMb2NhdGlvbigpIHsKLQkJLy8gVE9ETwotCQlyZXR1cm4gc3dmLmdldExvY2F0aW9uKCk7Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBEdW1teQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JcHVibGljIElGbGFzaE1TQUFOb2RlIGdldE1TQUEoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGFpckZsYXNoKCkgewotCX0KLQotCS8vICFGTiEKLQlwdWJsaWMgU3RyaW5nW10gZ2V0U3RpbGxQaWN0dXJlRGF0YSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbM107Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0QWNjZXNzS2V5KCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hTb3VuZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hTb3VuZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkMmNiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2ZsYXNoL0ZsYXNoU291bmRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuZmxhc2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JTm9kZUV4U291bmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUZsYXNoQ29uc3Q7Ci0KLWNsYXNzIEZsYXNoU291bmRJbXBsIGltcGxlbWVudHMgSU5vZGVFeFNvdW5kLCBJRmxhc2hDb25zdCB7Ci0KLQlwcml2YXRlIGludCB2b2xCZWZvcmVNdXRlZCA9IC0xOwotCXByaXZhdGUgZmluYWwgSUFTQnJpZGdlIHBsYXllcjsKLQlwcml2YXRlIGZpbmFsIElBU05vZGUgdGFyZ2V0OwotCi0JRmxhc2hTb3VuZEltcGwoSUFTTm9kZSBub2RlKSB7Ci0JCXRoaXMudGFyZ2V0ID0gbm9kZTsKLQkJdGhpcy5wbGF5ZXIgPSBub2RlLmdldFBsYXllcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG11dGVNZWRpYShib29sZWFuIGZsYWcpIHsKLQkJaWYgKGZsYWcpIHsKLQkJCWlmICh2b2xCZWZvcmVNdXRlZCA8IDApIHsKLQkJCQl2b2xCZWZvcmVNdXRlZCA9IGdldFZvbHVtZSgpOwotCQkJCXJldHVybiBzZXRWb2x1bWUoMCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodm9sQmVmb3JlTXV0ZWQgPj0gMCkgewotCQkJCWJvb2xlYW4gc3VjY2VzcyA9IHNldFZvbHVtZSh2b2xCZWZvcmVNdXRlZCk7Ci0JCQkJdm9sQmVmb3JlTXV0ZWQgPSAtMTsKLQkJCQlyZXR1cm4gc3VjY2VzczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsKLQkJT2JqZWN0IG8gPSBwbGF5ZXIuY2FsbE1ldGhvZCh0YXJnZXQsIE1fR0VUX1ZPTFVNRSk7Ci0JCWlmIChvIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0JCQlyZXR1cm4gKChEb3VibGUpIG8pLmludFZhbHVlKCkgKiAxMDsKLQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJcmV0dXJuICgoSW50ZWdlcikgbykuaW50VmFsdWUoKSAqIDEwOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXRWb2x1bWUoaW50IHZhbCkgewotCQl2YWwgPSB2YWwgLyAxMDsKLQkJcGxheWVyLmNhbGxNZXRob2QodGFyZ2V0LCBNX1NFVF9WT0xVTUUsIG5ldyBPYmplY3RbXSB7IEludGVnZXIKLQkJCQkudmFsdWVPZih2YWwpIH0pOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRNdXRlU3RhdGUoKSB7Ci0JCWlmICh2b2xCZWZvcmVNdXRlZCA8IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hUZXJtcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaFRlcm1zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OWFlZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaFRlcm1zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5mbGFzaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuaHRtbC5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmh0bWwuSFRNTFRlcm1zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgRmxhc2hUZXJtcyBleHRlbmRzIEFic3RyYWN0VGVybXMgewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWx0ZXJhYmxlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gaXNDbGlja2FibGUodGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBGbGFzaFRlcm1zIGluc3RhbmNlOwotCi0gICAgcHVibGljIHN0YXRpYyBGbGFzaFRlcm1zIGdldEluc3RhbmNlKCkgewotICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgRmxhc2hUZXJtcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkTm9kZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlTm9kZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZsYXNoTm9kZUltcGwpIHsKLSAgICAgICAgICAgIEZsYXNoTm9kZUltcGwgZmxhc2ggPSAoRmxhc2hOb2RlSW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgcmV0dXJuICEoZmxhc2guaXNTaWxlbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbnB1dGFibGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGbGFzaE5vZGVJbXBsKSB7Ci0gICAgICAgICAgICBGbGFzaE5vZGVJbXBsIGZsYXNoID0gKEZsYXNoTm9kZUltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIHJldHVybiBmbGFzaC5pc0lucHV0YWJsZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NsaWNrYWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZsYXNoTm9kZUltcGwpIHsKLSAgICAgICAgICAgIEZsYXNoTm9kZUltcGwgZmxhc2ggPSAoRmxhc2hOb2RlSW1wbCkgdGFyZ2V0OwotCi0gICAgICAgICAgICBTdHJpbmcgY2xpY2thYmxlVGFyZ2V0ID0gZmxhc2guZ2V0Q2xpY2thYmxlVGFyZ2V0KGZsYXNoLmdldFRhcmdldCgpKTsKLSAgICAgICAgICAgIGlmIChjbGlja2FibGVUYXJnZXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0J1dHRvbihJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZsYXNoTm9kZUltcGwpIHsKLSAgICAgICAgICAgIEZsYXNoTm9kZUltcGwgZmxhc2ggPSAoRmxhc2hOb2RlSW1wbCkgdGFyZ2V0OwotCi0gICAgICAgICAgICBTdHJpbmcgY2xpY2thYmxlVGFyZ2V0ID0gZmxhc2guZ2V0Q2xpY2thYmxlVGFyZ2V0KGZsYXNoLmdldFRhcmdldCgpKTsKLSAgICAgICAgICAgIGlmIChjbGlja2FibGVUYXJnZXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZsYXNoVG9wTm9kZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZsYXNoVG9wTm9kZUltcGwpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc01TQUFGbGFzaChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZsYXNoVG9wTm9kZUltcGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEZsYXNoVG9wTm9kZUltcGwpIHRhcmdldCkuZ2V0TVNBQSgpICE9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWRPYmplY3QoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoIkVNQkVEIi5lcXVhbHMobmFtZSkgfHwgIk9CSkVDVCIuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc0tleShjaGFyIGtleSwgSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGbGFzaFRvcE5vZGVJbXBsKQotICAgICAgICAgICAgcmV0dXJuIEhUTUxUZXJtcy5nZXRJbnN0YW5jZSgpLmlzQWNjZXNzS2V5KGtleSwgdGFyZ2V0KTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmlzQWNjZXNzS2V5KGtleSwgdGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2NrSnVtcFBvaW50QihJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZsYXNoVG9wTm9kZUltcGwpCi0gICAgICAgICAgICByZXR1cm4gSFRNTFRlcm1zLmdldEluc3RhbmNlKCkuaXNCbG9ja0p1bXBQb2ludEIodGFyZ2V0KTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmlzQmxvY2tKdW1wUG9pbnRCKHRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNCbG9ja0p1bXBQb2ludEYoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBGbGFzaFRvcE5vZGVJbXBsKQotICAgICAgICAgICAgcmV0dXJuIEhUTUxUZXJtcy5nZXRJbnN0YW5jZSgpLmlzQmxvY2tKdW1wUG9pbnRGKHRhcmdldCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5pc0Jsb2NrSnVtcFBvaW50Rih0YXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzSGVhZGluZyhpbnQgbGV2ZWwsIElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmxhc2hUb3BOb2RlSW1wbCkKLSAgICAgICAgICAgIHJldHVybiBIVE1MVGVybXMuZ2V0SW5zdGFuY2UoKS5pc0hlYWRpbmcobGV2ZWwsIHRhcmdldCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5pc0hlYWRpbmcobGV2ZWwsIHRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNIZWFkaW5nSnVtcFBvaW50KElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmxhc2hUb3BOb2RlSW1wbCkKLSAgICAgICAgICAgIHJldHVybiBIVE1MVGVybXMuZ2V0SW5zdGFuY2UoKS5pc0hlYWRpbmdKdW1wUG9pbnQodGFyZ2V0KTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmlzSGVhZGluZ0p1bXBQb2ludCh0YXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG5vZGVMb2NhdGlvbihOb2RlIHJlZk5vZGUsIGJvb2xlYW4gYmFja3dhcmQsIElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRmxhc2hUb3BOb2RlSW1wbCkKLSAgICAgICAgICAgIHJldHVybiBIVE1MVGVybXMuZ2V0SW5zdGFuY2UoKS5ub2RlTG9jYXRpb24ocmVmTm9kZSwgYmFja3dhcmQsIHRhcmdldCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5ub2RlTG9jYXRpb24ocmVmTm9kZSwgYmFja3dhcmQsIHRhcmdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNNZWRpYShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEZsYXNoVG9wTm9kZUltcGwpIHsKLSAgICAgICAgICAgIEZsYXNoVG9wTm9kZUltcGwgc3dmID0gKEZsYXNoVG9wTm9kZUltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIHJldHVybiBzd2YuaGFzTWVkaWEoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5pc01lZGlhKHRhcmdldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250ZW50KElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoaXNGbGFzaFRvcE5vZGUodGFyZ2V0KSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChpc0lucHV0YWJsZSh0YXJnZXQpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKGlzTGlzdFRvcCh0YXJnZXQpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc0NvbnRlbnQodGFyZ2V0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2ZsYXNoL0ZsYXNoVG9wTm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hUb3BOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWNjNTk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hUb3BOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5mbGFzaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5BbmFseXplZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JRmxhc2hNU0FBTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JRmxhc2hOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklOb2RlRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU5vZGVFeFNvdW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklOb2RlRXhWaWRlbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkxpc3ROb2RlTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmh0bWwuRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5GbGFzaFBsYXllckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUZsYXNoQ29uc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JRmxhc2hQbGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotY2xhc3MgRmxhc2hUb3BOb2RlSW1wbCBleHRlbmRzIEVsZW1lbnRJbXBsIGltcGxlbWVudHMgSUZsYXNoTm9kZSwgSUZsYXNoQ29uc3QgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMU0lEID0gIkNMU0lEOkQyN0NEQjZFLUFFNkQtMTFDRi05NkI4LTQ0NDU1MzU0MDAwMCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9UWVBFID0gImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGbGFzaE5vZGVbXSBlbXB0eVJlc3VsdCA9IG5ldyBJRmxhc2hOb2RlWzBdOwotCi0JcHJpdmF0ZSBGbGFzaE1TQUFOb2RlSW1wbCBjYWNoZWRNU0FBOwotCi0JcHJpdmF0ZSBJRmxhc2hQbGF5ZXIgZmxhc2hQbGF5ZXI7Ci0KLQlzdGF0aWMgRmxhc2hUb3BOb2RlSW1wbCBuZXdGbGFzaE5vZGUoTm9kZUltcGwgYmFzZU5vZGUsIElEaXNwYXRjaCBpbm9kZSkgewotCQlTdHJpbmcgY2xzaWQgPSAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCAiY2xhc3NpZCIpOwotCQlpZiAoQ0xTSUQuZXF1YWxzSWdub3JlQ2FzZShjbHNpZCkpIHsKLQkJCXJldHVybiBuZXcgRmxhc2hUb3BOb2RlSW1wbChiYXNlTm9kZSwgaW5vZGUpOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gKFN0cmluZykgSGVscGVyLmdldCgoSURpc3BhdGNoKSBpbm9kZS5pbnZva2UxKAotCQkJCSJnZXRBdHRyaWJ1dGVOb2RlIiwgInR5cGUiKSwgInZhbHVlIik7Ci0JCWlmIChBUFBfVFlQRS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7Ci0JCQlyZXR1cm4gbmV3IEZsYXNoVG9wTm9kZUltcGwoYmFzZU5vZGUsIGlub2RlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEZsYXNoVG9wTm9kZUltcGwoTm9kZUltcGwgYmFzZU5vZGUsIElEaXNwYXRjaCBpZGlzcCkgewotCQlzdXBlcihiYXNlTm9kZSwgaWRpc3ApOwotCi0JCWZsYXNoUGxheWVyID0gRmxhc2hQbGF5ZXJGYWN0b3J5LmdldFBsYXllckZyb21JRHNpcGF0Y2goaWRpc3ApOwotCi0JfQotCi0JcHJpdmF0ZSBJTm9kZUV4VmlkZW9bXSBzZWFyY2hWaWRlbygpIHsKLQkJSUFTTm9kZVtdIHZpZGVvcyA9IGZsYXNoUGxheWVyLnNlYXJjaFZpZGVvKCk7Ci0JCWludCBsZW4gPSB2aWRlb3MubGVuZ3RoOwotCQlJTm9kZUV4VmlkZW9bXSByZXN1bHQgPSBuZXcgSU5vZGVFeFZpZGVvW2xlbl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCS8vIFN5c3RlbS5lcnIucHJpbnRsbigiU1ZPOiIgKyB2aWRlb3NbaV0pOwotCQkJcmVzdWx0W2ldID0gbmV3IEZsYXNoVmlkZW9JbXBsKHRoaXMsIHZpZGVvc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElOb2RlRXhTb3VuZFtdIHNlYXJjaFNvdW5kKCkgewotCQlJQVNOb2RlW10gc291bmRzID0gZmxhc2hQbGF5ZXIuc2VhcmNoU291bmQoKTsKLQkJaW50IGxlbiA9IHNvdW5kcy5sZW5ndGg7Ci0JCUlOb2RlRXhTb3VuZFtdIHJlc3VsdCA9IG5ldyBJTm9kZUV4U291bmRbbGVuXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJcmVzdWx0W2ldID0gbmV3IEZsYXNoU291bmRJbXBsKHNvdW5kc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCXB1YmxpYyBJRmxhc2hOb2RlIGdldE5vZGVGcm9tUGF0aChTdHJpbmcgcGF0aCkgewotCQlJQVNOb2RlIG5vZGUgPSBmbGFzaFBsYXllci5nZXROb2RlRnJvbVBhdGgocGF0aCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBGbGFzaE5vZGVJbXBsKHRoaXMsIG5vZGUpOwotCX0KLQotCXB1YmxpYyBJRmxhc2hOb2RlIGdldE5vZGVBdERlcHRoKGludCBkZXB0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUZsYXNoTm9kZVtdIGdldElubmVyTm9kZXMoKSB7Ci0JCXJldHVybiBlbXB0eVJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElGbGFzaE5vZGVbXSBjcmVhdGVJRmxhc2hOb2RlQXJyYXkoSUFTTm9kZVtdIG5vZGVzKSB7Ci0JCUlGbGFzaE5vZGVbXSByZXN1bHRzID0gbmV3IElGbGFzaE5vZGVbbm9kZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0c1tpXSA9IG5ldyBGbGFzaE5vZGVJbXBsKHRoaXMsIG5vZGVzW2ldKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQlwdWJsaWMgSUZsYXNoTm9kZVtdIHRyYW5zbGF0ZSgpIHsKLQkJcmV0dXJuIGNyZWF0ZUlGbGFzaE5vZGVBcnJheShmbGFzaFBsYXllcgotCQkJCS50cmFuc2xhdGVXaXRoUGF0aChQQVRIX1JPT1RMRVZFTCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVwdGgoKSB7Ci0JCXJldHVybiBJTlZBTElEX0RFUFRIOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q3VycmVudEZyYW1lKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIElOb2RlRXggZ2V0QmFzZU5vZGUoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gTm9kZSBPdmVycmlkaW5nIEltcGwuCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0JCS8vU3lzdGVtLmVyci5wcmludGxuKCJpbnZhbGlkKGdldEZpcnN0Q2hpbGQpLiIpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCS8vU3lzdGVtLmVyci5wcmludGxuKCJpbnZhbGlkKGdldExhc3RDaGlsZCkuIik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQlMaXN0PE5vZGU+IGwgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KDMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJU3RyaW5nIGxldmVseE5hbWUgPSAiX2xldmVsIiArIGk7Ci0JCQlJRmxhc2hOb2RlIGxldmVseCA9IGdldE5vZGVGcm9tUGF0aChsZXZlbHhOYW1lKTsKLQkJCWlmIChsZXZlbHggIT0gbnVsbCkgewotCQkJCS8vIFN5c3RlbS5lcnIucHJpbnRsbihsZXZlbHhOYW1lICsgIiBpcyBmb3VuZC4iKTsKLQkJCQlsLmFkZChsZXZlbHgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ldyBMaXN0Tm9kZUxpc3RJbXBsKGwpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNZWRpYSA9IGZhbHNlOwotCi0JYm9vbGVhbiBoYXNNZWRpYSgpIHsKLQkJcmV0dXJuIGhhc01lZGlhOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBBbmFseXplZFJlc3VsdCBhbmFseXplKEFuYWx5emVkUmVzdWx0IGFyKSB7Ci0JCUlOb2RlRXhWaWRlb1tdIHZpZGVvcyA9IHNlYXJjaFZpZGVvKCk7Ci0JCWlmICh2aWRlb3MubGVuZ3RoID4gMCkgewotCQkJaGFzTWVkaWEgPSB0cnVlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2aWRlb3MubGVuZ3RoOyBpKyspIHsKLQkJCQlhci5hZGRWaWRlbyh2aWRlb3NbaV0pOwotCQkJfQotCQl9Ci0JCUlOb2RlRXhTb3VuZFtdIHNvdW5kcyA9IHNlYXJjaFNvdW5kKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc291bmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhci5hZGRTb3VuZChzb3VuZHNbaV0pOwotCQl9Ci0JCWFyLmFkZEZsYXNoVG9wTm9kZSh0aGlzKTsKLQkJcmV0dXJuIGFyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGFpckZsYXNoKCkgewotCQlmbGFzaFBsYXllci5yZXBhaXJGbGFzaCgpOwotCX0KLQotCXB1YmxpYyBJRmxhc2hNU0FBTm9kZSBnZXRNU0FBKCkgewotCQlpZiAoY2FjaGVkTVNBQSA9PSBudWxsKQotCQkJY2FjaGVkTVNBQSA9IEZsYXNoTVNBQU5vZGVJbXBsLm5ld01TQUFOb2RlKHRoaXMsIGlub2RlKTsKLQkJaWYgKChjYWNoZWRNU0FBID09IG51bGwpIHx8IChjYWNoZWRNU0FBLmdldFdpbmRvdygpID09IDApKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIHJlcGFpckZsYXNoKCk7Ci0JCXVwZGF0ZVRhcmdldCgpOwotCQlyZXR1cm4gY2FjaGVkTVNBQTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRIV05EKCkgewotCQlyZXR1cm4gRmxhc2hNU0FBTm9kZUltcGwuZ2V0SFdOREZyb21PYmplY3Qoc3VwZXIuZ2V0SU5vZGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0VGVybXMgZ2V0VGVybXMoKSB7Ci0JCXJldHVybiBGbGFzaFRlcm1zLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLy8gVE9ETy4uLgotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVkVGFyZ2V0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVUYXJnZXQoKSB7Ci0JCWlmICh1cGRhdGVkVGFyZ2V0KQotCQkJcmV0dXJuOwotCQl1cGRhdGVkVGFyZ2V0ID0gZmxhc2hQbGF5ZXIudXBkYXRlVGFyZ2V0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaFZpZGVvSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9mbGFzaC9GbGFzaFZpZGVvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGUzNDdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvZmxhc2gvRmxhc2hWaWRlb0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5mbGFzaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklOb2RlRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU5vZGVFeFZpZGVvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklGbGFzaENvbnN0OwotCi1jbGFzcyBGbGFzaFZpZGVvSW1wbCBpbXBsZW1lbnRzIElOb2RlRXhWaWRlbywgSUZsYXNoQ29uc3QgewotCXByaXZhdGUgZmluYWwgRmxhc2hUb3BOb2RlSW1wbCBzd2Y7Ci0JcHJpdmF0ZSBmaW5hbCBJQVNOb2RlIHRhcmdldDsKLQlwcml2YXRlIGZpbmFsIElBU0JyaWRnZSBwbGF5ZXI7Ci0JLy8gU29tZSBzb3J0IG9mIGhhY2tpbmcgc29sdXRpb24hISEKLQlwcml2YXRlIFZpZGVvU3RhdGUgY3VycmVudFN0YXRlID0gVmlkZW9TdGF0ZS5TVEFURV9VTktOT1dOOwotCi0JLy8gcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7Ci0JLy8gcmV0dXJuIHRhcmdldC5nZXRUYXJnZXQoKTsKLQkvLyB9Ci0KLQlGbGFzaFZpZGVvSW1wbChGbGFzaFRvcE5vZGVJbXBsIHN3ZiwgSUFTTm9kZSBub2RlKSB7Ci0JCXRoaXMuc3dmID0gc3dmOwotCQl0aGlzLnRhcmdldCA9IG5vZGU7Ci0JCXRoaXMucGxheWVyID0gbm9kZS5nZXRQbGF5ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcmV2aW91c1RyYWNrKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmV4dFRyYWNrKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3RvcE1lZGlhKCkgewotCQlwbGF5ZXIuY2FsbE1ldGhvZCh0YXJnZXQsIE1fU1RPUCk7Ci0JCWN1cnJlbnRTdGF0ZSA9IFZpZGVvU3RhdGUuU1RBVEVfU1RPUDsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGxheU1lZGlhKCkgewotCQlwbGF5ZXIuY2FsbE1ldGhvZCh0YXJnZXQsIE1fUExBWSk7Ci0JCWN1cnJlbnRTdGF0ZSA9IFZpZGVvU3RhdGUuU1RBVEVfUExBWTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGF1c2VNZWRpYSgpIHsKLQkJcGxheWVyLmNhbGxNZXRob2QodGFyZ2V0LCBNX1BBVVNFKTsKLQkJY3VycmVudFN0YXRlID0gVmlkZW9TdGF0ZS5TVEFURV9QQVVTRTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZmFzdFJldmVyc2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBmYXN0Rm9yd2FyZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBkb3VibGUgZ2V0Q3VycmVudFBvc2l0aW9uKCkgewotCQlPYmplY3QgbyA9IHBsYXllci5jYWxsTWV0aG9kKHRhcmdldCwgTV9HRVRfQ1VSUkVOVF9QT1NJVElPTik7Ci0JCWlmIChvIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0JCQlyZXR1cm4gKChEb3VibGUpIG8pLmRvdWJsZVZhbHVlKCk7Ci0JCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEZsb2F0KSB7Ci0JCQlyZXR1cm4gKChGbG9hdCkgbykuZmxvYXRWYWx1ZSgpOwotCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQlyZXR1cm4gKChJbnRlZ2VyKSBvKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBkb3VibGUgZ2V0VG90YWxMZW5ndGgoKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgVmlkZW9TdGF0ZSBnZXRDdXJyZW50U3RhdGUoKSB7Ci0JCS8vIFRPRE8KLQkJcmV0dXJuIGN1cnJlbnRTdGF0ZTsKLQl9Ci0KLQlwdWJsaWMgSU5vZGVFeCBnZXRSZWZlcmVuY2VOb2RlKCkgewotCQkvLyBSZXR1cm5zIHRoZSB0b3Agbm9kZSAobWF5YmUgYSBtYWtlc2hpZnQpLgotCQlyZXR1cm4gc3dmOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1NmMxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb208L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNTk4YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVjbGlwc2UgQUNURiBEb21CeUNvbSBQbHVnLWluIChJbmN1YmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb207c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5Eb21ieWNvbVBsdWdpbgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5zd3QsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmFjdGYuY29yZSwKLSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIsCi0gb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbQotQnVuZGxlLUNsYXNzUGF0aDogYmluLywKLSBydW50aW1lcy9kb21ieWNvbS5qYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxZGJjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhOGM4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBydW50aW1lcy9kb21ieWNvbS5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbAotc291cmNlLnJ1bnRpbWVzL2RvbWJ5Y29tLmphciA9IHNyYy8KLW91dHB1dC5ydW50aW1lcy9kb21ieWNvbS5qYXIgPSBiaW4vCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBydW50aW1lcy9kb21ieWNvbS5qYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzYWE0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZWxlbWVudEZhY3RvcnkiIG5hbWU9ImVsZW1lbnRGYWN0b3J5IiBzY2hlbWE9InNjaGVtYS9lbGVtZW50RmFjdG9yeS5leHNkIi8+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zY2hlbWEvZWxlbWVudEZhY3RvcnkuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc2NoZW1hL2VsZW1lbnRGYWN0b3J5LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjQ2YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zY2hlbWEvZWxlbWVudEZhY3RvcnkuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20iIGlkPSJlbGVtZW50RmFjdG9yeSIgbmFtZT0iRWxlbWVudCBGYWN0b3J5Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gYWRkIEVsZW1lbnQgRmFjdG9yaWVzIHRvIHRoaXMgKERPTSBieSBDT00pIHBsdWdpbi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ib2JqZWN0RWxlbWVudEZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im9iamVjdEVsZW1lbnRGYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW1wbGVtZW50YXRpb25zIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklPYmplY3RFbGVtZW50RmFjdG9yeSZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU9iamVjdEVsZW1lbnRGYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gZXh0ZW5zaW9uIGRlZmluaXRpb246Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZWxlbWVudEZhY3RvcnkmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7b2JqZWN0RWxlbWVudEZhY3RvcnkKLSAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucz0mcXVvdDtvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmZsYXNoLkZsYXNoRWxlbWVudEZhY3RvcnkmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L29iamVjdEVsZW1lbnRGYWN0b3J5Jmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgY29udHJpYnV0b3Igd2lsbCBhZGQgbmV3IEVsZW1lbnQgZmFjdG9yeSBmb3IgT2JqZWN0IEVsZW1lbnRzIGJ5IHVzaW5nICZsdDtzYW1wJmd0O29iamVjdEVsZW1lbnRGYWN0b3J5Jmx0Oy9zYW1wJmd0Oy4gJmx0O3NhbXAmZ3Q7aW1wbGVtZW50YXRpb25zJmx0Oy9zYW1wJmd0OyBpcyByZXF1aXJlZCBhdHRyaWJ1dGUgZm9yICZsdDtzYW1wJmd0O29iamVjdEVsZW1lbnRGYWN0b3J5Jmx0Oy9zYW1wJmd0OywgYW5kIHRoZSBzcGVjaWZpZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU9iamVjdEVsZW1lbnRGYWN0b3J5Jmx0Oy9zYW1wJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQUNURiBwcm92aWRlcyBhICZsdDtzYW1wJmd0O0ZsYXNoRWxlbWVudEZhY3RvcnkmbHQ7L3NhbXAmZ3Q7LiBJdCBwcm92aWRlcyBhbiBFbGVtZW50IGltcGxlbWVudGF0aW9uIHRoYXQgZW5hYmxlcyB0byBhY2Nlc3MgT2JqZWN0IE1vZGVsIG9mIEZsYXNoIGNvbnRlbnQuIFBsZWFzZSBzZWUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uZmxhc2gmbHQ7L3NhbXAmZ3Q7IHBsdWdpbiBmb3IgbW9yZSBkZXRhaWxzLiAoSWYgeW91IGluY2x1ZGUgdGhlIHBsdWdpbiwgdGhlIEZsYXNoRWxlbWVudEZhY3Rvcnkgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyZCB0byB0aGlzIGV4dGVuc2lvbi4pCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vQW5hbHl6ZWRSZXN1bHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0FuYWx5emVkUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YzA3ZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vQW5hbHl6ZWRSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBBbmFseXplZFJlc3VsdCBpcyB1c2VkIGFzIHRoZSBvYmplY3Qgc3RvcmFnZSBmb3IgRE9NIHRyZWUgdHJhdmVyc2FsLgotICogQ3VycmVudGx5IGl0IHdpbGwgaGF2ZSB2aWRlbyBvYmplY3RzLCBzb3VuZCBvYmplY3RzLCBhY2Nlc3Mga2V5IGxpc3QsIGFuZAotICogRmxhc2ggbm9kZXMuIFlvdSBjYW4gY29sbGVjdCB0aG9zZSBvYmplY3RzIHdpdGgKLSAqIHtAbGluayBJTm9kZUV4I2FuYWx5emUoQW5hbHl6ZWRSZXN1bHQpfSBtZXRob2QuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmFseXplZFJlc3VsdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU5vZGVFeFZpZGVvW10gZW1wdHlWaWRlb0FycmF5ID0gbmV3IElOb2RlRXhWaWRlb1swXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTm9kZUV4U291bmRbXSBlbXB0eVNvdW5kQXJyYXkgPSBuZXcgSU5vZGVFeFNvdW5kWzBdOwotCXByaXZhdGUgQXJyYXlMaXN0PElOb2RlRXhWaWRlbz4gdmlkZW9MaXN0ID0gbmV3IEFycmF5TGlzdDxJTm9kZUV4VmlkZW8+KCk7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8SU5vZGVFeFNvdW5kPiBzb3VuZExpc3QgPSBuZXcgQXJyYXlMaXN0PElOb2RlRXhTb3VuZD4oKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElOb2RlRXhbXSBlbXB0eUFjY2Vzc0tleUFycmF5ID0gbmV3IElOb2RlRXhbMF07Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8SU5vZGVFeD4gYWNjZXNzS2V5TGlzdCA9IG5ldyBBcnJheUxpc3Q8SU5vZGVFeD4oKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGbGFzaE5vZGVbXSBlbXB0eUZsYXNoVG9wTm9kZUFycmF5ID0gbmV3IElGbGFzaE5vZGVbMF07Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8SUZsYXNoTm9kZT4gZmxhc2hOb2RlTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUZsYXNoTm9kZT4oKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgaXRlbXMgb2YgdHJlZS4KLQkgKiBAcGFyYW0gZgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEZsYXNoVG9wTm9kZShJRmxhc2hOb2RlIGYpIHsKLQkJZmxhc2hOb2RlTGlzdC5hZGQoZik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBpdGVtcyBvZiB0cmVlLgotCSAqIEBwYXJhbSB2Ci0JICovCi0JcHVibGljIHZvaWQgYWRkVmlkZW8oSU5vZGVFeFZpZGVvIHYpIHsKLQkJdmlkZW9MaXN0LmFkZCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGl0ZW1zIG9mIHRyZWUuCi0JICogQHBhcmFtIHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTb3VuZChJTm9kZUV4U291bmQgcykgewotCQlzb3VuZExpc3QuYWRkKHMpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgaXRlbXMgb2YgdHJlZS4KLQkgKiBAcGFyYW0gYQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFjY2Vzc0tleShJTm9kZUV4IGEpIHsKLQkJYWNjZXNzS2V5TGlzdC5hZGQoYSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB2aWRlbyBvYmplY3RzIGluIHRoZSB0cmVlLgotCSAqLwotCXB1YmxpYyBJTm9kZUV4VmlkZW9bXSBnZXRWaWRlb05vZGVzKCkgewotCQlyZXR1cm4gdmlkZW9MaXN0LnRvQXJyYXkoZW1wdHlWaWRlb0FycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNvdW5kIG9iamVjdHMgaW4gdGhlIHRyZWUuCi0JICovCi0JcHVibGljIElOb2RlRXhTb3VuZFtdIGdldFNvdW5kTm9kZXMoKSB7Ci0JCXJldHVybiBzb3VuZExpc3QudG9BcnJheShlbXB0eVNvdW5kQXJyYXkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbm9kZSBvYmplY3RzIHRoYXQgaGFzIG9uZSBvciBtb3JlIGFjY2VzcyBrZXlzIGluIHRoZSB0cmVlLiAKLQkgKi8KLQlwdWJsaWMgSU5vZGVFeFtdIGdldEFjY2Vzc0tleU5vZGVzKCkgewotCQlyZXR1cm4gYWNjZXNzS2V5TGlzdC50b0FycmF5KGVtcHR5QWNjZXNzS2V5QXJyYXkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gRmxhc2ggb2JqZWN0cy4gRWFjaCBvYmplY3QgaXMgY29ycmVzcG9uZGluZyB0byBhIEZsYXNoIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgSUZsYXNoTm9kZVtdIGdldEZsYXNoVG9wTm9kZXMoKSB7Ci0JCXJldHVybiBmbGFzaE5vZGVMaXN0LnRvQXJyYXkoZW1wdHlGbGFzaFRvcE5vZGVBcnJheSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vRG9tQnlDb20uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0RvbUJ5Q29tLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZWQ0OTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vRG9tQnlDb20uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuU3R5bGVTaGVldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5Db21QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5Db21TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSURpc3BhdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogRG9tQnlDb20gaXMgYSB1dGlsaXR5IGNsYXNzIHRvIG9idGFpbiB0aGUgQ09NIHdyYXBwZXIgb2JqZWN0IGZvcm0gdGhlIHBvaW50ZXIKLSAqIG9mIHRoZSB3ZWIgYnJvd3NlciBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21CeUNvbSB7Ci0JcHJpdmF0ZSBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyOwotCi0JcHJpdmF0ZSBmaW5hbCBJRGlzcGF0Y2ggaVdlYkJyb3dzZXIyOwotCi0JLyoqCi0JICogVGhpcyBpZCBpcyB1c2VkIGZvciBkaXYgZWxlbWVudHMgY3JlYXRlZCBieSBhaUJyb3dzZXIgdG8gc2hvdyBib3JkZXIgbGluZQotCSAqIG9mIHRoZSBmb2N1c2VkIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9ESVYgPSAiX19vcmdfZWNsaXBzZV9hY3RmX2hpZ2hsaWdodF9kaXZfXyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVZfQk9SREVSX1dJRFRIID0gMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUWUxFX0JPUkRFUiA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVZfQk9SREVSID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUWUxFX0JPUkRFUjIgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9SREVSX01PREUgPSBTVFlMRV9CT1JERVIyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9SREVSX1NUWUxFX1NUUklORyA9ICJib3JkZXI6IDNweCBzb2xpZCAjMDcxOyBiYWNrZ3JvdW5kOiAjZmRkOyI7Ci0KLQlwcml2YXRlIHZvaWQgYWRkU3R5bGVzKERvY3VtZW50SW1wbCBkb2MpIHsKLQkJU3R5bGVTaGVldEltcGwgc3R5bGUgPSBkb2MuY3JlYXRlU3R5bGVTaGVldCgpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJc3R5bGUuYWRkUnVsZSgiLkNTU3RvSGlnaGxpZ2h0IiwgQk9SREVSX1NUWUxFX1NUUklORyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGl2cyhEb2N1bWVudEltcGwgZG9jKSB7Ci0JCUVsZW1lbnQgZWwgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoSURfRElWKTsKLQkJaWYgKGVsID09IG51bGwpIHsKLQkJCWVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoImRpdiIpOwotCQkJZWwuc2V0QXR0cmlidXRlKCJpZCIsIElEX0RJVik7Ci0KLQkJCU5vZGVMaXN0IGJvZHkgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKTsKLQkJCWlmIChib2R5ICE9IG51bGwgJiYgYm9keS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImluc2VydCIpOwotCQkJCWJvZHkuaXRlbSgwKS5hcHBlbmRDaGlsZChlbCk7Ci0KLQkJCQl0cnkgewotCQkJCQlJRWxlbWVudEV4IGVseCA9IChJRWxlbWVudEV4KSBlbDsKLQkJCQkJSVN0eWxlIHN0ID0gZWx4LmdldFN0eWxlKCk7Ci0KLQkJCQkJc3QucHV0KCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpOwotCQkJCQlzdC5wdXQoImJhY2tncm91bmRDb2xvciIsICJ0cmFuc3BhcmVudCIpOwotCQkJCQlzdC5wdXQoImJvcmRlciIsIERJVl9CT1JERVJfV0lEVEggKyAicHggc29saWQgZ3JlZW4iKTsKLQkJCQkJc3QucHV0KCJ6SW5kZXgiLCAiMTAwMDAiKTsKLQkJCQkJc3QucHV0KCJsZWZ0IiwgIi0xMDAwcHgiKTsKLQkJCQkJc3QucHV0KCJ0b3AiLCAiLTEwMDBweCIpOwotCQkJCQlzdC5wdXQoIndpZHRoIiwgIjEwMHB4Iik7Ci0JCQkJCXN0LnB1dCgiaGVpZ2h0IiwgIjEwMHB4Iik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShEb2N1bWVudEltcGwgZG9jKSB7Ci0JCWlmIChCT1JERVJfTU9ERSA9PSBTVFlMRV9CT1JERVIpIHsKLQkJCWFkZFN0eWxlcyhkb2MpOwotCQl9IGVsc2UgaWYgKEJPUkRFUl9NT0RFID09IERJVl9CT1JERVIpIHsKLQkJCWFkZERpdnMoZG9jKTsKLQkJfSBlbHNlIGlmIChCT1JERVJfTU9ERSA9PSBTVFlMRV9CT1JERVIyKSB7Ci0JCQkvLyBkbyBub3RoaW5nOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVsZWFzZSBhbGwgb2JqZWN0cyBtYW5hZ2VkIGJ5IHRoZSBEb21CeUNvbS4gRG9tQnlDb20gaGFzIGEgcmVzb3VyY2UKLQkgKiBtYW5hZ2VyIHdoaWNoIG1hbmFnZXMgdGhlIGxpZmUgY3ljbGUgb2YgdGhlIG9iamVjdHMgb2J0YWluZWQgZnJvbSB0aGUKLQkgKiBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlyZXNvdXJjZU1hbmFnZXIucmVsZWFzZUFsbChpV2ViQnJvd3NlcjIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50IG9iamVjdCBvZiB0aGUgd2ViIGJyb3dzZXIuCi0JICovCi0JcHVibGljIElEb2N1bWVudEV4IGdldERvY3VtZW50KCkgewotCQlJRGlzcGF0Y2ggaURvY3VtZW50ID0gKElEaXNwYXRjaCkgaVdlYkJyb3dzZXIyLmdldCgiRG9jdW1lbnQiKTsKLQkJRG9jdW1lbnRJbXBsIGRvYyA9IG5ldyBEb2N1bWVudEltcGwoaURvY3VtZW50KTsKLQkJaW5pdGlhbGl6ZShkb2MpOwotCQlyZXR1cm4gZG9jOwotCX0KLQotCS8qKgotCSAqIERvbUJ5Q29tIGlzIGEgdXRpbGl0eSBjbGFzcyB0byBvYnRhaW4gdGhlIENPTSB3cmFwcGVyIG9iamVjdCBmb3JtIHRoZQotCSAqIHBvaW50ZXIgb2YgdGhlIHdlYiBicm93c2VyIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gaVdlYkJyb3dzZXIyCi0JICogICAgICAgICAgICB0aGUgbmF0aXZlIHBvaW50ZXIgb2YgdGhlIElXZWJCcm93c2VyMiBvYmplY3QuCi0JICovCi0JcHVibGljIERvbUJ5Q29tKGxvbmcgaVdlYkJyb3dzZXIyKSB7Ci0JCXRoaXMucmVzb3VyY2VNYW5hZ2VyID0gQ29tUGx1Z2luLmdldERlZmF1bHQoKS5uZXdSZXNvdXJjZU1hbmFnZXIobnVsbCk7Ci0JCXRoaXMuaVdlYkJyb3dzZXIyID0gQ29tU2VydmljZS5uZXdJRGlzcGF0Y2gocmVzb3VyY2VNYW5hZ2VyLAotCQkJCWlXZWJCcm93c2VyMiwgdHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vRG9tYnljb21QbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0RvbWJ5Y29tUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNzBmY2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vRG9tYnljb21QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21ieWNvbVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLSAgICAvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0gICAgcHJpdmF0ZSBzdGF0aWMgRG9tYnljb21QbHVnaW4gcGx1Z2luOwotCQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9tYnljb21QbHVnaW4oKSB7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICAgICAgcGx1Z2luID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb21ieWNvbVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSURvY3VtZW50RXguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lEb2N1bWVudEV4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMTY0MDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSURvY3VtZW50RXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBUaGUgZXh0ZW5kZWQgaW50ZXJmYWNlIG9mIHRoZSB7QGxpbmsgRG9jdW1lbnR9LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudEV4IGV4dGVuZHMgRG9jdW1lbnQgewotICAgIC8qKgotICAgICAqIENTUyBjb21wYXRpYmxlIG1vZGUgKElFKQotICAgICAqLwotICAgIFN0cmluZyBDU1MxX0NPTVBBVCA9ICJDU1MxQ29tcGF0IjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBCYWNrIGNvbXBhdGlibGUgbW9kZSAoSUUpCi0gICAgICovCi0gICAgU3RyaW5nIEJBQ0tfQ09NUEFUID0gIkJhY2tDb21wYXQiOwotICAgIAotICAgIC8qKgotICAgICAqIGdldEVsZW1lbnRCeUlkIHdpbGwgcmV0dXJuIGEgbm9kZSwgYnV0IGFjdHVhbCBjb250ZW50IHNvbWV0aW1lcwotICAgICAqIGhhcyBtb3JlIHRoYW4gb25lIG9iamVjdHMgaGF2aW5nIHNhdmUgSUQgYW5kIGl0IGNhbid0IHNlYXJjaCBpbiB0aGUKLSAgICAgKiBkb2N1bWVudCBvZiBpZnJhbWVzIGluIHRoZSB0b3AgZG9jdW1lbnQuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBpZCB0byBiZSB1c2VkIGZvciB0aGUgc2VhcmNoCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0cyB3aGljaCBoYXMgPGk+aWQ8L2k+IGFzIGl0cyBpZCBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgTGlzdDxOb2RlPiBnZXRFbGVtZW50c0J5SWRJbkFsbEZyYW1lcyhTdHJpbmcgaWQpOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIENTUyBjb21wYXRpYmxlIG1vZGUgKElFKQotICAgICAqLwotICAgIFN0cmluZyBnZXRDb21wYXRNb2RlKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRhcmdldCB0aGUgYW5jaG9yIG5hbWUgdG8gYmUgc2VhcmNoZWQuCi0gICAgICogQHJldHVybiB0aGUgZmlyc3QgZWxlbWVudCB3aG9zZSBuYW1lIGlzIDxpPnRhcmdldDwvaT4uCi0gICAgICovCi0gICAgRWxlbWVudCBnZXRUYXJnZXRFbGVtZW50KFN0cmluZyB0YXJnZXQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSUVsZW1lbnRFeC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSUVsZW1lbnRFeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGNlM2E1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lFbGVtZW50RXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBUaGUgZXh0ZW5kZWQgaW50ZXJmYWNlIG9mIHRoZSB7QGxpbmsgRWxlbWVudH0KLSAqLwotcHVibGljIGludGVyZmFjZSBJRWxlbWVudEV4IGV4dGVuZHMgRWxlbWVudCwgSU5vZGVFeHsKLQkvKioKLQkgKiBBbiBpbnN0YW5jZSBvZiBQb3NpdGlvbiByZXByZXNlbnRzIGEgbnRoIHBvc2l0aW9uIG9mIGEgZWxlbWVudCBpbiBhIHJhZGlvCi0JICogYnV0dG9uIGdyb3VwIGFuZCBsaXN0IGdyb3VwLgotCSAqLwotCXB1YmxpYyBjbGFzcyBQb3NpdGlvbiB7Ci0JCXB1YmxpYyBpbnQgaW5kZXg7Ci0JCXB1YmxpYyBpbnQgdG90YWw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgQ1NTIHN0eWxlIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgSVN0eWxlIGdldFN0eWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudCBpbiB0aGUgcmFkaW8gZ3JvdXAuIFRoaXMgaXMgdmFsaWQgaWYKLQkgKiAgICAgICAgIHRoZSBlbGVtZW50IGlzIGEgcmFkaW8gYnV0dG9uIGluIHRoZSByYWRpbyBncm91cC4KLQkgKi8KLQlwdWJsaWMgUG9zaXRpb24gZ2V0UmFkaW9Qb3NpdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGxpc3QuIFRoaXMgaXMgdmFsaWQgaWYgdGhlCi0JICogICAgICAgICBlbGVtZW50IGlzIGFuIGl0ZW0gb2YgdGhlIGxpc3QuCi0JICovCi0JcHVibGljIFBvc2l0aW9uIGdldExpc3RQb3NpdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbGFiZWwgb2JqZWN0IGFubm90YXRpbmcgdGhlIGVsZW1lbnQuIFRoaXMgaXMgdmFsaWQgaWYgdGhlCi0JICogICAgICAgICBlbGVtZW50IGlzIGEgZm9ybSBlbGVtZW50IGFuZCBhIGxhYmVsIGVsZW1lbnQgZm9yIHRoZSBlbGVtZW50IGlzCi0JICogICAgICAgICBleGlzdGluZy4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBnZXRGb3JtTGFiZWwoKTsKLQotCS8qKiAKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb3JpZ2luYWxseSBzcGVjaWZpZWQgdG8gdGhlIGVsZW1lbnQuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgcmV0dXJucyBudWxsLgotCSAqIEBzZWUgb3JnLnczYy5kb20uRWxlbWVudCNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSk7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlIGN1cnJlbnRseSBhc3NpZ25lZCB0byB0aGUgZWxlbWVudC4gKHNhbWUgYXMgZ2V0QXR0cmlidXRlIG1ldGhvZCBvZiBJRSBET00pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50QXR0cmlidXRlKFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lGbGFzaE1TQUFOb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JRmxhc2hNU0FBTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmRmY2Y0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lGbGFzaE1TQUFOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb207Ci0KLS8qKgotICogVGhlIElGbGFzaE1TQUFOb2RlIGludGVyZmFjZSBkZWZpbmVzIHRoZSBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBNU0FBCi0gKiBvYmplY3QuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZsYXNoTVNBQU5vZGUgZXh0ZW5kcyBJTm9kZUV4IHsKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB1bmlxdWUgSUQgb2YgdGhlIG5vZGUuIEEgbm9kZSBzaG91bGQgcmV0dXJuIGFuIGlkLgotCSAqLwotCVN0cmluZyBnZXRJRCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGlkIHRoZSBpZCB0byBiZSB1c2VkIGZvciB0aGUgc2VhcmNoCi0JICogQHJldHVybiB0aGUgTVNBQSBub2RlIHNwZWNpZmllZCBieSB0aGUgPGk+aWQ8aT4uCi0JICovCi0JSUZsYXNoTVNBQU5vZGUgc2VhcmNoQnlJRChTdHJpbmcgaWQpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgYmFzZSBub2RlLiBJdCBtaWdodCBiZSBhbiBvYmplY3QgZWxlbWVudCBvZiB0aGUgRmxhc2ggb2JqZWN0LgotCSAqLwotCUlOb2RlRXggZ2V0QmFzZU5vZGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lGbGFzaE5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lGbGFzaE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlkODY1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JRmxhc2hOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb207Ci0KLS8qKgotICogSUZsYXNoTm9kZSBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgRmxhc2ggbm9kZQotICogb2JqZWN0cy4gSXQgZXh0ZW5kcyB0aGUge0BsaW5rIElOb2RlRXh9IGludGVyZmFjZSBmb3IgRmxhc2ggb2JqZWN0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGbGFzaE5vZGUgZXh0ZW5kcyBJTm9kZUV4IHsKLQlzaG9ydCBGTEFTSF9OT0RFID0gMTIwOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgdGFyZ2V0IHBhdGggb2YgdGhlIEZsYXNoIG9iamVjdCBmcm9tIHRoZSByb290LiBJdCBtaWdodCBiZQotCSAqICAgICAgICAgbGlrZSBhICJfbGV2ZWwwLmhvZ2UuaG9nZSIuCi0JICovCi0JU3RyaW5nIGdldFRhcmdldCgpOwotCi0JLyoqCi0JICogQHBhcmFtIHBhdGggdGhlIHRhcmdldCBwYXRoIHRvIGJlIG9idGFpbmVkLgotCSAqIEByZXR1cm4gdGhlIEZsYXNoIG9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIDxpPnBhdGg8L2k+Ci0JICovCi0JSUZsYXNoTm9kZSBnZXROb2RlRnJvbVBhdGgoU3RyaW5nIHBhdGgpOwotCi0JLyoqCi0JICogQHBhcmFtIGRlcHRoIHRoZSB0YXJnZXQgZGVwdGggdG8gYmUgb2J0YWluZWQuCi0JICogQHJldHVybiB0aGUgRmxhc2ggb2JqZWN0IHNwZWNpZmllZCBieSB0aGUgPGk+ZGVwdGg8L2k+Ci0JICovCi0JSUZsYXNoTm9kZSBnZXROb2RlQXREZXB0aChpbnQgZGVwdGgpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgb3JpZ2luYWwgY2hpbGQgbm9kZXMgb2YgdGhlIEZsYXNoIG5vZGUuCi0JICovCi0JSUZsYXNoTm9kZVtdIGdldElubmVyTm9kZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGRlcHRoIG9mIHRoZSBub2RlLgotCSAqLwotCWludCBnZXREZXB0aCgpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgZnJhbWUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHN0YXRlLgotCSAqLwotCWludCBnZXRDdXJyZW50RnJhbWUoKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIGF1dG8gdHJhbnNsYXRlIGZ1bmN0aW9uLgotCSAqIEByZXR1cm4gdGhlIHRyYW5zbGF0ZWQgbm9kZXMuCi0JICovCi0JSUZsYXNoTm9kZVtdIHRyYW5zbGF0ZSgpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgTVNBQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgRmxhc2ggZWxlbWVudC4KLQkgKi8KLQlJRmxhc2hNU0FBTm9kZSBnZXRNU0FBKCk7Ci0KLQkvKioKLQkgKiBkbyB0aGUgRmxhc2ggcmVwYWlyaW5nIGZ1bmN0aW9uLiAoZXhwZXJpbWVudGFsKQotCSAqLwotCXZvaWQgcmVwYWlyRmxhc2goKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHJvb3QgRmxhc2ggb2JqZWN0IG5vZGUuCi0JICovCi0JSU5vZGVFeCBnZXRCYXNlTm9kZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lJbWFnZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lJbWFnZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU4NTFhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JSW1hZ2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb207Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFRoZSBJSW1hZ2VFbGVtZW50IGludGVyZmFjZSBkZWZpbmVzIHRoZSBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZQotICogaW1hZ2UgZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSW1hZ2VFbGVtZW50IGV4dGVuZHMgSU5vZGVFeCB7Ci0JLyoqCi0JICogQHJldHVybiB0aGUgbWFwIGVsZW1lbnQgc3BlY2lmaWVkIGluIHRoZSBpbWFnZSBlbGVtZW50IGFzIGEgYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGdldE1hcCgpOwotCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBlbGVtZW50IGhhcyB1c2VtYXAgYXR0cmlidXRlIG9yIG5vdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNVc2VtYXAoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lOb2RlRXguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lOb2RlRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0YTkwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JTm9kZUV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGUgSU5vZGVFeCBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgbm9kZQotICogb2JqZWN0cyB0aGF0IGFyZSB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbi4gVGhlc2UgbWV0aG9kcyBhcmUgYmFzaWMgZnVuY3Rpb25zCi0gKiBmb3IgYWx0ZXJuYXRpdmUgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlRXggZXh0ZW5kcyBOb2RlLCBJRXZhbFRhcmdldCB7Ci0JLyoqCi0JICogQHJldHVybiB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbm9kZS4KLQkgKi8KLQlTdHJpbmcgZXh0cmFjdFN0cmluZygpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaGVhZGluZyBsZXZlbCBvZiB0aGUgbm9kZS4gSWYgdGhlIG5vZGUgaXMgbm90IGhlYWRpbmcgdGhlbgotCSAqICAgICAgICAgIjAiIHdpbGwgYmUgcmV0dXJuZWQuCi0JICovCi0Jc2hvcnQgZ2V0SGVhZGluZ0xldmVsKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsaW5rIFVSSSBpZiB0aGUgbm9kZSBpcyBhIGxpbmsuCi0JICovCi0JU3RyaW5nIGdldExpbmtVUkkoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGFjY2VzcyBrZXkgb2YgdGhlIG5vZGUuCi0JICovCi0JY2hhciBnZXRBY2Nlc3NLZXkoKTsKLQotCS8qKgotCSAqIFRoaXMgbWF5YmUgYSBoZWF2eSB0YXNrLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG50aCBwb3NpdGlvbiBvZiB0aGUgbm9kZSBpbiB0aGUgc2libGluZ3MuCi0JICovCi0JaW50IGdldE50aCgpOwotCi0JLyoqCi0JICogVGhlIGNsaWNrIG9wZXJhdGlvbiBmb3IgdGhlIGVsZW1lbnQgd2lsbCBiZSBzaW11bGF0ZWQuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjbGljayBpcyBzdWNjZWVkZWQgb3Igbm90LgotCSAqLwotCWJvb2xlYW4gZG9DbGljaygpOwotCi0JLyoqCi0JICogSGlnaGxpZ2h0IHRoZSBub2RlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgaGlnaGxpZ2h0IGlzIHN1Y2NlZWRlZCBvciBub3QKLQkgKi8KLQlib29sZWFuIGhpZ2hsaWdodCgpOwotCi0JLyoqCi0JICogVW5oaWdobGlnaHQgdGhlIG5vZGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSB1bmhpZ2hsaWdodCBpcyBzdWNjZWVkZWQgb3Igbm90Ci0JICovCi0JYm9vbGVhbiB1bmhpZ2hsaWdodCgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBGb2N1cyB0byB0aGUgbm9kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGZvY3VzaW5nIGlzIHN1Y2NlZWRlZCBvciBub3QuCi0JICovCi0JYm9vbGVhbiBzZXRGb2N1cygpOwotCi0JLyoqCi0JICogU2V0IHRoZSB0ZXh0IHRvIHRoZSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB0byBiZSBzZXQuCi0JICovCi0Jdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHRleHQgb2YgdGhlIGZvcm0gZWxlbWVudC4gSXQgaXMgTk9UIHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uCi0JICogICAgICAgICBvZiB0aGUgbm9kZS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGV4dCgpOwotCi0JLy8gIUZOIQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHN0cmluZyBhcnJheSBvZiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGltYWdlLiBUaGUgYXJyYXkKLQkgKiAgICAgICAgIGxlbmd0aCBpcyAzLiBJbmRleCAwIGlzIHRoZSBNSU1FVFlQRSBvZiB0aGUgaW1hZ2UsIEluZGV4IDEgaXMgdGhlCi0JICogICAgICAgICBzcmMgYXR0cmlidXRlIG9mIHRoZSBpbWFnZSwgSW5kZXggMiBpcyBhbiBlbXB0eSBzdHJpbmcuCi0JICovCi0JU3RyaW5nW10gZ2V0U3RpbGxQaWN0dXJlRGF0YSgpOwotCi0JLyoqCi0JICogQHBhcmFtIGFyCi0JICogICAgICAgICAgICB0aGUgaW5zdGFuY2Ugb2YgdGhlIEFuYWx5emVkUmVzdWx0IGZvciBzdG9yZSB0aGUgbm9kZXMuCi0JICogQHJldHVybiBpdCBpcyB0aGUgc2FtZSBhcyA8aT5hcjwvaT4KLQkgKi8KLQlBbmFseXplZFJlc3VsdCBhbmFseXplKEFuYWx5emVkUmVzdWx0IGFyKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBub2RlIG9uIHRoZSBjbGllbnQgd2luZG93LgotCSAqLwotCVJlY3RhbmdsZSBnZXRMb2NhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSU5vZGVFeFNvdW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JTm9kZUV4U291bmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwMjFmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JTm9kZUV4U291bmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tOwotCi0vKioKLSAqIElOb2RlRXhTb3VuZCBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgc291bmQKLSAqIG9iamVjdC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTm9kZUV4U291bmQgewotCS8qKgotCSAqIFRoZSBtaW5pbXVtIHZvbHVtZSB2YWx1ZS4gRWFjaCBpbXBsZW1lbnRhdGlvbiBjb252ZXJ0IHRoZSAwLTEwOTAgc2NhbGUgdG8KLQkgKiB0aGUgb3JpZ2luYWwgc2NhbGUuCi0JICovCi0JaW50IFZPTFVNRV9NSU4gPSAwOwotCS8qKgotCSAqIFRoZSBtYXhpbXVtIHZvbHVtZSB2YWx1ZS4gRWFjaCBpbXBsZW1lbnRhdGlvbiBjb252ZXJ0IHRoZSAwLTEwMDAgc2NhbGUgdG8KLQkgKiB0aGUgb3JpZ2luYWwgc2NhbGUuCi0JICovCi0JaW50IFZPTFVNRV9NQVggPSAxMDAwOwotCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBzb3VuZCBvYmplY3QgaXMgbXV0ZWQgb3Igbm90LgotCSAqLwotCWJvb2xlYW4gZ2V0TXV0ZVN0YXRlKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmxhZyB3aGV0aGVyIHRoZSBzb3VuZCBvYmplY3Qgd2lsbCBiZSBtdXRlZCBvciBub3QuCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gaXMgc3VjY2VlZGVkIG9yIG5vdC4KLQkgKi8KLQlib29sZWFuIG11dGVNZWRpYShib29sZWFuIGZsYWcpOwotCi0JLy8gMCAtLSAxMDAwCi0JLyoqCi0JICogQHJldHVybiB0aGUgdm9sdW1lLgotCSAqLwotCWludCBnZXRWb2x1bWUoKTsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWwgdGhlIHZvbHVtZQotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIHN1Y2NlZWRlZCBvciBub3QuCi0JICovCi0JYm9vbGVhbiBzZXRWb2x1bWUoaW50IHZhbCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JTm9kZUV4VmlkZW8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lOb2RlRXhWaWRlby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2ZiMzY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lOb2RlRXhWaWRlby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb207Ci0KLS8qKgotICogSU5vZGVFeFZpZGVvIGludGVyZmFjZSBkZWZpbmVzIHRoZSBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSB2aWRlbwotICogb2JqZWN0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlRXhWaWRlbyB7Ci0JLyoqCi0JICogVGhlIGVudW1lcmF0aW9uIG9mIHRoZSBzdGF0ZSBvZiB0aGUgdmlkZW8uCi0JICovCi0JcHVibGljIGVudW0gVmlkZW9TdGF0ZSB7Ci0JCVNUQVRFX1VOS05PV04sIC8vCi0JCVNUQVRFX1BMQVksIC8vCi0JCVNUQVRFX1NUT1AsIC8vCi0JCVNUQVRFX1BBVVNFLCAvLwotCQlTVEFURV9GQVNURk9SV0FSRCwgLy8KLQkJU1RBVEVfRkFTVFJFVkVSU0UsIC8vCi0JCVNUQVRFX1dBSVRJTkcKLQl9OwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS4KLQkgKi8KLQlWaWRlb1N0YXRlIGdldEN1cnJlbnRTdGF0ZSgpOwotCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gaXMgc3VjY2VlZGVkIG9yIG5vdC4KLQkgKi8KLQlib29sZWFuIHByZXZpb3VzVHJhY2soKTsKLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIHN1Y2NlZWRlZCBvciBub3QuCi0JICovCi0JYm9vbGVhbiBuZXh0VHJhY2soKTsKLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIHN1Y2NlZWRlZCBvciBub3QuCi0JICovCi0JYm9vbGVhbiBzdG9wTWVkaWEoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIHN1Y2NlZWRlZCBvciBub3QuCi0JICovCi0JYm9vbGVhbiBwbGF5TWVkaWEoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIHN1Y2NlZWRlZCBvciBub3QuCi0JICovCi0JYm9vbGVhbiBwYXVzZU1lZGlhKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZWVkZWQgb3Igbm90LgotCSAqLwotCWJvb2xlYW4gZmFzdFJldmVyc2UoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIHN1Y2NlZWRlZCBvciBub3QuCi0JICovCi0JYm9vbGVhbiBmYXN0Rm9yd2FyZCgpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgY3VycmVudCBwbGF5aW5nIHBvc2l0aW9uIGluIHNlY29uZHMuCi0JICovCi0JZG91YmxlIGdldEN1cnJlbnRQb3NpdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgdG90YWwgbWVkaWEgbGVuZ3RoIGluIHNlY29uZHMuCi0JICovCi0JZG91YmxlIGdldFRvdGFsTGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBIVE1MIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgdmlkZW8gb2JqZWN0LgotCSAqLwotCUlOb2RlRXggZ2V0UmVmZXJlbmNlTm9kZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSU9iamVjdEVsZW1lbnRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JT2JqZWN0RWxlbWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmZmQyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JT2JqZWN0RWxlbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSURpc3BhdGNoOwotCi0vKioKLSAqIElPYmplY3RFbGVtZW50RmFjdG9yeSBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUKLSAqIGV4dGVuc2lvbiBvZiB0aGUgRE9NIG9iamVjdC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJT2JqZWN0RWxlbWVudEZhY3RvcnkgewotCi0JLyoqCi0JICogQHBhcmFtIGJhc2UgYW4gaW5zdGFuY2Ugb2YgSU5vZGVFeCB3aGljaCBiZWNvbWVzIHRoZSBiYXNlIG9mIHRoZSBuZXcgTm9kZS4KLQkgKiBAcGFyYW0gaW5vZGUgdGhlIGluc3RhbmNlIG9mIHRoZSBJRGlzcGF0Y2ggd2hpY2ggaXMgdGhlIHRhcmdldCB0byBjcmVhdGUuIAotCSAqIEByZXR1cm4gdGhlIG5ldyBub2RlIG9mIHdyYXBwZXIgb2YgdGhlIDxpPmlub2RlPC9pPi4gCi0JICovCi0JcHVibGljIE5vZGVJbXBsIGNyZWF0ZVRvcE5vZGUoTm9kZUltcGwgYmFzZSwgSURpc3BhdGNoIGlub2RlKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lTZWxlY3RFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9JU2VsZWN0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTRlNjhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lTZWxlY3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb207Ci0KLS8qKgotICogSVNlbGVjdEVsZW1lbnQgaW50ZXJmYWNlIGRlZmluZXMgdGhlIG1ldGhvZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGZvcm0KLSAqIHNlbGVjdCBlbGVtZW50IHN1Y2ggYXMgY29tYm8gYm94IGFuZCBsaXN0IGJveC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VsZWN0RWxlbWVudCBleHRlbmRzIElOb2RlRXggewotCS8qKgotCSAqIEBwYXJhbSBpbmRpY2VzCi0JICogICAgICAgICAgICB0aGUgaW5kaWNlcyB0byBiZSBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJbmRpY2VzKGludFtdIGluZGljZXMpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgc2VsZWN0ZWQgaW5kaWNlcy4KLQkgKi8KLQlwdWJsaWMgaW50W10gZ2V0U2VsZWN0ZWRJbmRpY2VzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgdGhlIGl0ZW0gaW4gdGhlIHNlbGVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9wdGlvbnNDb3VudCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgb3B0aW9uIHRvIGJlIG9idGFpbmVkLgotCSAqIEByZXR1cm4gdGhlIHRleHQgb2YgdGhlIGl0ZW0gc3BlY2lmaWVkIGJ5IHRoZSA8aT5pbmRleDwvaT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcHRpb25UZXh0QXQoaW50IGluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL0lTdHlsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSVN0eWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOTU3NmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vSVN0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb207Ci0KLS8qKgotICogSVN0eWxlIGludGVyZmFjZSBkZWZpbmVzIHRoZSBzaW1wbGVzdCBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IEhUTUwgU3R5bGUKLSAqIG9iamVjdC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGUgewotCS8qKgotCSAqIEBwYXJhbSBuYW1lIHRoZSBzdHlsZSBuYW1lLgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgc3R5bGUgdmFsdWUuCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gaXMgc3VjY2VlZGVkIG9yIG5vdC4KLQkgKi8KLQlib29sZWFuIHB1dChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lIHRoZSBzdHlsZSBuYW1lIHRvIGJlIG9idGFpbmVkLgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzdHlsZS4gSXQgbWlnaHQgYmUgYSBTdHJpbmcsIGEgTnVtYmVyLCBvciBhIE9iamVjdC4KLQkgKi8KLQlPYmplY3QgZ2V0KFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvQXR0ckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvQXR0ckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0NDQ4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL0F0dHJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlR5cGVJbmZvOwotCi0KLQotcHVibGljIGNsYXNzIEF0dHJJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBBdHRyIHsKLSAgICBBdHRySW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlub2RlKSB7Ci0gICAgICAgIHN1cGVyKGJhc2VOb2RlLCBpbm9kZSwgTm9kZS5BVFRSSUJVVEVfTk9ERSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gKFN0cmluZykgSGVscGVyLmdldChpbm9kZSwgIm5hbWUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRTcGVjaWZpZWQoKSB7Ci0gICAgICAgIC8vIFdlIHJlZ2FyZCBgdGhpcycgYXR0cmlidXRlIGlzIGFsd2F5cyBzcGVjaWZpZWQgaW4gSFRNTCBET00gd2hlbmV2ZXIgYHRoaXMnIGV4aXN0cy4KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJ2YWx1ZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIEhlbHBlci5wdXQoaW5vZGUsICJ2YWx1ZSIsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRPd25lckVsZW1lbnQoKSB7Ci0gICAgICAgIElEaXNwYXRjaCBpID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChpbm9kZSwgInBhcmVudE5vZGUiKTsKLSAgICAgICAgaWYgKGkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoRWxlbWVudCkgbmV3Tm9kZShpLCBOb2RlLkVMRU1FTlRfTk9ERSk7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVJbmZvIGdldFNjaGVtYVR5cGVJbmZvKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSWQoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvRG9jdW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL0RvY3VtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWFlOTA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvRG9jdW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JRG9jdW1lbnRFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmh0bWwuSFRNTEVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guRGlzcGF0Y2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRW51bVVua25vd247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JT2xlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSVVua25vd247Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLQotcHVibGljIGNsYXNzIERvY3VtZW50SW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgSURvY3VtZW50RXggewotICAgIHByaXZhdGUgSURpc3BhdGNoIGh0bWxEb2N1bWVudDsKLQotICAgIC8vIFVuaXF1ZSBJRCAtPiBOb2RlSW1wbAotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIE5vZGVJbXBsPiBpbm9kZU1hcDsKLQotICAgIHN5bmNocm9uaXplZCBOb2RlSW1wbCBsb29rdXBOb2RlKFN0cmluZyB1bmlxdWVOYW1lKSB7Ci0gICAgICAgIE5vZGVJbXBsIG4gPSBpbm9kZU1hcC5nZXQodW5pcXVlTmFtZSk7Ci0gICAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCB2b2lkIHJlZ05vZGUoU3RyaW5nIHVuaXF1ZU5hbWUsIE5vZGVJbXBsIG5vZGUpIHsKLSAgICAgICAgaW5vZGVNYXAucHV0KHVuaXF1ZU5hbWUsIG5vZGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudEltcGwoSURpc3BhdGNoIGh0bWxEb2N1bWVudCkgewotICAgICAgICBzdXBlcihodG1sRG9jdW1lbnQpOwotICAgICAgICBpbm9kZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTm9kZUltcGw+KCk7Ci0gICAgICAgIHRoaXMuaHRtbERvY3VtZW50ID0gaHRtbERvY3VtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGdldERvY3VtZW50RWxlbWVudCgpIHsKLSAgICAgICAgSURpc3BhdGNoIGlub2RlID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChodG1sRG9jdW1lbnQsICJkb2N1bWVudEVsZW1lbnQiKTsKLSAgICAgICAgcmV0dXJuIChFbGVtZW50KSBuZXdOb2RlKGlub2RlLCBOb2RlLkVMRU1FTlRfTk9ERSk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50VHlwZSBnZXREb2N0eXBlKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBET01JbXBsZW1lbnRhdGlvbiBnZXRJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBjcmVhdGVEb2N1bWVudEZyYWdtZW50KCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXh0IGNyZWF0ZVRleHROb2RlKFN0cmluZyBkYXRhKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIENvbW1lbnQgY3JlYXRlQ29tbWVudChTdHJpbmcgZGF0YSkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBDREFUQVNlY3Rpb24gY3JlYXRlQ0RBVEFTZWN0aW9uKFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvY2Vzc2luZ0luc3RydWN0aW9uIGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEF0dHIgY3JlYXRlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW50aXR5UmVmZXJlbmNlIGNyZWF0ZUVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZyB0YWduYW1lKSB7Ci0gICAgICAgIElEaXNwYXRjaCByID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCB0YWduYW1lKTsKLSAgICAgICAgaWYgKHIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCh0aGlzLCByKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBpbXBvcnROb2RlKE5vZGUgaW1wb3J0ZWROb2RlLCBib29sZWFuIGRlZXApIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnROUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEF0dHIgY3JlYXRlQXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50QnlJZChTdHJpbmcgZWxlbWVudElkKSB7Ci0gICAgICAgIElEaXNwYXRjaCBpID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiZ2V0RWxlbWVudEJ5SWQiLCBlbGVtZW50SWQpOwotICAgICAgICBpZiAoaSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiAoRWxlbWVudCkgbmV3Tm9kZShpLCBOb2RlLkVMRU1FTlRfTk9ERSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0RWxlbWVudHNCeUlkSW5BbGxGcmFtZXMoU3RyaW5nIGlkKSB7Ci0gICAgICAgIExpc3Q8Tm9kZT4gciA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKLSAgICAgICAgRWxlbWVudCBlID0gZ2V0RWxlbWVudEJ5SWQoaWQpOwotICAgICAgICBpZiAoZSAhPSBudWxsKQotICAgICAgICAgICAgci5hZGQoZSk7Ci0gICAgICAgIAotICAgICAgICBMaXN0PE5vZGU+IGlkcyA9IGdldEVsZW1lbnRzQnlJZEluRnJhbWVzKGh0bWxEb2N1bWVudCwgaWQpOwotICAgICAgICBpZiAoaWRzICE9IG51bGwpCi0gICAgICAgICAgICByLmFkZEFsbChpZHMpOwotICAgICAgICByZXR1cm4gcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0PE5vZGU+IGdldEVsZW1lbnRzQnlJZEluRnJhbWVzKElEaXNwYXRjaCBodG1sRG9jdW1lbnQsIFN0cmluZyBpZCkgewotICAgICAgICBpZiAoIWhhc0ZyYW1lcyhodG1sRG9jdW1lbnQpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIAotICAgICAgICBMaXN0PE5vZGU+IHIgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7Ci0gICAgICAgIElPbGVDb250YWluZXIgaW9sZSA9IChJT2xlQ29udGFpbmVyKSBodG1sRG9jdW1lbnQucXVlcnlJbnRlcmZhY2UoSVVua25vd24uSUlEX0lPbGVDb250YWluZXIpOwotICAgICAgICBJRW51bVVua25vd24gaWV1ID0gaW9sZS5lbnVtT2JqZWN0cyhJT2xlQ29udGFpbmVyLk9MRUNPTlRGX0VNQkVERElOR1MpOwotCi0gICAgICAgIGlmIChpZXUgIT0gbnVsbCkgewotICAgICAgICAgICAgSVVua25vd25bXSBpdW5rczsKLSAgICAgICAgICAgIGZvciAoaXVua3MgPSBpZXUubmV4dCgxKTsgaXVua3MgIT0gbnVsbCAmJiBpdW5rcy5sZW5ndGggPiAwOyBpdW5rcyA9IGlldS5uZXh0KDEpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSURpc3BhdGNoIGlkaXNwID0gKElEaXNwYXRjaCkgaXVua3NbMF0ucXVlcnlJbnRlcmZhY2UoSVVua25vd24uSUlEX0lXZWJCcm93c2VyMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpZGlzcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJRGlzcGF0Y2ggZCA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaWRpc3AsICJEb2N1bWVudCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Tm9kZT4gcjIgPSBnZXRFbGVtZW50c0J5SWRJbkZyYW1lcyhkLCBpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocjIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmFkZEFsbChyMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJRGlzcGF0Y2ggaW4gPSAoSURpc3BhdGNoKSBkLmludm9rZTEoImdldEVsZW1lbnRCeUlkIiwgaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIG4gPSBuZXdOb2RlKGluLCBOb2RlLkVMRU1FTlRfTk9ERSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgci5hZGQobik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRnJhbWVzKElEaXNwYXRjaCBodG1sRG9jdW1lbnQpIHsKLSAgICAgICAgSURpc3BhdGNoIHIgPSAoSURpc3BhdGNoKSBodG1sRG9jdW1lbnQuaW52b2tlMSgiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCAiZnJhbWUiKTsKLSAgICAgICAgaWYgKHIgIT0gbnVsbCkgewotICAgICAgICAgICAgTm9kZUxpc3RJbXBsIG5sID0gbmV3IE5vZGVMaXN0SW1wbCh0aGlzLCByKTsKLSAgICAgICAgICAgIGlmIChubC5nZXRMZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHIgPSAoSURpc3BhdGNoKSBodG1sRG9jdW1lbnQuaW52b2tlMSgiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCAiaWZyYW1lIik7Ci0gICAgICAgIGlmIChyICE9IG51bGwpIHsKLSAgICAgICAgICAgIE5vZGVMaXN0SW1wbCBubCA9IG5ldyBOb2RlTGlzdEltcGwodGhpcywgcik7Ci0gICAgICAgICAgICBpZiAobmwuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnB1dEVuY29kaW5nKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0WG1sU3RhbmRhbG9uZSgpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WG1sU3RhbmRhbG9uZShib29sZWFuIHhtbFN0YW5kYWxvbmUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhtbFZlcnNpb24oKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WG1sVmVyc2lvbihTdHJpbmcgeG1sVmVyc2lvbikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldFN0cmljdEVycm9yQ2hlY2tpbmcoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0cmljdEVycm9yQ2hlY2tpbmcoYm9vbGVhbiBzdHJpY3RFcnJvckNoZWNraW5nKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRVUkkoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRVUkkoU3RyaW5nIGRvY3VtZW50VVJJKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGFkb3B0Tm9kZShOb2RlIHNvdXJjZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIERPTUNvbmZpZ3VyYXRpb24gZ2V0RG9tQ29uZmlnKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vcm1hbGl6ZURvY3VtZW50KCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSByZW5hbWVOb2RlKE5vZGUgbiwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGdldFRhcmdldEVsZW1lbnQoU3RyaW5nIHRhcmdldCkgewotICAgICAgICBOb2RlTGlzdCBsaXN0ID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkEiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIEVsZW1lbnQgZWwgPSAoRWxlbWVudCkgbGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKHRhcmdldC5lcXVhbHMoZWwuZ2V0QXR0cmlidXRlKCJuYW1lIikpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRCeUlkKHRhcmdldCk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBwcml2YXRlIGV4dGVuc2lvbgotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgU3R5bGVTaGVldEltcGwgY3JlYXRlU3R5bGVTaGVldCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpbm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgSURpc3BhdGNoIHIgPSAoSURpc3BhdGNoKSBpbm9kZS5pbnZva2UwKCJjcmVhdGVTdHlsZVNoZWV0Iik7Ci0gICAgICAgICAgICBpZiAociA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHlsZVNoZWV0SW1wbChyKTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyB0YWdOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIEhUTUxFbGVtZW50RmFjdG9yeS5jcmVhdGVFbGVtZW50KHRoaXMsIGlub2RlLCB0YWdOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBhdE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBIZWxwZXIuZ2V0KGh0bWxEb2N1bWVudCwgImNvbXBhdE1vZGUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSURpc3BhdGNoIGdldFdpbmRvdygpIHsKLSAgICAgICAgcmV0dXJuIChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaW5vZGUsICJwYXJlbnRXaW5kb3ciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSURpc3BhdGNoIGdldERvY3VtZW50KCkgewotICAgICAgICByZXR1cm4gKElEaXNwYXRjaCkgSGVscGVyLmdldChpbm9kZSwgImRvY3VtZW50RWxlbWVudCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9IZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNjM3ZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLkRpc3BhdGNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSURpc3BhdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIEhlbHBlciB7Ci0gICAgc3RhdGljIHB1YmxpYyBPYmplY3QgZ2V0KElEaXNwYXRjaCBpZGlzcCwgU3RyaW5nIHByb3ApIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpZGlzcCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBpZGlzcC5nZXQocHJvcCk7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBwdXQoSURpc3BhdGNoIGlkaXNwLCBTdHJpbmcgcHJvcCwgT2JqZWN0IHZhbCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWRpc3AucHV0KHByb3AsIHZhbCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0eShJRGlzcGF0Y2ggaWRpc3AsIFN0cmluZyBwcm9wKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3QgciA9IGlkaXNwLmdldChwcm9wKTsKLSAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHJldHVybiB0cnVlOwotICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIHRyaW1IVE1MU3RyKFN0cmluZyBzcmMpIHsKLSAgICAgICAgc3JjID0gc3JjLnRyaW0oKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJldCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgY2hhciBjID0gc3JjLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjID09ICdcdTAwYTAnKSB7Ci0gICAgICAgICAgICAgICAgLy8gJm5ic3A7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldC5hcHBlbmQoYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHIgPSByZXQudG9TdHJpbmcoKTsKLSAgICAgICAgLy8gaWYgKHIubWF0Y2hlcygiXFxBKFtcXHVmZjVjXFx1MzBmYnxdKVxceiIpKSByZXR1cm4gIiI7Ci0gICAgICAgIHJldHVybiByOwotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgdm9pZCBub3RTdXBwb3J0ZWQoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBzcGVjaWZpZWQgbm9kZSBtdXN0IGJlIGNyZWF0ZWQgYnkgRG9tQnlDb20iKTsgLy8gJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHB1YmxpYyBSZWN0YW5nbGUgZ2V0TG9jYXRpb24oSURpc3BhdGNoIGlkaXNwKSB7Ci0gICAgICAgIFJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAwLCAwKTsKLSAgICAgICAgZ2V0T2Zmc2V0KGlkaXNwLCByKTsKLQotICAgICAgICByLndpZHRoID0gKEludGVnZXIpIEhlbHBlci5nZXQoaWRpc3AsICJvZmZzZXRXaWR0aCIpOwotICAgICAgICByLmhlaWdodCA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlkaXNwLCAib2Zmc2V0SGVpZ2h0Iik7Ci0KLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0T2Zmc2V0KElEaXNwYXRjaCBpbm9kZSwgUmVjdGFuZ2xlIHIpIHsKLSAgICAgICAgaW50IG9sID0gKEludGVnZXIpIEhlbHBlci5nZXQoaW5vZGUsICJvZmZzZXRMZWZ0Iik7Ci0gICAgICAgIGludCBvdCA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlub2RlLCAib2Zmc2V0VG9wIik7Ci0KLSAgICAgICAgci54ICs9IG9sOwotICAgICAgICByLnkgKz0gb3Q7Ci0KLSAgICAgICAgSURpc3BhdGNoIHBhcmVudCA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaW5vZGUsICJvZmZzZXRQYXJlbnQiKTsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4ocik7Ci0gICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZ2V0T2Zmc2V0KHBhcmVudCwgcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9MaXN0Tm9kZUxpc3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL0xpc3ROb2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkYjc5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL0xpc3ROb2RlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0KLXB1YmxpYyBjbGFzcyBMaXN0Tm9kZUxpc3RJbXBsIGltcGxlbWVudHMgTm9kZUxpc3QgewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxOb2RlPiBsOwotCi0gICAgcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBsLnNpemUoKSkpIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKE5vZGUpIGwuZ2V0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIGwuc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0Tm9kZUxpc3RJbXBsKExpc3Q8Tm9kZT4gbCkgewotICAgICAgICB0aGlzLmwgPSBsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvTmFtZWROb2RlTWFwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9OYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZGEzNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9OYW1lZE5vZGVNYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5EaXNwYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklEaXNwYXRjaDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIE5hbWVkTm9kZU1hcCB7Ci0gICAgcHJpdmF0ZSBJRGlzcGF0Y2ggYXR0cmlidXRlczsKLSAgICBwcml2YXRlIEhhc2hNYXA8QXR0cktleSwgTm9kZT4gYXR0ck1hcDsKLSAgICBwcml2YXRlIE5vZGVJbXBsIGJhc2VOb2RlOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEF0dHJLZXkgewotICAgICAgICBTdHJpbmcgbnM7Ci0gICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEF0dHJLZXkpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBBdHRyS2V5IGFrID0gKEF0dHJLZXkpIG87Ci0gICAgICAgICAgICByZXR1cm4gbnMuZXF1YWxzKGFrLm5zKSAmJiBuYW1lLmVxdWFscyhhay5uYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIG5zLmhhc2hDb2RlKCkgXiBuYW1lLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBBdHRyS2V5KFN0cmluZyBucywgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIHRoaXMubnMgPSBuczsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZWROb2RlTWFwSW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgdGhpcy5iYXNlTm9kZSA9IGJhc2VOb2RlOwotICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0Q2FjaGUoKSB7Ci0gICAgICAgIGlmIChhdHRyTWFwICE9IG51bGwpIHJldHVybjsKLSAgICAgICAgYXR0ck1hcCA9IG5ldyBIYXNoTWFwPEF0dHJLZXksIE5vZGU+KCk7Ci0gICAgICAgIGludCBsZW4gPSBnZXRMZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgTm9kZSBuID0gaXRlbShpKTsKLSAgICAgICAgICAgIEF0dHJLZXkga2V5ID0gbmV3IEF0dHJLZXkobi5nZXROYW1lc3BhY2VVUkkoKSwgbi5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICBhdHRyTWFwLnB1dChrZXksIG4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElEaXNwYXRjaCBpID0gKElEaXNwYXRjaCkgYXR0cmlidXRlcy5pbnZva2UxKCJpdGVtIiwgSW50ZWdlci52YWx1ZU9mKGluZGV4KSk7Ci0gICAgICAgICAgICByZXR1cm4gYmFzZU5vZGUubmV3Tm9kZShpKTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIEludGVnZXIgaSA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGF0dHJpYnV0ZXMsICJsZW5ndGgiKTsKLSAgICAgICAgaWYgKGkgPT0gbnVsbCkgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiBpLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJRGlzcGF0Y2ggaSA9IChJRGlzcGF0Y2gpIGF0dHJpYnV0ZXMuaW52b2tlMSgicmVtb3ZlTmFtZWRJdGVtIiwgbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gYmFzZU5vZGUubmV3Tm9kZShpKTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW0oTm9kZSBub2RlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIE5vZGVJbXBsKSkgewotICAgICAgICAgICAgSGVscGVyLm5vdFN1cHBvcnRlZCgpOwotICAgICAgICB9Ci0gICAgICAgIE5vZGVJbXBsIG5pID0gKE5vZGVJbXBsKSBub2RlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSURpc3BhdGNoIGkgPSAoSURpc3BhdGNoKSBhdHRyaWJ1dGVzLmludm9rZTEoInNldE5hbWVkSXRlbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaS5nZXRJTm9kZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBiYXNlTm9kZS5uZXdOb2RlKGkpOwotICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIHJlbW92ZU5hbWVkSXRlbShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJRGlzcGF0Y2ggaSA9IChJRGlzcGF0Y2gpIGF0dHJpYnV0ZXMuaW52b2tlMSgicmVtb3ZlTmFtZWRJdGVtIiwgbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gYmFzZU5vZGUubmV3Tm9kZShpKTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBnZXROYW1lZEl0ZW1OUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIGluaXRDYWNoZSgpOwotICAgICAgICBOb2RlIG4gPSAoTm9kZSkgYXR0ck1hcC5nZXQobmV3IEF0dHJLZXkobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpKTsKLSAgICAgICAgcmV0dXJuIG47Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgc2V0TmFtZWRJdGVtTlMoTm9kZSBub2RlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaW5pdENhY2hlKCk7Ci0gICAgICAgIE5vZGUgbiA9IChOb2RlKSBhdHRyTWFwLmdldChuZXcgQXR0cktleShub2RlLmdldE5hbWVzcGFjZVVSSSgpLCBub2RlLmdldExvY2FsTmFtZSgpKSk7Ci0gICAgICAgIHJldHVybiBzZXROYW1lZEl0ZW0obik7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgcmVtb3ZlTmFtZWRJdGVtTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGluaXRDYWNoZSgpOwotICAgICAgICBOb2RlIG4gPSAoTm9kZSkgYXR0ck1hcC5nZXQobmV3IEF0dHJLZXkobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpKTsKLSAgICAgICAgcmV0dXJuIHJlbW92ZU5hbWVkSXRlbShuLmdldE5vZGVOYW1lKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvTm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyNjMxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL05vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLkFuYWx5emVkUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklOb2RlRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5odG1sLkhUTUxFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLm9iamVjdC5PYmplY3RFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLlZvY2FidWxhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBOb2RlSW1wbCBpbXBsZW1lbnRzIE5vZGUgewotICAgIHByb3RlY3RlZCBmaW5hbCBJRGlzcGF0Y2ggaW5vZGU7Ci0KLSAgICBJRGlzcGF0Y2ggZ2V0SURpc3BhdGNoKCkgewotICAgICAgICByZXR1cm4gaW5vZGU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHNob3J0IG5vZGVUeXBlOwotCi0gICAgcHJpdmF0ZSBOb2RlSW1wbCBwYXJlbnROb2RlOwotCi0gICAgcHJpdmF0ZSBEb2N1bWVudEltcGwgZG9jOwotCi0gICAgU3RyaW5nIHVuaXF1ZU5hbWU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZShJRGlzcGF0Y2ggaW5vZGUpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJ1bmlxdWVJRCIpOwotICAgIH0KLQotICAgIHByaXZhdGUgTm9kZUltcGwgbmV3Tm9kZUJ5VHlwZShJRGlzcGF0Y2ggaW5vZGUsIHNob3J0IHR5cGUpIHsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERToKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXR0ckltcGwodGhpcywgaW5vZGUpOwotICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERToKLSAgICAgICAgICAgIC8vIHJldHVybiBuZXcgRG9jdW1lbnRJbXBsKGlub2RlKTsKLSAgICAgICAgICAgIC8vIFdlIHdvdWxkIGxpa2UgdG8ga2VlcCBvYmplY3QgaWRlbnRpdHkgb2YgRG9jdW1lbnRJbXBsLgotICAgICAgICAgICAgLy8gVGh1cyByZXR1cm5zIHRoZSBiYXNlIERvY3VtZW50SW1wbCB0aGF0IG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGRvY3VtZW50IG9mICJpbm9kZSIuCi0gICAgICAgICAgICByZXR1cm4gZG9jOwotCi0gICAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREU6Ci0gICAgICAgICAgICAvLyBjYXNlIE5vZGUuRE9DVU1FTlRfRkxBR01FTlRfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZUltcGwodGhpcywgaW5vZGUsIHR5cGUpOwotCi0gICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0gICAgICAgICAgICBpZiAoSGVscGVyLmhhc1Byb3BlcnR5KGlub2RlLCAiY29udGVudFdpbmRvdyIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEhUTUxFbGVtZW50RmFjdG9yeS5jcmVhdGUodGhpcywgaW5vZGUsICJGcmFtZU5vZGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgSGVscGVyLmdldChpbm9kZSwgIm5vZGVOYW1lIik7Ci0gICAgICAgICAgICBpZiAoIk9CSkVDVCIuZXF1YWxzKG5hbWUpIHx8ICJFTUJFRCIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgTm9kZUltcGwgbmV3Tm9kZSA9IE9iamVjdEVsZW1lbnRGYWN0b3J5LmNyZWF0ZSh0aGlzLCBpbm9kZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld05vZGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld05vZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSFRNTEVsZW1lbnRGYWN0b3J5LmNyZWF0ZSh0aGlzLCBpbm9kZSwgbmFtZSk7Ci0KLSAgICAgICAgY2FzZSBOb2RlLkVOVElUWV9OT0RFOgotICAgICAgICBjYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICBjYXNlIE5vZGUuTk9UQVRJT05fTk9ERToKLSAgICAgICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLSAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZUltcGwodGhpcywgaW5vZGUsIHR5cGUpOwotICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIEhUTUxFbGVtZW50RmFjdG9yeS5jcmVhdGUodGhpcywgaW5vZGUsICJUZXh0Iik7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZUltcGwodGhpcywgaW5vZGUsIHR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTm9kZUltcGwgbmV3Tm9kZShJRGlzcGF0Y2ggaW5vZGUpIHsKLSAgICAgICAgaWYgKGlub2RlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU3RyaW5nIHVuaXF1ZU5hbWUgPSBnZXRVbmlxdWVOYW1lKGlub2RlKTsKLSAgICAgICAgaWYgKHVuaXF1ZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgTm9kZUltcGwgYW5vZGUgPSBkb2MubG9va3VwTm9kZSh1bmlxdWVOYW1lKTsKLSAgICAgICAgICAgIGlmIChhbm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5vZGUucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBhbm9kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBJbnRlZ2VyIHZhbCA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlub2RlLCAibm9kZVR5cGUiKTsKLSAgICAgICAgaWYgKHZhbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHNob3J0IHR5cGUgPSAoc2hvcnQpIHZhbC5pbnRWYWx1ZSgpOwotICAgICAgICBOb2RlSW1wbCBub2RlID0gbmV3Tm9kZUJ5VHlwZShpbm9kZSwgdHlwZSk7Ci0KLSAgICAgICAgaWYgKHVuaXF1ZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbm9kZS51bmlxdWVOYW1lID0gdW5pcXVlTmFtZTsKLSAgICAgICAgICAgIGRvYy5yZWdOb2RlKHVuaXF1ZU5hbWUsIG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBub2RlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBOb2RlSW1wbCBuZXdOb2RlKElEaXNwYXRjaCBpbm9kZSwgc2hvcnQgdHlwZSkgewotICAgICAgICBpZiAoaW5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBTdHJpbmcgdW5pcXVlTmFtZSA9IGdldFVuaXF1ZU5hbWUoaW5vZGUpOwotICAgICAgICBpZiAodW5pcXVlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBOb2RlSW1wbCBhbm9kZSA9IGRvYy5sb29rdXBOb2RlKHVuaXF1ZU5hbWUpOwotICAgICAgICAgICAgaWYgKGFub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbm9kZS5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFub2RlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTm9kZUltcGwgbm9kZSA9IG5ld05vZGVCeVR5cGUoaW5vZGUsIHR5cGUpOwotICAgICAgICAgICAgbm9kZS51bmlxdWVOYW1lID0gdW5pcXVlTmFtZTsKLSAgICAgICAgICAgIGRvYy5yZWdOb2RlKHVuaXF1ZU5hbWUsIG5vZGUpOwotICAgICAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3Tm9kZUJ5VHlwZShpbm9kZSwgdHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTm9kZUltcGwgbmV3Tm9kZShJRGlzcGF0Y2ggaW5vZGUsIHNob3J0IHR5cGUsIE5vZGVJbXBsIHBhcmVudCkgewotICAgICAgICBOb2RlSW1wbCBub2RlID0gbmV3Tm9kZShpbm9kZSwgdHlwZSk7Ci0gICAgICAgIG5vZGUucGFyZW50Tm9kZSA9IHBhcmVudDsKLSAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIElEaXNwYXRjaCBnZXRJTm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIGlub2RlOwotICAgIH0KLQotICAgIC8vIFNwZWNpYWwgY29uc3RydWN0b3IgZm9yIERvY3VtZW50IE5vZGUuCi0gICAgTm9kZUltcGwoSURpc3BhdGNoIGlub2RlKSB7Ci0gICAgICAgIHRoaXMuZG9jID0gKERvY3VtZW50SW1wbCkgdGhpczsKLSAgICAgICAgdGhpcy5pbm9kZSA9IGlub2RlOwotICAgICAgICB0aGlzLm5vZGVUeXBlID0gTm9kZS5ET0NVTUVOVF9OT0RFOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBOb2RlSW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlub2RlLCBzaG9ydCBub2RlVHlwZSkgewotICAgICAgICB0aGlzLmRvYyA9IGJhc2VOb2RlLmRvYzsKLSAgICAgICAgdGhpcy5pbm9kZSA9IGlub2RlOwotICAgICAgICB0aGlzLm5vZGVUeXBlID0gbm9kZVR5cGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2FjaGVkTm9kZU5hbWUgPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLSAgICAgICAgaWYgKGNhY2hlZE5vZGVOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGNhY2hlZE5vZGVOYW1lID0gKFN0cmluZykgSGVscGVyLmdldChpbm9kZSwgIm5vZGVOYW1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhY2hlZE5vZGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCB0ZXh0ID0gSGVscGVyLmdldChpbm9kZSwgIm5vZGVWYWx1ZSIpOwotICAgICAgICBpZiAodGV4dCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIHRleHQ7Ci0gICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgSURpc3BhdGNoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgSGVscGVyLmdldCgoSURpc3BhdGNoKSB0ZXh0LCAiZGF0YSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgSGVscGVyLnB1dChpbm9kZSwgIm5vZGVWYWx1ZSIsIG5vZGVWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotICAgICAgICByZXR1cm4gbm9kZVR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLSAgICAgICAgaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgSURpc3BhdGNoIHBhcmVudCA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaW5vZGUsICJwYXJlbnROb2RlIik7Ci0gICAgICAgICAgICBwYXJlbnROb2RlID0gbmV3Tm9kZShwYXJlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJlbnROb2RlOwotICAgIH0KLQotICAgIHByaXZhdGUgTm9kZUxpc3ROZXh0U2libGluZ0ltcGwgY2FjaGVkQ2hpbGROb2RlczsKLQotICAgIHB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotICAgICAgICBpZiAoY2FjaGVkQ2hpbGROb2RlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYWNoZWRDaGlsZE5vZGVzLmluaXRpYWxpemUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgIC8vIENhdXRpb24hCi0gICAgICAgICAgICAgICAgLy8gRHVlIHRvIElFJ3MgcHJvYmxlbSwgImNoaWxkTm9kZXMiIHByb3BlcnR5IG1heSBoYXZlIHdyb25nIHZhbHVlCi0gICAgICAgICAgICAgICAgLy8gdW5sZXNzIHRoZSBkb2N1bWVudCBpcyB3ZWxsLWZvcm1lZC4gIFdlIGF2b2lkIHVzaW5nIHRoaXMgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgLy8gYW5kIHVzZSAibmV4dFNpYmxpbmciIGluc3RlYWQgb2YgdGhhdC4KLSAgICAgICAgICAgICAgICBJRGlzcGF0Y2ggbm9kZUNvbGxlY3Rpb24gPSAoSURpc3BhdGNoKSBIZWxwZXIuZ2V0KGlub2RlLCAiY2hpbGROb2RlcyIpOwotICAgICAgICAgICAgICAgIGlmIChub2RlQ29sbGVjdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAvLyBjYWNoZWRDaGlsZE5vZGVzID0gbmV3IE5vZGVMaXN0SW1wbCh0aGlzLCBub2RlQ29sbGVjdGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNhY2hlZENoaWxkTm9kZXMgPSBuZXcgTm9kZUxpc3ROZXh0U2libGluZ0ltcGwodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhY2hlZENoaWxkTm9kZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLSAgICAgICAgSURpc3BhdGNoIGZpcnN0Q2hpbGQgPSAoSURpc3BhdGNoKSBIZWxwZXIuZ2V0KGlub2RlLCAiZmlyc3RDaGlsZCIpOwotICAgICAgICByZXR1cm4gbmV3Tm9kZShmaXJzdENoaWxkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0gICAgICAgIElEaXNwYXRjaCBsYXN0Q2hpbGQgPSAoSURpc3BhdGNoKSBIZWxwZXIuZ2V0KGlub2RlLCAibGFzdENoaWxkIik7Ci0gICAgICAgIHJldHVybiBuZXdOb2RlKGxhc3RDaGlsZCk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0UHJldmlvdXNTaWJsaW5nKCkgewotICAgICAgICBJRGlzcGF0Y2ggcHJldmlvdXNTaWJsaW5nID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChpbm9kZSwgInByZXZpb3VzU2libGluZyIpOwotICAgICAgICByZXR1cm4gbmV3Tm9kZShwcmV2aW91c1NpYmxpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldE5leHRTaWJsaW5nKCkgewotICAgICAgICBJRGlzcGF0Y2ggbmV4dFNpYmxpbmcgPSAoSURpc3BhdGNoKSBIZWxwZXIuZ2V0KGlub2RlLCAibmV4dFNpYmxpbmciKTsKLSAgICAgICAgcmV0dXJuIG5ld05vZGUobmV4dFNpYmxpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLSAgICAgICAgSURpc3BhdGNoIGF0dHJpYnV0ZXMgPSAoSURpc3BhdGNoKSBIZWxwZXIuZ2V0KGlub2RlLCAiYXR0cmlidXRlcyIpOwotICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgTmFtZWROb2RlTWFwSW1wbCh0aGlzLCBhdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBpbnNlcnRCZWZvcmUoTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghKChuZXdDaGlsZCBpbnN0YW5jZW9mIE5vZGVJbXBsKSAmJiAocmVmQ2hpbGQgaW5zdGFuY2VvZiBOb2RlSW1wbCkpKSB7Ci0gICAgICAgICAgICBIZWxwZXIubm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgTm9kZUltcGwgbmNpID0gKE5vZGVJbXBsKSBuZXdDaGlsZDsKLSAgICAgICAgTm9kZUltcGwgcmNpID0gKE5vZGVJbXBsKSByZWZDaGlsZDsKLSAgICAgICAgSURpc3BhdGNoIGkgPSAoSURpc3BhdGNoKSBpbm9kZS5pbnZva2UoImluc2VydEJlZm9yZSIsIG5ldyBPYmplY3RbXSB7IG5jaS5nZXRJTm9kZSgpLCByY2kuZ2V0SU5vZGUoKSB9KTsKLSAgICAgICAgcmV0dXJuIG5ld05vZGUoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgcmVwbGFjZUNoaWxkKE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBpZiAoISgobmV3Q2hpbGQgaW5zdGFuY2VvZiBOb2RlSW1wbCkgJiYgKG9sZENoaWxkIGluc3RhbmNlb2YgTm9kZUltcGwpKSkgewotICAgICAgICAgICAgSGVscGVyLm5vdFN1cHBvcnRlZCgpOwotICAgICAgICB9Ci0gICAgICAgIE5vZGVJbXBsIG5jaSA9IChOb2RlSW1wbCkgbmV3Q2hpbGQ7Ci0gICAgICAgIE5vZGVJbXBsIG9jaSA9IChOb2RlSW1wbCkgb2xkQ2hpbGQ7Ci0gICAgICAgIElEaXNwYXRjaCBpID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlKCJyZXBsYWNlQ2hpbGQiLCBuZXcgT2JqZWN0W10geyBuY2kuZ2V0SU5vZGUoKSwgb2NpLmdldElOb2RlKCkgfSk7Ci0gICAgICAgIHJldHVybiBuZXdOb2RlKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIHJlbW92ZUNoaWxkKE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBpZiAoIShvbGRDaGlsZCBpbnN0YW5jZW9mIE5vZGVJbXBsKSkgewotICAgICAgICAgICAgSGVscGVyLm5vdFN1cHBvcnRlZCgpOwotICAgICAgICB9Ci0gICAgICAgIE5vZGVJbXBsIG9jaSA9IChOb2RlSW1wbCkgb2xkQ2hpbGQ7Ci0gICAgICAgIElEaXNwYXRjaCBpID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgicmVtb3ZlQ2hpbGQiLCBvY2kuZ2V0SU5vZGUoKSk7Ci0gICAgICAgIHJldHVybiBuZXdOb2RlKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGFwcGVuZENoaWxkKE5vZGUgbmV3Q2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBpZiAoIShuZXdDaGlsZCBpbnN0YW5jZW9mIE5vZGVJbXBsKSkgewotICAgICAgICAgICAgSGVscGVyLm5vdFN1cHBvcnRlZCgpOwotICAgICAgICB9Ci0gICAgICAgIE5vZGVJbXBsIG5jaSA9IChOb2RlSW1wbCkgbmV3Q2hpbGQ7Ci0gICAgICAgIElEaXNwYXRjaCBpID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiYXBwZW5kQ2hpbGQiLCBuY2kuZ2V0SU5vZGUoKSk7Ci0gICAgICAgIHJldHVybiBuZXdOb2RlKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkTm9kZXMoKSB7Ci0gICAgICAgIEJvb2xlYW4gYiA9IChCb29sZWFuKSBpbm9kZS5pbnZva2UwKCJoYXNDaGlsZE5vZGVzIik7Ci0gICAgICAgIGlmIChiID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLSAgICAgICAgSURpc3BhdGNoIGkgPSAoSURpc3BhdGNoKSBpbm9kZS5pbnZva2UxKCJjbG9uZU5vZGUiLCBCb29sZWFuLnZhbHVlT2YoZGVlcCkpOwotICAgICAgICByZXR1cm4gbmV3Tm9kZShpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3JtYWxpemUoKSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWQoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0gICAgICAgIC8vIFRPRE86IEN1cnJlbnRseSB3ZSByZWdhcmQgYWxsIGZlYXR1cmVzIGFyZSBub3Qgc3VwcG9ydGVkLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0gICAgICAgIFN0cmluZyByID0gKFN0cmluZykgSGVscGVyLmdldChpbm9kZSwgIm5hbWVzcGFjZVVSSSIpOwotICAgICAgICBpZiAociA9PSBudWxsKSByZXR1cm4gIiI7Ci0gICAgICAgIC8vIFRyZWF0IHRoZSBsb2NhbCBuYW1lc3BhY2UgYXMgbnVsbCBmb3IgWFBhdGggMS4wIGRhdGEgbW9kZWwuCi0gICAgICAgIGlmIChyLmxlbmd0aCgpID09IDApIHJldHVybiAiIjsKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIFN0cmluZyByID0gZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgaWYgKHIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgaW50IHBvcyA9IHIuaW5kZXhPZigiOiIpOwotICAgICAgICBpZiAocG9zIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgcmV0dXJuIHIuc3Vic3RyaW5nKDAsIHBvcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIHIgPSBnZXROb2RlTmFtZSgpOwotICAgICAgICBpZiAociA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICBpbnQgcG9zID0gci5pbmRleE9mKCI6Iik7Ci0gICAgICAgIGlmIChwb3MgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgIHJldHVybiByLnN1YnN0cmluZyhwb3MgKyAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkgewotICAgICAgICBJRGlzcGF0Y2ggYXR0cmlidXRlcyA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaW5vZGUsICJhdHRyaWJ1dGVzIik7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSSSgpIHsKLSAgICAgICAgLy8gTm8gd2F5IHRvIG9idGFpbiBiYXNlIFVSSSEKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKE5vZGUgb3RoZXIpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAvLyBXZSBkbyBub3Qgc3VwcG9ydCBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHRDb250ZW50KCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRleHRDb250ZW50KFN0cmluZyB0ZXh0Q29udGVudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2FtZU5vZGUoTm9kZSBvdGhlcikgewotICAgICAgICBpZiAodGhpcyA9PSBvdGhlcikKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBsb29rdXBQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGxvb2t1cE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRXF1YWxOb2RlKE5vZGUgYXJnKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YShTdHJpbmcga2V5KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgc2V0VXNlckRhdGEoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEsIFVzZXJEYXRhSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBJTm9kZUV4IGludGVyZmFjZQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIFN0cmluZyBnZXRMaW5rVVJJKCkgewotICAgICAgICBTdHJpbmcgdXJpID0gKFN0cmluZykgSGVscGVyLmdldChpbm9kZSwgImhyZWYiKTsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBOb2RlIHAgPSBnZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBpZiAocCBpbnN0YW5jZW9mIElOb2RlRXgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChJTm9kZUV4KSBwKS5nZXRMaW5rVVJJKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXJpOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBnZXRIZWFkaW5nTGV2ZWwoKSB7Ci0gICAgICAgIE5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSU5vZGVFeCkgewotICAgICAgICAgICAgcmV0dXJuICgoSU5vZGVFeCkgcGFyZW50KS5nZXRIZWFkaW5nTGV2ZWwoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHNob3J0KSAwOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQW5hbHl6ZWRSZXN1bHQgYW5hbHl6ZShBbmFseXplZFJlc3VsdCBhcikgewotICAgICAgICBpZiAoIVZvY2FidWxhcnkuaXNWYWxpZE5vZGUoKS5ldmFsKChJRXZhbFRhcmdldCkgdGhpcykpCi0gICAgICAgICAgICByZXR1cm4gYXI7Ci0gICAgICAgIE5vZGUgbiA9IGdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlIChuICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgSU5vZGVFeCkgewotICAgICAgICAgICAgICAgIGFyID0gKChJTm9kZUV4KSBuKS5hbmFseXplKGFyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG4gPSBuLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgaWYgKEhlbHBlci5oYXNQcm9wZXJ0eShpbm9kZSwgInZhbHVlIikpIHsKLSAgICAgICAgICAgIEhlbHBlci5wdXQoaW5vZGUsICJ2YWx1ZSIsIHRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTm9kZUltcGwgZWxlbWVudCA9IChOb2RlSW1wbCkgZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgaWYgKCJURVhUQVJFQSIuZXF1YWxzKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgSURpc3BhdGNoIHRyID0gKElEaXNwYXRjaCkgZWxlbWVudC5pbm9kZS5pbnZva2UwKCJjcmVhdGVUZXh0UmFuZ2UiKTsKLSAgICAgICAgICAgICAgICBIZWxwZXIucHV0KHRyLCAidGV4dCIsIHRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICBTdHJpbmcgcmV0ID0gIiI7Ci0gICAgICAgIGlmIChIZWxwZXIuaGFzUHJvcGVydHkoaW5vZGUsICJ2YWx1ZSIpKSB7Ci0gICAgICAgIAlPYmplY3Qgb2JqID0gSGVscGVyLmdldChpbm9kZSwgInZhbHVlIik7Ci0gICAgICAgIAlpZihvYmogaW5zdGFuY2VvZiBTdHJpbmcpewotICAgICAgICAJCXJldHVybiAoU3RyaW5nKW9iajsKLSAgICAgICAgCX1lbHNlIGlmKG51bGwgIT0gb2JqKXsKLSAgICAgICAgCQkvL1RPRE8gY2hlY2sgb3RoZXIgY2FzZQotICAgICAgICAJCS8vU3lzdGVtLmVyci5wcmludGxuKG9iaisiICIrb2JqLnRvU3RyaW5nKCkpOwotICAgICAgICAJCXJldHVybiBvYmoudG9TdHJpbmcoKTsKLSAgICAgICAgCX0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE5vZGVJbXBsIGVsZW1lbnQgPSAoTm9kZUltcGwpIGdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgIGlmICgiVEVYVEFSRUEiLmVxdWFscyhlbGVtZW50LmdldExvY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIElEaXNwYXRjaCB0ciA9IChJRGlzcGF0Y2gpIGVsZW1lbnQuaW5vZGUuaW52b2tlMCgiY3JlYXRlVGV4dFJhbmdlIik7Ci0gICAgICAgICAgICAgICAgcmV0ID0gKFN0cmluZykgSGVscGVyLmdldCh0ciwgInRleHQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmV0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROdGgoKSB7Ci0gICAgICAgIElEaXNwYXRjaCBjdXJyZW50ID0gaW5vZGU7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAxOyBjdXJyZW50ICE9IG51bGw7IGkrKykgewotICAgICAgICAgICAgY3VycmVudCA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoY3VycmVudCwgInByZXZpb3VzU2libGluZyIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCAidW5pcXVlSUQiKTsKLSAgICB9Ci0KLSAgICAvLyAhRk4hCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFN0aWxsUGljdHVyZURhdGEoKSB7Ci0gICAgICAgIFN0cmluZ1tdIHJldCA9IG5ldyBTdHJpbmdbM107Ci0gICAgICAgIHJldFsxXSA9IChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJzcmMiKTsKLSAgICAgICAgcmV0WzJdID0gIiI7Ci0gICAgICAgIFN0cmluZyBtdCA9IChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJtaW1lVHlwZSIpOwotICAgICAgICBpZiAobXQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0WzBdID0gIiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtdCA9IG10LnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBpZiAobXQuY29udGFpbnMoIkdJRiIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0WzBdID0gImltYWdlL2dpZiI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG10LmNvbnRhaW5zKCJKUEVHIikpIHsKLSAgICAgICAgICAgICAgICByZXRbMF0gPSAiaW1hZ2UvanBlZyI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG10LmNvbnRhaW5zKCJQTkciKSkgewotICAgICAgICAgICAgICAgIHJldFswXSA9ICJpbWFnZS9wbmciOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXRbMF0gPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvTm9kZUxpc3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL05vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjYyMDE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5EaXNwYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklEaXNwYXRjaDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLQotcHVibGljIGNsYXNzIE5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIE5vZGVMaXN0IHsKLSAgICBwcml2YXRlIElEaXNwYXRjaCBpbm9kZUNvbGxlY3Rpb247Ci0gICAgcHJpdmF0ZSBOb2RlSW1wbCBiYXNlTm9kZTsKLQotICAgIHB1YmxpYyBOb2RlTGlzdEltcGwoTm9kZUltcGwgYmFzZU5vZGUsIElEaXNwYXRjaCBpbm9kZUNvbGxlY3Rpb24pIHsKLSAgICAgICAgdGhpcy5iYXNlTm9kZSA9IGJhc2VOb2RlOwotICAgICAgICB0aGlzLmlub2RlQ29sbGVjdGlvbiA9IGlub2RlQ29sbGVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSURpc3BhdGNoIGkgPSAoSURpc3BhdGNoKSBpbm9kZUNvbGxlY3Rpb24uaW52b2tlMSgiaXRlbSIsIEludGVnZXIudmFsdWVPZihpbmRleCkpOwotICAgICAgICAgICAgcmV0dXJuIGJhc2VOb2RlLm5ld05vZGUoaSk7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIEludGVnZXIgaSA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlub2RlQ29sbGVjdGlvbiwgImxlbmd0aCIpOwotICAgICAgICBpZiAoaSA9PSBudWxsKSByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIGkuaW50VmFsdWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL05vZGVMaXN0TmV4dFNpYmxpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL05vZGVMaXN0TmV4dFNpYmxpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGJiYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9Ob2RlTGlzdE5leHRTaWJsaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBOb2RlTGlzdE5leHRTaWJsaW5nSW1wbCBpbXBsZW1lbnRzIE5vZGVMaXN0IHsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxOb2RlSW1wbD4gaW5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdDxOb2RlSW1wbD4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgTm9kZUltcGwgYmFzZU5vZGU7Ci0KLSAgICBwdWJsaWMgTm9kZUxpc3ROZXh0U2libGluZ0ltcGwoTm9kZUltcGwgYmFzZU5vZGUpIHsKLSAgICAgICAgdGhpcy5iYXNlTm9kZSA9IGJhc2VOb2RlOwotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgaW5vZGVMaXN0LmNsZWFyKCk7Ci0gICAgICAgIE5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIGJhc2VOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCJIVE1MIi5lcXVhbHMobm9kZS5nZXROb2RlTmFtZSgpKSAmJiAhKCIjZG9jdW1lbnQiLmVxdWFscyhiYXNlTm9kZS5nZXROb2RlTmFtZSgpKSkpIHsKLSAgICAgICAgICAgICAgICBub2RlID0gKE5vZGVJbXBsKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpbm9kZUxpc3QuYWRkKG5vZGUpOwotICAgICAgICAgICAgbm9kZSA9IChOb2RlSW1wbCkgbm9kZS5nZXROZXh0U2libGluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpbm9kZUxpc3QuZ2V0KGluZGV4KTsKLSAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gaW5vZGVMaXN0LnNpemUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL1NpbmdsZXRvbk5vZGVMaXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9TaW5nbGV0b25Ob2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlMDJkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL1NpbmdsZXRvbk5vZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0KLXB1YmxpYyBjbGFzcyBTaW5nbGV0b25Ob2RlTGlzdEltcGwgaW1wbGVtZW50cyBOb2RlTGlzdCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBOb2RlIG5vZGU7Ci0gICAgcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGluZGV4ID09IDApIHJldHVybiBub2RlOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcHVibGljIFNpbmdsZXRvbk5vZGVMaXN0SW1wbChOb2RlIG5vZGUpIHsKLSAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL1N0eWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9TdHlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0MWIwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL1N0eWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBTdHlsZUltcGwgaW1wbGVtZW50cyBJU3R5bGUgewotICAgIAotICAgIElEaXNwYXRjaCBzdHlsZTsKLSAgICAKLSAgICBwdWJsaWMgU3R5bGVJbXBsKElEaXNwYXRjaCBzdHlsZSl7Ci0gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gSGVscGVyLmdldChzdHlsZSwgbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcHV0KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIEhlbHBlci5wdXQoc3R5bGUsIG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvU3R5bGVTaGVldEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvU3R5bGVTaGVldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiNDI0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL1N0eWxlU2hlZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci0KLQotcHVibGljIGNsYXNzIFN0eWxlU2hlZXRJbXBsIHsKLSAgICBwcml2YXRlIElEaXNwYXRjaCBpZGlzcGF0Y2g7Ci0gICAgCi0gICAgcHVibGljIFN0eWxlU2hlZXRJbXBsKElEaXNwYXRjaCBpZGlzcGF0Y2gpIHsKLSAgICAgICAgdGhpcy5pZGlzcGF0Y2ggPSBpZGlzcGF0Y2g7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUnVsZShTdHJpbmcgc2VsZWN0b3IsIFN0cmluZyBzdHlsZSkgewotICAgICAgICBpZGlzcGF0Y2guaW52b2tlKCJhZGRSdWxlIiwgbmV3IE9iamVjdFtde3NlbGVjdG9yLCBzdHlsZX0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9DaGFyYWN0ZXJEYXRhSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL0NoYXJhY3RlckRhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNDljNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL0NoYXJhY3RlckRhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmh0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSURpc3BhdGNoOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0KLQotYWJzdHJhY3QgY2xhc3MgQ2hhcmFjdGVyRGF0YUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIENoYXJhY3RlckRhdGEgewotICAgIENoYXJhY3RlckRhdGFJbXBsKE5vZGVJbXBsIGJhc2VOb2RlLCBJRGlzcGF0Y2ggaW5vZGUsIHNob3J0IHR5cGUpIHsKLSAgICAgICAgc3VwZXIoYmFzZU5vZGUsIGlub2RlLCB0eXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJkYXRhIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIEhlbHBlci5wdXQoaW5vZGUsICJkYXRhIiwgZGF0YSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIEludGVnZXIgaSA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlub2RlLCAibGVuZ3RoIik7Ci0gICAgICAgIGlmIChpID09IG51bGwpIHJldHVybiAwOwotICAgICAgICByZXR1cm4gaS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgc3Vic3RyaW5nRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgciA9IChTdHJpbmcpIGlub2RlLmludm9rZSgic3Vic3RyaW5nRGF0YSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2Yob2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudmFsdWVPZihjb3VudCl9KTsKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kRGF0YShTdHJpbmcgc3RyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaW5vZGUuaW52b2tlMSgiYXBwZW5kRGF0YSIsIHN0cik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0RGF0YShpbnQgb2Zmc2V0LCBTdHJpbmcgc3RyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaW5vZGUuaW52b2tlKCJpbnNlcnREYXRhIiwKLSAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2Yob2Zmc2V0KSwgc3RyfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBpbm9kZS5pbnZva2UoImRlbGV0ZURhdGEiLAotICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde0ludGVnZXIudmFsdWVPZihvZmZzZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudmFsdWVPZihjb3VudCl9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQsIFN0cmluZyBzdHIpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBpbm9kZS5pbnZva2UoInJlcGxhY2VEYXRhIiwKLSAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2Yob2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnZhbHVlT2YoY291bnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cn0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQWJzdHJhY3RUZXJtcyBnZXRUZXJtcygpewotICAgICAgICByZXR1cm4gSFRNTFRlcm1zLmdldEluc3RhbmNlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2h0bWwvRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4Y2JkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2h0bWwvRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmh0bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLkFuYWx5emVkUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLkRvbUJ5Q29tOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklEb2N1bWVudEV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklFbGVtZW50RXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU5vZGVFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5BdHRySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLlN0eWxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuVm9jYWJ1bGFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLkRpc3BhdGNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSURpc3BhdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlR5cGVJbmZvOwotCi1wdWJsaWMgY2xhc3MgRWxlbWVudEltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIElFbGVtZW50RXggewotCXByb3RlY3RlZCBFbGVtZW50SW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlub2RlKSB7Ci0JCXN1cGVyKGJhc2VOb2RlLCBpbm9kZSwgTm9kZS5FTEVNRU5UX05PREUpOwotCX0KLQotCXByb3RlY3RlZCBFbGVtZW50SW1wbChEb2N1bWVudEltcGwgYmFzZURvYywgSURpc3BhdGNoIGlub2RlKSB7Ci0JCXN1cGVyKGJhc2VEb2MsIGlub2RlLCBOb2RlLkVMRU1FTlRfTk9ERSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWdOYW1lKCkgewotCQlyZXR1cm4gKFN0cmluZykgSGVscGVyLmdldChpbm9kZSwgInRhZ05hbWUiKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIGdldFNldEF0dHJpYnV0ZUZsYWcgPSBJbnRlZ2VyLnZhbHVlT2YoMik7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQlJRGlzcGF0Y2ggciA9IChJRGlzcGF0Y2gpIGlub2RlLmludm9rZTEoImdldEF0dHJpYnV0ZU5vZGUiLCBuYW1lKTsKLQkJaWYgKHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgSGVscGVyLmdldChyLCAic3BlY2lmaWVkIik7Ci0JCWlmICghYi5ib29sZWFuVmFsdWUoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFN0cmluZykgSGVscGVyLmdldChyLCAidmFsdWUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlub2RlLmludm9rZSgic2V0QXR0cmlidXRlIiwgbmV3IE9iamVjdFtdIHsgbmFtZSwgdmFsdWUsCi0JCQkJZ2V0U2V0QXR0cmlidXRlRmxhZyB9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpbm9kZS5pbnZva2UxKCJyZW1vdmVBdHRyaWJ1dGUiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIHIgPSAoU3RyaW5nKSBpbm9kZS5pbnZva2UoImdldEF0dHJpYnV0ZSIsIG5ldyBPYmplY3RbXSB7IG5hbWUsCi0JCQkJZ2V0U2V0QXR0cmlidXRlRmxhZyB9KTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLy8gcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkvLyBJRGlzcGF0Y2ggciA9IChJRGlzcGF0Y2gpIGlub2RlLmludm9rZTEoImdldEF0dHJpYnV0ZU5vZGUiLCBuYW1lKTsKLQkvLyBpZiAociA9PSBudWxsKQotCS8vIHJldHVybiBudWxsOwotCS8vIEJvb2xlYW4gYiA9IChCb29sZWFuKSBIZWxwZXIuZ2V0KHIsICJzcGVjaWZpZWQiKTsKLQkvLyBpZiAoIWIuYm9vbGVhblZhbHVlKCkpCi0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gcmV0dXJuIChTdHJpbmcpIEhlbHBlci5nZXQociwgInZhbHVlIik7Ci0JLy8gfQotCi0JcHVibGljIEF0dHIgZ2V0QXR0cmlidXRlTm9kZShTdHJpbmcgbmFtZSkgewotCQlJRGlzcGF0Y2ggciA9IChJRGlzcGF0Y2gpIGlub2RlLmludm9rZTEoImdldEF0dHJpYnV0ZU5vZGUiLCBuYW1lKTsKLQkJaWYgKHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEF0dHIpIG5ld05vZGUociwgTm9kZS5BVFRSSUJVVEVfTk9ERSk7Ci0JfQotCi0JcHVibGljIEF0dHIgc2V0QXR0cmlidXRlTm9kZShBdHRyIG5ld0F0dHIpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIShuZXdBdHRyIGluc3RhbmNlb2YgQXR0ckltcGwpKSB7Ci0JCQlIZWxwZXIubm90U3VwcG9ydGVkKCk7Ci0JCX0KLQkJQXR0ckltcGwgYSA9IChBdHRySW1wbCkgbmV3QXR0cjsKLQkJSURpc3BhdGNoIHIgPSAoSURpc3BhdGNoKSBpbm9kZS5pbnZva2UxKCJzZXRBdHRyaWJ1dGVOb2RlIiwgYQotCQkJCS5nZXRJTm9kZSgpKTsKLQkJaWYgKHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEF0dHIpIG5ld05vZGUociwgTm9kZS5BVFRSSUJVVEVfTk9ERSk7Ci0JfQotCi0JcHVibGljIEF0dHIgcmVtb3ZlQXR0cmlidXRlTm9kZShBdHRyIG9sZEF0dHIpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIShvbGRBdHRyIGluc3RhbmNlb2YgQXR0ckltcGwpKSB7Ci0JCQlIZWxwZXIubm90U3VwcG9ydGVkKCk7Ci0JCX0KLQkJQXR0ckltcGwgYSA9IChBdHRySW1wbCkgb2xkQXR0cjsKLQkJSURpc3BhdGNoIHIgPSAoSURpc3BhdGNoKSBpbm9kZS5pbnZva2UxKCJyZW1vdmVBdHRyaWJ1dGVOb2RlIiwgYQotCQkJCS5nZXRJTm9kZSgpKTsKLQkJaWYgKHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEF0dHIpIG5ld05vZGUociwgTm9kZS5BVFRSSUJVVEVfTk9ERSk7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCUlEaXNwYXRjaCByID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCBuYW1lKTsKLQkJaWYgKHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCh0aGlzLCByKTsKLQl9Ci0KLQlwcml2YXRlIE5hbWVkTm9kZU1hcEltcGwgY2FjaGVkQXR0cmlidXRlczsKLQotCXByaXZhdGUgdm9pZCBpbml0Q2FjaGUoKSB7Ci0JCWlmIChjYWNoZWRBdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNhY2hlZEF0dHJpYnV0ZXMgPSAoTmFtZWROb2RlTWFwSW1wbCkgZ2V0QXR0cmlidXRlcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQlpbml0Q2FjaGUoKTsKLQkJQXR0ciBhID0gKEF0dHIpIGNhY2hlZEF0dHJpYnV0ZXMKLQkJCQkuZ2V0TmFtZWRJdGVtTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOwotCQlpZiAoYSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBhLmdldFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUsCi0JCQlTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKQotCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWluaXRDYWNoZSgpOwotCQlBdHRyIGEgPSAoQXR0cikgY2FjaGVkQXR0cmlidXRlcwotCQkJCS5nZXROYW1lZEl0ZW1OUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7Ci0JCWlmIChhID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXJlbW92ZUF0dHJpYnV0ZU5vZGUoYSk7Ci0JfQotCi0JcHVibGljIEF0dHIgZ2V0QXR0cmlidXRlTm9kZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHsKLQkJaW5pdENhY2hlKCk7Ci0JCUF0dHIgYSA9IChBdHRyKSBjYWNoZWRBdHRyaWJ1dGVzCi0JCQkJLmdldE5hbWVkSXRlbU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKLQkJaWYgKGEgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQlwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlTlMoQXR0ciBuZXdBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIHZhbCA9IGdldEF0dHJpYnV0ZShuYW1lKTsKLQkJaWYgKHZhbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0JCVN0cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7Ci0JCWlmICh2YWwgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFR5cGVJbmZvIGdldFNjaGVtYVR5cGVJbmZvKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0lkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLAotCQkJYm9vbGVhbiBpc0lkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOb2RlKEF0dHIgaWRBdHRyLCBib29sZWFuIGlzSWQpCi0JCQl0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBJTm9kZUV4IGludGVyZmFjZQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQlwdWJsaWMgYm9vbGVhbiBkb0NsaWNrKCkgewotCQl0cnkgewotCQkJaWYgKCJPUFRJT04iLmVxdWFscyhnZXRMb2NhbE5hbWUoKSkpIHsKLQkJCQlIZWxwZXIucHV0KGlub2RlLCAic2VsZWN0ZWQiLCBCb29sZWFuLnZhbHVlT2YodHJ1ZSkpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmICgiU0VMRUNUIi5lcXVhbHMoZ2V0TG9jYWxOYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaW5vZGUuaW52b2tlMCgiY2xpY2siKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgb3JpZ2luYWxCb3JkZXI7Ci0KLQlwdWJsaWMgYm9vbGVhbiBoaWdobGlnaHQoKSB7Ci0JCWlmIChEb21CeUNvbS5CT1JERVJfTU9ERSA9PSBEb21CeUNvbS5TVFlMRV9CT1JERVIpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCAiY2xhc3NOYW1lIik7Ci0JCQlpZiAoY2xhc3NOYW1lID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJY2xhc3NOYW1lICs9ICIgQ1NTdG9IaWdobGlnaHQiOwotCQkJSGVscGVyLnB1dChpbm9kZSwgImNsYXNzTmFtZSIsIGNsYXNzTmFtZSk7Ci0JCX0gZWxzZSBpZiAoRG9tQnlDb20uQk9SREVSX01PREUgPT0gRG9tQnlDb20uRElWX0JPUkRFUikgewotCQkJRWxlbWVudCBkaXYgPSBnZXRPd25lckRvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoRG9tQnlDb20uSURfRElWKTsKLQkJCUlTdHlsZSBzdHlsZSA9ICgoSUVsZW1lbnRFeCkgZGl2KS5nZXRTdHlsZSgpOwotCi0JCQlSZWN0YW5nbGUgciA9IEhlbHBlci5nZXRMb2NhdGlvbihpbm9kZSk7Ci0KLQkJCVN0cmluZyBjb21wYXRNb2RlID0gKChJRG9jdW1lbnRFeCkgZ2V0T3duZXJEb2N1bWVudCgpKQotCQkJCQkuZ2V0Q29tcGF0TW9kZSgpOwotCQkJaW50IHcgPSAwOwotCQkJaWYgKGNvbXBhdE1vZGUuZXF1YWxzKElEb2N1bWVudEV4LkNTUzFfQ09NUEFUKSkgewotCQkJCXcgPSAwOwotCQkJfSBlbHNlIGlmIChjb21wYXRNb2RlLmVxdWFscyhJRG9jdW1lbnRFeC5CQUNLX0NPTVBBVCkpIHsKLQkJCQl3ID0gRG9tQnlDb20uRElWX0JPUkRFUl9XSURUSCAqIDI7Ci0JCQl9Ci0KLQkJCXN0eWxlLnB1dCgibGVmdCIsIChyLnggLSBEb21CeUNvbS5ESVZfQk9SREVSX1dJRFRIKSArICJweCIpOwotCQkJc3R5bGUucHV0KCJ0b3AiLCAoci55IC0gRG9tQnlDb20uRElWX0JPUkRFUl9XSURUSCkgKyAicHgiKTsKLQkJCXN0eWxlLnB1dCgid2lkdGgiLCAoci53aWR0aCArIHcpICsgInB4Iik7Ci0JCQlzdHlsZS5wdXQoImhlaWdodCIsIChyLmhlaWdodCArIHcpICsgInB4Iik7Ci0JCX0gZWxzZSBpZiAoRG9tQnlDb20uQk9SREVSX01PREUgPT0gRG9tQnlDb20uU1RZTEVfQk9SREVSMikgewotCQkJSURpc3BhdGNoIHN0eWxlID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChpbm9kZSwgInN0eWxlIik7Ci0JCQlpZiAoc3R5bGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlvcmlnaW5hbEJvcmRlciA9IChTdHJpbmcpIEhlbHBlci5nZXQoc3R5bGUsICJjc3NUZXh0Iik7Ci0JCQlTdHJpbmcgYm9yZGVyID0gb3JpZ2luYWxCb3JkZXIgKyBEb21CeUNvbS5CT1JERVJfU1RZTEVfU1RSSU5HOwotCQkJSGVscGVyLnB1dChzdHlsZSwgImNzc1RleHQiLCBib3JkZXIpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWlub2RlLmludm9rZTAoInNjcm9sbEludG9WaWV3Iik7Ci0JCQlpbm9kZS5pbnZva2UwKCJvbm1vdXNlb3ZlciIpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdW5oaWdobGlnaHQoKSB7Ci0JCWlmIChEb21CeUNvbS5CT1JERVJfTU9ERSA9PSBEb21CeUNvbS5TVFlMRV9CT1JERVIpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCAiY2xhc3NOYW1lIik7Ci0JCQlpZiAoY2xhc3NOYW1lID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nIG5ld0NsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlQWxsKCIgQ1NTdG9IaWdobGlnaHQiLCAiIik7Ci0JCQlIZWxwZXIucHV0KGlub2RlLCAiY2xhc3NOYW1lIiwgbmV3Q2xhc3NOYW1lKTsKLQkJfSBlbHNlIGlmIChEb21CeUNvbS5CT1JERVJfTU9ERSA9PSBEb21CeUNvbS5ESVZfQk9SREVSKSB7Ci0JCQlFbGVtZW50IGRpdiA9IGdldE93bmVyRG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChEb21CeUNvbS5JRF9ESVYpOwotCQkJSVN0eWxlIHN0eWxlID0gKChJRWxlbWVudEV4KSBkaXYpLmdldFN0eWxlKCk7Ci0JCQlzdHlsZS5wdXQoImxlZnQiLCAiLTEwMDBweCIpOwotCQkJc3R5bGUucHV0KCJ0b3AiLCAiLTEwMDBweCIpOwotCQkJc3R5bGUucHV0KCJ3aWR0aCIsICIxMDBweCIpOwotCQkJc3R5bGUucHV0KCJoZWlnaHQiLCAiMTAwcHgiKTsKLQkJfSBlbHNlIGlmIChEb21CeUNvbS5CT1JERVJfTU9ERSA9PSBEb21CeUNvbS5TVFlMRV9CT1JERVIyKSB7Ci0JCQlJRGlzcGF0Y2ggc3R5bGUgPSAoSURpc3BhdGNoKSBIZWxwZXIuZ2V0KGlub2RlLCAic3R5bGUiKTsKLQkJCWlmIChzdHlsZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCUhlbHBlci5wdXQoc3R5bGUsICJjc3NUZXh0Iiwgb3JpZ2luYWxCb3JkZXIpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWlub2RlLmludm9rZTAoIm9ubW91c2VvdXQiKTsKLQkJfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgSW5wdXRUeXBlIHsKLQkJcHVibGljIGVudW0gSW5wdXRDbGFzcyB7Ci0JCQlFRElULCBCVVRUT04sIFJBRElPLCBDSEVDS0JPWCwgQ09NQk9CT1gsIEhJRERFTiwgUEFTU1dPUkQsIEZJTEUKLQkJfQotCi0JCXByaXZhdGUgZmluYWwgSW5wdXRDbGFzcyBpbnB1dENsYXNzOwotCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHVpU3RyaW5nOwotCi0JCVN0cmluZyBnZXRVSVN0cmluZygpIHsKLQkJCXJldHVybiB1aVN0cmluZzsKLQkJfQotCi0JCWJvb2xlYW4gaXNFZGl0KCkgewotCQkJcmV0dXJuIChpbnB1dENsYXNzID09IElucHV0Q2xhc3MuRURJVCk7Ci0JCX0KLQotCQlib29sZWFuIGlzRmlsZUVkaXQoKSB7Ci0JCQlyZXR1cm4gKGlucHV0Q2xhc3MgPT0gSW5wdXRDbGFzcy5GSUxFKTsKLQkJfQotCi0JCWJvb2xlYW4gaXNCdXR0b24oKSB7Ci0JCQlyZXR1cm4gKGlucHV0Q2xhc3MgPT0gSW5wdXRDbGFzcy5CVVRUT04pOwotCQl9Ci0KLQkJYm9vbGVhbiBpc1JhZGlvKCkgewotCQkJcmV0dXJuIChpbnB1dENsYXNzID09IElucHV0Q2xhc3MuUkFESU8pOwotCQl9Ci0KLQkJYm9vbGVhbiBpc0NoZWNrQm94KCkgewotCQkJcmV0dXJuIChpbnB1dENsYXNzID09IElucHV0Q2xhc3MuQ0hFQ0tCT1gpOwotCQl9Ci0KLQkJYm9vbGVhbiBpc0NvbWJvQm94KCkgewotCQkJcmV0dXJuIChpbnB1dENsYXNzID09IElucHV0Q2xhc3MuQ09NQk9CT1gpOwotCQl9Ci0KLQkJYm9vbGVhbiBpc0hpZGRlbigpIHsKLQkJCXJldHVybiAoaW5wdXRDbGFzcyA9PSBJbnB1dENsYXNzLkhJRERFTik7Ci0JCX0KLQotCQlib29sZWFuIGlzUGFzc3dvcmQoKSB7Ci0JCQlyZXR1cm4gKGlucHV0Q2xhc3MgPT0gSW5wdXRDbGFzcy5QQVNTV09SRCk7Ci0JCX0KLQotCQlib29sZWFuIGlzQ2xpY2thYmxlKCkgewotCQkJcmV0dXJuIChpc0J1dHRvbigpIHx8IGlzUmFkaW8oKSB8fCBpc0NoZWNrQm94KCkgfHwgaXNDb21ib0JveCgpKTsKLQkJfQotCi0JCWZpbmFsIFN0cmluZyBodG1sVHlwZTsKLQotCQlJbnB1dFR5cGUoU3RyaW5nIHVpU3RyaW5nLCBTdHJpbmcgaHRtbFR5cGUsIElucHV0Q2xhc3MgaW5wdXRDbGFzcykgewotCQkJdGhpcy51aVN0cmluZyA9IHVpU3RyaW5nOwotCQkJdGhpcy5odG1sVHlwZSA9IGh0bWxUeXBlOwotCQkJdGhpcy5pbnB1dENsYXNzID0gaW5wdXRDbGFzczsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5wdXRUeXBlW10gSFRNTElOUFVUQ0xBU1NFUyA9IG5ldyBJbnB1dFR5cGVbXSB7Ci0JCQluZXcgSW5wdXRUeXBlKCJlZGl0IiwgInRleHQiLCBJbnB1dFR5cGUuSW5wdXRDbGFzcy5FRElUKSwKLQkJCW5ldyBJbnB1dFR5cGUoInBhc3N3b3JkIGVkaXQiLCAicGFzc3dvcmQiLAotCQkJCQlJbnB1dFR5cGUuSW5wdXRDbGFzcy5QQVNTV09SRCksCi0JCQluZXcgSW5wdXRUeXBlKCJyYWRpbyBidXR0b24iLCAicmFkaW8iLCBJbnB1dFR5cGUuSW5wdXRDbGFzcy5SQURJTyksCi0JCQluZXcgSW5wdXRUeXBlKCJjaGVja2JveCIsICJjaGVja2JveCIsIElucHV0VHlwZS5JbnB1dENsYXNzLkNIRUNLQk9YKSwKLQkJCW5ldyBJbnB1dFR5cGUoImZpbGUgdXBsb2FkIGVkaXQiLCAiZmlsZSIsIElucHV0VHlwZS5JbnB1dENsYXNzLkZJTEUpLAotCQkJbmV3IElucHV0VHlwZSgiIiwgImhpZGRlbiIsIElucHV0VHlwZS5JbnB1dENsYXNzLkhJRERFTiksCi0JCQluZXcgSW5wdXRUeXBlKCJidXR0b24iLCAic3VibWl0IiwgSW5wdXRUeXBlLklucHV0Q2xhc3MuQlVUVE9OKSwKLQkJCW5ldyBJbnB1dFR5cGUoInJlc2V0IGJ1dHRvbiIsICJyZXNldCIsIElucHV0VHlwZS5JbnB1dENsYXNzLkJVVFRPTiksCi0JCQluZXcgSW5wdXRUeXBlKCJidXR0b24iLCAiYnV0dG9uIiwgSW5wdXRUeXBlLklucHV0Q2xhc3MuQlVUVE9OKSwKLQkJCW5ldyBJbnB1dFR5cGUoImJ1dHRvbiIsICJpbWFnZSIsIElucHV0VHlwZS5JbnB1dENsYXNzLkJVVFRPTikgfTsKLQotCUlucHV0VHlwZSBnZXRJbnB1dFR5cGUoKSB7Ci0JCU9iamVjdCBvID0gSGVscGVyLmdldChpbm9kZSwgInR5cGUiKTsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIFN0cmluZykpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSAoU3RyaW5nKSBvOwotCQlmb3IgKGludCBpID0gMDsgaSA8IEhUTUxJTlBVVENMQVNTRVMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0eXBlLmVxdWFscyhIVE1MSU5QVVRDTEFTU0VTW2ldLmh0bWxUeXBlKSkgewotCQkJCXJldHVybiBIVE1MSU5QVVRDTEFTU0VTW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldElucHV0VmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCAidmFsdWUiKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBtb2RpZnlTcmNTdHIoU3RyaW5nIHNyYykgewotCQlpbnQgc3QgPSBzcmMubGFzdEluZGV4T2YoJy8nKTsKLQkJaW50IGVuZCA9IHNyYy5sYXN0SW5kZXhPZignPycpOwotCQlpZiAoZW5kID09IC0xKQotCQkJZW5kID0gc3JjLmxlbmd0aCgpOwotCQlpZiAoc3QgPCAwKSB7Ci0JCQlpZiAoZW5kIDwgMCkKLQkJCQlyZXR1cm4gc3JjOwotCQkJc3QgPSAwOwotCQl9IGVsc2UgewotCQkJc3QrKzsKLQkJfQotCQlpZiAoZW5kIDw9IHN0KSB7Ci0JCQlyZXR1cm4gc3JjLnN1YnN0cmluZyhzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3JjLnN1YnN0cmluZyhzdCwgZW5kKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdFN0cmluZygpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRMb2NhbE5hbWUoKTsKLQkJaWYgKCJJTUciLmVxdWFscyhuYW1lKSkgewotCi0JCQlTdHJpbmcgYWx0ID0gZ2V0QXR0cmlidXRlKCJhbHQiKTsKLQkJCWlmIChhbHQgIT0gbnVsbCkgewotCQkJCWFsdCA9IEhlbHBlci50cmltSFRNTFN0cihhbHQpOwotCQkJfQotCQkJU3RyaW5nIHRpdGxlID0gZ2V0QXR0cmlidXRlKCJ0aXRsZSIpOwotCQkJaWYgKHRpdGxlICE9IG51bGwpIHsKLQkJCQl0aXRsZSA9IEhlbHBlci50cmltSFRNTFN0cih0aXRsZSk7Ci0JCQkJaWYgKGFsdCA9PSBudWxsIHx8IGFsdC5sZW5ndGgoKSA9PSAwKQotCQkJCQlhbHQgPSB0aXRsZTsKLQkJCX0KLQotCQkJU3RyaW5nIHNyYyA9IGdldEF0dHJpYnV0ZSgic3JjIik7Ci0JCQlpZiAoc3JjICE9IG51bGwpIHsKLQkJCQlzcmMgPSBtb2RpZnlTcmNTdHIoc3JjKTsKLQkJCX0KLQotCQkJYm9vbGVhbiBub0FsdCA9IChhbHQgPT0gbnVsbCk7Ci0JCQlib29sZWFuIG51bGxBbHQgPSAoKGFsdCAhPSBudWxsKSAmJiAoYWx0Lmxlbmd0aCgpID09IDApKTsKLQkJCWJvb2xlYW4gaXNMaW5rID0gVm9jYWJ1bGFyeS5pc0xpbmsoKS5ldmFsKHRoaXMpOwotCi0JCQlpZiAoaXNMaW5rKSB7Ci0JCQkJaWYgKG5vQWx0KSB7Ci0JCQkJCWlmIChWb2NhYnVsYXJ5LmlzUmVhZE5vQWx0SW1hZ2VMaW5rKCkpIHsKLQkJCQkJCXJldHVybiBzcmM7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gIiI7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKG51bGxBbHQgJiYgVm9jYWJ1bGFyeS5pc1JlYWROdWxsQWx0SW1hZ2VMaW5rKCkpIHsKLQkJCQkJaWYgKGZhbHNlKSB7Ci0JCQkJCQlpZiAoYW55VGV4dEluUGFyZW50TGluaygpKQotCQkJCQkJCXJldHVybiBhbHQ7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHNyYzsKLQkJCQl9Ci0JCQkJcmV0dXJuIGFsdDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG5vQWx0KSB7Ci0JCQkJCWlmIChWb2NhYnVsYXJ5LmlzUmVhZE5vQWx0SW1hZ2UoKSkgewotCQkJCQkJcmV0dXJuIHNyYzsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiAiIjsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAobnVsbEFsdCAmJiBWb2NhYnVsYXJ5LmlzUmVhZE51bGxBbHRJbWFnZSgpKSB7Ci0JCQkJCXJldHVybiBzcmM7Ci0JCQkJfQotCQkJCXJldHVybiBhbHQ7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoVm9jYWJ1bGFyeS5pc0VtYmVkZGVkT2JqZWN0KCkuZXZhbCh0aGlzKSkgewotCQkJcmV0dXJuICIoRW1iZWRkZWQgT2JqZWN0KSI7Ci0JCX0gZWxzZSBpZiAoIklOUFVUIi5lcXVhbHMobmFtZSkpIHsKLQkJCUlucHV0VHlwZSB0eXBlID0gZ2V0SW5wdXRUeXBlKCk7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHR5cGUuaXNIaWRkZW4oKSkvLyB8fCB0eXBlLmlzQ2hlY2tCb3goKSB8fCB0eXBlLmlzUmFkaW8oKSkKLQkJCQkJcmV0dXJuICIiOwotCQkJCVN0cmluZyBhbHQgPSBnZXRBdHRyaWJ1dGUoImFsdCIpOwotCQkJCWlmIChhbHQgIT0gbnVsbCkgewotCQkJCQlhbHQgPSBIZWxwZXIudHJpbUhUTUxTdHIoYWx0KTsKLQkJCQkJaWYgKGFsdC5sZW5ndGgoKSA+IDApCi0JCQkJCQlyZXR1cm4gYWx0OwotCQkJCX0KLQkJCQlTdHJpbmcgdmFsdWUgPSBnZXRJbnB1dFZhbHVlKCk7Ci0JCQkJaWYgKHR5cGUuaXNQYXNzd29yZCgpKQotCQkJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoIi4iLCAiKiIpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJfQotCQkJCVN0cmluZyB0aXRsZSA9IGdldEF0dHJpYnV0ZSgidGl0bGUiKTsKLQkJCQlpZiAodGl0bGUgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHRpdGxlOwotCi0JCQl9Ci0JCX0gZWxzZSBpZiAoIlNFTEVDVCIuZXF1YWxzKG5hbWUpKSB7Ci0JCQlyZXR1cm4gIlNlbGVjdCI7Ci0JCX0gZWxzZSBpZiAoIkFSRUEiLmVxdWFscyhuYW1lKSkgewotCQkJU3RyaW5nIGFsdCA9IGdldEF0dHJpYnV0ZSgiYWx0Iik7Ci0JCQlpZiAoYWx0ICE9IG51bGwpIHsKLQkJCQlhbHQgPSBIZWxwZXIudHJpbUhUTUxTdHIoYWx0KTsKLQkJCQlpZiAoYWx0Lmxlbmd0aCgpID4gMCkKLQkJCQkJcmV0dXJuIGFsdDsKLQkJCX0KLQkJfQotCi0JCWlmIChmYWxzZSkgewotCQkJLy8gdGl0bGUgYXR0cmlidXRlIGNhbiBiZSBhZGRlZCB0byBhbnkgZWxlbWVudCBhY2NvZGluZyB0byBYSFRNTDIuCi0JCQlTdHJpbmcgdGl0bGUgPSBnZXRBdHRyaWJ1dGUoInRpdGxlIik7Ci0JCQlpZiAodGl0bGUgIT0gbnVsbCkgewotCQkJCXRpdGxlID0gSGVscGVyLnRyaW1IVE1MU3RyKHRpdGxlKTsKLQkJCQlyZXR1cm4gdGl0bGU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gIiI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFueVRleHRJblBhcmVudExpbmsoKSB7Ci0JCU5vZGUgY3VycmVudCA9IHRoaXMuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAoY3VycmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQl3aGlsZSAoY3VycmVudCAhPSBudWxsKSB7Ci0JCQlpZiAoIkEiLmVxdWFscyhjdXJyZW50LmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljdXJyZW50ID0gY3VycmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKGN1cnJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gYW55VGV4dEluU2libGluZ3MoY3VycmVudC5nZXRGaXJzdENoaWxkKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhbnlUZXh0SW5TaWJsaW5ncyhOb2RlIGVsZW1lbnQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU5vZGUgbmV4dCA9IGVsZW1lbnQ7Ci0JCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSW1hZ2VFbGVtZW50SW1wbCkgewotCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlpZiAoYW55VGV4dEluU2libGluZ3MobmV4dC5nZXRGaXJzdENoaWxkKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSU5vZGVFeCkgewotCQkJCUlOb2RlRXggbmV4ID0gKElOb2RlRXgpIG5leHQ7Ci0JCQkJYnVmZi5hcHBlbmQobmV4LmV4dHJhY3RTdHJpbmcoKSk7Ci0JCQl9Ci0JCQluZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQkJcmV0dXJuIEhlbHBlci50cmltSFRNTFN0cihidWZmLnRvU3RyaW5nKCkpLmxlbmd0aCgpID4gMDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc2hvcnQgZ2V0SGVhZGluZ0xldmVsKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldExvY2FsTmFtZSgpOwotCQlpZiAobmFtZS5sZW5ndGgoKSAhPSAyKQotCQkJcmV0dXJuIHN1cGVyLmdldEhlYWRpbmdMZXZlbCgpOwotCQlpZiAobmFtZS5jaGFyQXQoMCkgIT0gJ0gnKQotCQkJcmV0dXJuIHN1cGVyLmdldEhlYWRpbmdMZXZlbCgpOwotCQlzd2l0Y2ggKG5hbWUuY2hhckF0KDEpKSB7Ci0JCWNhc2UgJzEnOgotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgJzInOgotCQkJcmV0dXJuIChzaG9ydCkgMjsKLQkJY2FzZSAnMyc6Ci0JCQlyZXR1cm4gKHNob3J0KSAzOwotCQljYXNlICc0JzoKLQkJCXJldHVybiAoc2hvcnQpIDQ7Ci0JCWNhc2UgJzUnOgotCQkJcmV0dXJuIChzaG9ydCkgNTsKLQkJY2FzZSAnNic6Ci0JCQlyZXR1cm4gKHNob3J0KSA2OwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRIZWFkaW5nTGV2ZWwoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXRGb2N1cygpIHsKLQkJdHJ5IHsKLQkJCWlub2RlLmludm9rZTAoImZvY3VzIik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VGV4dENvbnRlbnQoU3RyaW5nIHRleHQpIHsKLQkJdHJ5IHsKLQkJCUhlbHBlci5wdXQoaW5vZGUsICJpbm5lclRleHQiLCB0ZXh0KTsKLQkJfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3R5bGUgZ2V0U3R5bGUoKSB7Ci0JCUlEaXNwYXRjaCBzdHlsZSA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaW5vZGUsICJjdXJyZW50U3R5bGUiKTsKLQkJcmV0dXJuIChJU3R5bGUpIG5ldyBTdHlsZUltcGwoc3R5bGUpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdFRlcm1zIGdldFRlcm1zKCkgewotCQlyZXR1cm4gSFRNTFRlcm1zLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIFJlY3RhbmdsZSBnZXRMb2NhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBIZWxwZXIuZ2V0TG9jYXRpb24oaW5vZGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXRMb2NhdGlvbiBlcnJvciAiK3RoaXMuZXh0cmFjdFN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUG9zaXRpb24gZ2V0UmFkaW9Qb3NpdGlvbigpIHsKLQkJaWYgKGdldElucHV0VHlwZSgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFnZXRJbnB1dFR5cGUoKS5pc1JhZGlvKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlFbGVtZW50IGZvcm0gPSBnZXRQYXJlbnRFbGVtZW50KG5ldyBTdHJpbmdbXSB7ICJGT1JNIiB9KTsKLQkJaWYgKGZvcm0gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyByYWRpb05hbWUgPSAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCAibmFtZSIpOwotCi0JCVBvc2l0aW9uIHAgPSBuZXcgUG9zaXRpb24oKTsKLQkJc2VhcmNoUmFkaW9Qb3NpdGlvbihmb3JtLCByYWRpb05hbWUsIHAsIGZhbHNlKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlYXJjaFJhZGlvUG9zaXRpb24oRWxlbWVudCBwYXJlbnQsIFN0cmluZyByYWRpb05hbWUsCi0JCQlQb3NpdGlvbiBwLCBib29sZWFuIGZvdW5kKSB7Ci0JCU5vZGVMaXN0IGxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbGVuID0gbGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJTm9kZSBuID0gbGlzdC5pdGVtKGkpOwotCQkJaWYgKG4gaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotCQkJCUVsZW1lbnRJbXBsIGUgPSAoRWxlbWVudEltcGwpIG47Ci0JCQkJaWYgKGUuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXNlYXJjaFJhZGlvUG9zaXRpb24oZSwgcmFkaW9OYW1lLCBwLCBmb3VuZCk7Ci0JCQkJfQotCQkJCWlmIChlLmdldElucHV0VHlwZSgpID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmICghZS5nZXRJbnB1dFR5cGUoKS5pc1JhZGlvKCkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBIZWxwZXIuZ2V0KGUuZ2V0SU5vZGUoKSwgIm5hbWUiKTsKLQkJCQlpZiAocmFkaW9OYW1lLmVxdWFscyhuYW1lKSkgewotCQkJCQlpZiAoIWZvdW5kKQotCQkJCQkJcC5pbmRleCsrOwotCQkJCQlwLnRvdGFsKys7Ci0JCQkJfQotCQkJCWlmIChlLmlzU2FtZU5vZGUodGhpcykpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBQb3NpdGlvbiBnZXRMaXN0UG9zaXRpb24oKSB7Ci0JCUVsZW1lbnQgbGlzdCA9IGdldFBhcmVudEVsZW1lbnQobmV3IFN0cmluZ1tdIHsgIlVMIiwgIk9MIiwgIkRMIiB9KTsKLQkJRWxlbWVudCBpdGVtID0gZ2V0UGFyZW50RWxlbWVudChuZXcgU3RyaW5nW10geyAiTEkiLCAiRFQiIH0pOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVBvc2l0aW9uIHAgPSBuZXcgUG9zaXRpb24oKTsKLQkJc2VhcmNoTGlzdFBvc2l0aW9uKGxpc3QsIGl0ZW0sIHAsIGZhbHNlKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlYXJjaExpc3RQb3NpdGlvbihFbGVtZW50IHBhcmVudCwgRWxlbWVudCBpdGVtLCBQb3NpdGlvbiBwLAotCQkJYm9vbGVhbiBmb3VuZCkgewotCQlOb2RlTGlzdCBsaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IGxlbiA9IGxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCU5vZGUgbiA9IGxpc3QuaXRlbShpKTsKLQkJCWlmIChuIGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLQkJCQlFbGVtZW50SW1wbCBlID0gKEVsZW1lbnRJbXBsKSBuOwotCQkJCVN0cmluZyBuYW1lID0gZS5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChlLmhhc0NoaWxkTm9kZXMoKQotCQkJCQkJJiYgISgiVUwiLmVxdWFscyhuYW1lKSB8fCAiT0wiLmVxdWFscyhuYW1lKSB8fCAiREwiCi0JCQkJCQkJCS5lcXVhbHMobmFtZSkpKSB7Ci0JCQkJCXNlYXJjaExpc3RQb3NpdGlvbihlLCBpdGVtLCBwLCBmb3VuZCk7Ci0JCQkJfQotCQkJCWlmICghIkxJIi5lcXVhbHMoZS5nZXROb2RlTmFtZSgpKQotCQkJCQkJJiYgISJEVCIuZXF1YWxzKGUuZ2V0Tm9kZU5hbWUoKSkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKCFmb3VuZCkKLQkJCQkJcC5pbmRleCsrOwotCQkJCXAudG90YWwrKzsKLQkJCQlpZiAoZS5pc1NhbWVOb2RlKGl0ZW0pKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudChTdHJpbmdbXSB0YWdOYW1lcykgewotCQlFbGVtZW50IHBhcmVudCA9IHRoaXM7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFnTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCXNldC5hZGQodGFnTmFtZXNbaV0uaW50ZXJuKCkpOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gcGFyZW50LmdldE5vZGVOYW1lKCk7Ci0JCXdoaWxlICghc2V0LmNvbnRhaW5zKG5hbWUuaW50ZXJuKCkpKSB7Ci0JCQlOb2RlIHRlbXAgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHRlbXAgPT0gbnVsbCB8fCAhKHRlbXAgaW5zdGFuY2VvZiBFbGVtZW50KSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXBhcmVudCA9IChFbGVtZW50KSB0ZW1wOwotCQkJbmFtZSA9IHBhcmVudC5nZXROb2RlTmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBnZXRGb3JtTGFiZWwoKSB7Ci0JCU5vZGVMaXN0IG5sID0gZ2V0T3duZXJEb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMQUJFTCIpOwotCQlPYmplY3QgbXlJZCA9IEhlbHBlci5nZXQoaW5vZGUsICJpZCIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5sLml0ZW0oaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0JCQkJRWxlbWVudEltcGwgbGFiZWwgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJU3RyaW5nIGlkID0gKFN0cmluZykgSGVscGVyLmdldChsYWJlbC5pbm9kZSwgImh0bWxGb3IiKTsKLQotCQkJCWlmIChpZCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoaWQuZXF1YWxzKG15SWQpKQotCQkJCQlyZXR1cm4gbGFiZWw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0QWNjZXNzS2V5KCkgewotCQlTdHJpbmcga2V5ID0gbnVsbDsKLQotCQlTdHJpbmcgbmFtZSA9IGdldE5vZGVOYW1lKCk7Ci0JCWlmICgiTEFCRUwiLmVxdWFscyhuYW1lKSkKLQkJCXJldHVybiAwOwotCi0JCUVsZW1lbnQgbGFiZWwgPSBnZXRGb3JtTGFiZWwoKTsKLQkJaWYgKGxhYmVsICE9IG51bGwgJiYgbGFiZWwgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotCQkJa2V5ID0gKFN0cmluZykgSGVscGVyLmdldCgoKEVsZW1lbnRJbXBsKSBsYWJlbCkuaW5vZGUsICJhY2Nlc3NLZXkiKTsKLQkJfSBlbHNlIHsKLQkJCWtleSA9IChTdHJpbmcpIEhlbHBlci5nZXQoaW5vZGUsICJhY2Nlc3NLZXkiKTsKLQkJfQotCi0JCWlmIChrZXkgIT0gbnVsbCAmJiBrZXkubGVuZ3RoKCkgPT0gMSkKLQkJCXJldHVybiBrZXkudG9VcHBlckNhc2UoKS5jaGFyQXQoMCk7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEFuYWx5emVkUmVzdWx0IGFuYWx5emUoQW5hbHl6ZWRSZXN1bHQgYXIpIHsKLQkJY2hhciBrZXkgPSBnZXRBY2Nlc3NLZXkoKTsKLQkJaWYgKGtleSAhPSAwKQotCQkJYXIuYWRkQWNjZXNzS2V5KHRoaXMpOwotCi0JCXJldHVybiBzdXBlci5hbmFseXplKGFyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9GcmFtZU5vZGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2h0bWwvRnJhbWVOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzI1MWIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9GcmFtZU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5odG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU5vZGVFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuU2luZ2xldG9uTm9kZUxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuU3R5bGVTaGVldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmRvbS5FbXB0eU5vZGVMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLkRpc3BhdGNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSURpc3BhdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSUVudW1Vbmtub3duOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSU9sZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklVbmtub3duOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0KLQotY2xhc3MgRnJhbWVOb2RlSW1wbCBleHRlbmRzIEhUTUxFbGVtZW50SW1wbCB7Ci0gICAgRnJhbWVOb2RlSW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlkaXNwKSB7Ci0gICAgICAgIHN1cGVyKGJhc2VOb2RlLCBpZGlzcCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgdGFnTmFtZSl7Ci0gICAgICAgIElEaXNwYXRjaCBkb2N1bWVudCA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaW5vZGUsICJkb2N1bWVudCIpOwotICAgICAgICBJRGlzcGF0Y2ggciA9IChJRGlzcGF0Y2gpIGRvY3VtZW50Lmludm9rZTEoImdldEVsZW1lbnRzQnlUYWdOYW1lIiwgdGFnTmFtZSk7Ci0gICAgICAgIGlmIChyID09IG51bGwpIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuZXcgTm9kZUxpc3RJbXBsKHRoaXMsIHIpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBnZXRGcmFtZUluZGV4KCkgewotICAgICAgICBOb2RlTGlzdCBmcmFtZSA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJmcmFtZSIpOwotICAgICAgICBpZiAoZnJhbWUuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgcmV0dXJuIGdldEZyYW1lSW5kZXgoZnJhbWUpOwotICAgICAgICAKLSAgICAgICAgTm9kZUxpc3QgaWZyYW1lID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpOwotICAgICAgICBpZiAoaWZyYW1lLmdldExlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHJldHVybiBnZXRGcmFtZUluZGV4KGlmcmFtZSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGdldEZyYW1lSW5kZXgoTm9kZUxpc3QgZnJhbWUpIHsKLSAgICAgICAgaW50IGxlbiA9IGZyYW1lLmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBmcmFtZS5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIElOb2RlRXgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYoKChJTm9kZUV4KSBub2RlKS5pc1NhbWVOb2RlKHRoaXMpKSAKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIElEaXNwYXRjaCBnZXRGcmFtZUJ5SW5kZXgoSURpc3BhdGNoIGRvY3VtZW50LCBpbnQgaW5kZXgpIHsKLSAgICAgICAgSU9sZUNvbnRhaW5lciBpb2xlID0gKElPbGVDb250YWluZXIpIGRvY3VtZW50LnF1ZXJ5SW50ZXJmYWNlKElVbmtub3duLklJRF9JT2xlQ29udGFpbmVyKTsKLSAgICAgICAgSUVudW1Vbmtub3duIGlldSA9IGlvbGUuZW51bU9iamVjdHMoSU9sZUNvbnRhaW5lci5PTEVDT05URl9FTUJFRERJTkdTKTsKLSAgICAgICAgSVVua25vd25bXSBpdW5rczsKLSAgICAgICAgaW50IGNvdW50ID0gLTE7Ci0gICAgICAgIGZvciAoaXVua3MgPSBpZXUubmV4dCgxKTsgaXVua3MgIT0gbnVsbCAmJiBpdW5rcy5sZW5ndGggPiAwOyBpdW5rcyA9IGlldS5uZXh0KDEpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElEaXNwYXRjaCBpZGlzcCA9IChJRGlzcGF0Y2gpIGl1bmtzWzBdLnF1ZXJ5SW50ZXJmYWNlKElVbmtub3duLklJRF9JV2ViQnJvd3NlcjIpOwotICAgICAgICAgICAgICAgIGl1bmtzWzBdLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoaWRpc3AgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkaXNwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGV4KXsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVsZW1lbnQgZ2V0RnJhbWVSb290RWxlbWVudCgpIHsKLSAgICAgICAgSURpc3BhdGNoIGRvY3VtZW50ID0gKElEaXNwYXRjaCkgSGVscGVyLmdldChpbm9kZSwgImRvY3VtZW50Iik7Ci0gICAgICAgIAotICAgICAgICBpbnQgaW5kZXggPSBnZXRGcmFtZUluZGV4KCk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIAotICAgICAgICBJRGlzcGF0Y2ggaWRpc3AgPSBnZXRGcmFtZUJ5SW5kZXgoZG9jdW1lbnQsIGluZGV4KTsKLSAgICAgICAgaWYgKGlkaXNwID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBJRGlzcGF0Y2ggaWRvYyA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaWRpc3AsICJEb2N1bWVudCIpOwotICAgICAgICBpZiAoaWRvYyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIElEaXNwYXRjaCBpZWxlbSA9IChJRGlzcGF0Y2gpIEhlbHBlci5nZXQoaWRvYywgImRvY3VtZW50RWxlbWVudCIpOwotICAgICAgICBpZiAoaWVsZW0gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGluaXRpYWxpemUoaWRvYyk7Ci0gICAgICAgIHJldHVybiAoRWxlbWVudCkgbmV3Tm9kZShpZWxlbSwgTm9kZS5FTEVNRU5UX05PREUsIHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKElEaXNwYXRjaCBkb2MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElEaXNwYXRjaCByID0gKElEaXNwYXRjaCkgZG9jLmludm9rZTAoImNyZWF0ZVN0eWxlU2hlZXQiKTsKLSAgICAgICAgICAgIGlmIChyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgU3R5bGVTaGVldEltcGwgc3R5bGUgPSBuZXcgU3R5bGVTaGVldEltcGwocik7Ci0gICAgICAgICAgICBpZiAoc3R5bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0eWxlLmFkZFJ1bGUoIi5DU1N0b0hpZ2hsaWdodCIsICJib3JkZXI6IDNweCBzb2xpZCBncmVlbjsgYmFja2dyb3VuZDogI2ZkZDsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTm9kZSBPdmVycmlkaW5nIEltcGwuCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE5vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEZyYW1lUm9vdEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRGcmFtZVJvb3RFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0gICAgICAgIE5vZGUgbiA9IGdldEZyYW1lUm9vdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKG4gPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBFbXB0eU5vZGVMaXN0SW1wbC5nZXRJbnN0YW5jZSgpOwotICAgICAgICByZXR1cm4gbmV3IFNpbmdsZXRvbk5vZGVMaXN0SW1wbChuKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotICAgICAgICBOb2RlIG4gPSBnZXRGcmFtZVJvb3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChuID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL0hUTUxFbGVtZW50RmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL0hUTUxFbGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWQ0OTk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9IVE1MRWxlbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5EaXNwYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklEaXNwYXRjaDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgSFRNTEVsZW1lbnRGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRlJBTUUgPSAiaWZyYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAidGl0bGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTUcgPSAiaW1nIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUID0gInNlbGVjdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAidGV4dCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FTk9ERSA9ICJmcmFtZW5vZGUiOwotCi0JcHVibGljIHN0YXRpYyBOb2RlSW1wbCBjcmVhdGUoTm9kZUltcGwgYmFzZSwgSURpc3BhdGNoIGlub2RlLCBTdHJpbmcgdGFnTmFtZSkgewotCQlTdHJpbmcgdGFnTmFtZUxvd2VyID0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpOwotCQl0cnkgewotCQkJaWYgKHRhZ05hbWVMb3dlci5lcXVhbHMoRlJBTUVOT0RFKSkgewotCQkJCXJldHVybiBuZXcgRnJhbWVOb2RlSW1wbChiYXNlLCBpbm9kZSk7Ci0JCQl9IGVsc2UgaWYgKHRhZ05hbWVMb3dlci5lcXVhbHMoVEVYVCkpIHsKLQkJCQlyZXR1cm4gbmV3IFRleHRJbXBsKGJhc2UsIGlub2RlKTsKLQkJCX0gZWxzZSBpZiAodGFnTmFtZUxvd2VyLmVxdWFscyhTRUxFQ1QpKSB7Ci0JCQkJcmV0dXJuIG5ldyBTZWxlY3RFbGVtZW50SW1wbChiYXNlLCBpbm9kZSk7Ci0JCQl9IGVsc2UgaWYgKHRhZ05hbWVMb3dlci5lcXVhbHMoSU1HKSkgewotCQkJCXJldHVybiBuZXcgSW1hZ2VFbGVtZW50SW1wbChiYXNlLCBpbm9kZSk7Ci0JCQl9IGVsc2UgaWYgKHRhZ05hbWVMb3dlci5lcXVhbHMoVElUTEUpKSB7Ci0JCQkJcmV0dXJuIG5ldyBUaXRsZUVsZW1lbnRJbXBsKGJhc2UsIGlub2RlKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgSFRNTEVsZW1lbnRJbXBsKGJhc2UsIGlub2RlKTsKLQkJfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KERvY3VtZW50SW1wbCBiYXNlLCBJRGlzcGF0Y2ggaW5vZGUsCi0JCQlTdHJpbmcgdGFnTmFtZSkgewotCQl0cnkgewotCQkJSURpc3BhdGNoIHI7Ci0JCQlyID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiY3JlYXRlRWxlbWVudCIsIHRhZ05hbWUpOwotCQkJaWYgKHIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJaWYgKHRhZ05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoSUZSQU1FKSkgewotCQkJCXJldHVybiBuZXcgRnJhbWVOb2RlSW1wbChiYXNlLCByKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgSFRNTEVsZW1lbnRJbXBsKGJhc2UsIHIpOwotCQl9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL0hUTUxFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL0hUTUxFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2JhNDgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9IVE1MRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEhUTUxFbGVtZW50SW1wbCBleHRlbmRzIEVsZW1lbnRJbXBsIGltcGxlbWVudHMgSFRNTEVsZW1lbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gInRpdGxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFORyA9ICJsYW5nIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVIgPSAiZGlyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiY2xhc3MiOwotCi0JcHJvdGVjdGVkIEhUTUxFbGVtZW50SW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlub2RlKSB7Ci0JCXN1cGVyKGJhc2VOb2RlLCBpbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEhUTUxFbGVtZW50SW1wbChEb2N1bWVudEltcGwgYmFzZURvYywgSURpc3BhdGNoIGlub2RlKSB7Ci0JCXN1cGVyKGJhc2VEb2MsIGlub2RlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy53M2MuZG9tLmh0bWwuSFRNTEVsZW1lbnQjZ2V0Q2xhc3NOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShDTEFTUyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcudzNjLmRvbS5odG1sLkhUTUxFbGVtZW50I2dldERpcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoRElSKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy53M2MuZG9tLmh0bWwuSFRNTEVsZW1lbnQjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoSUQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudCNnZXRMYW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhbmcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoTEFORyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcudzNjLmRvbS5odG1sLkhUTUxFbGVtZW50I2dldFRpdGxlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFRJVExFKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy53M2MuZG9tLmh0bWwuSFRNTEVsZW1lbnQjc2V0Q2xhc3NOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJc2V0QXR0cmlidXRlKENMQVNTLCBjbGFzc05hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudCNzZXREaXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXIoU3RyaW5nIGRpcikgewotCQlzZXRBdHRyaWJ1dGUoRElSLCBkaXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudCNzZXRJZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQlzZXRBdHRyaWJ1dGUoSUQsIGlkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy53M2MuZG9tLmh0bWwuSFRNTEVsZW1lbnQjc2V0TGFuZyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmcoU3RyaW5nIGxhbmcpIHsKLQkJc2V0QXR0cmlidXRlKExBTkcsIGxhbmcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudCNzZXRUaXRsZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSkgewotCQlzZXRBdHRyaWJ1dGUoVElUTEUsIHRpdGxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9IVE1MVGVybXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9IVE1MVGVybXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiYjdkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2h0bWwvSFRNTFRlcm1zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuaHRtbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSU5vZGVFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmh0bWwuRWxlbWVudEltcGwuSW5wdXRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuVm9jYWJ1bGFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLkNvbVBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0KLQotcHVibGljIGNsYXNzIEhUTUxUZXJtcyBleHRlbmRzIEFic3RyYWN0VGVybXMgewotICAgIC8vIEFEREVEIEJZIEtPQkFZQVNISSAoIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FsdGVyYWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIGlzSW1hZ2UodGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBIVE1MVGVybXMgaW5zdGFuY2U7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoU2V0PFN0cmluZz4gaGVhZGluZ1RhZ3M7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoU2V0PFN0cmluZz4gbGlzdEl0ZW1UYWdzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaFNldDxTdHJpbmc+IGJsb2NrVGFnczsKLQotICAgIHByaXZhdGUgc3RhdGljIEhhc2hTZXQ8U3RyaW5nPiBsaXN0VG9wVGFnczsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGhlYWRpbmdUYWdzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBoZWFkaW5nVGFncy5hZGQoIkgxIi5pbnRlcm4oKSk7Ci0gICAgICAgIGhlYWRpbmdUYWdzLmFkZCgiSDIiLmludGVybigpKTsKLSAgICAgICAgaGVhZGluZ1RhZ3MuYWRkKCJIMyIuaW50ZXJuKCkpOwotICAgICAgICBoZWFkaW5nVGFncy5hZGQoIkg0Ii5pbnRlcm4oKSk7Ci0gICAgICAgIGhlYWRpbmdUYWdzLmFkZCgiSDUiLmludGVybigpKTsKLSAgICAgICAgaGVhZGluZ1RhZ3MuYWRkKCJINiIuaW50ZXJuKCkpOwotCi0gICAgICAgIGxpc3RJdGVtVGFncyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgbGlzdEl0ZW1UYWdzLmFkZCgiTEkiLmludGVybigpKTsKLSAgICAgICAgbGlzdEl0ZW1UYWdzLmFkZCgiRFQiLmludGVybigpKTsKLQotICAgICAgICBsaXN0VG9wVGFncyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgbGlzdFRvcFRhZ3MuYWRkKCJVTCIuaW50ZXJuKCkpOwotICAgICAgICBsaXN0VG9wVGFncy5hZGQoIk9MIi5pbnRlcm4oKSk7Ci0gICAgICAgIGxpc3RUb3BUYWdzLmFkZCgiREwiLmludGVybigpKTsKLQotICAgICAgICBibG9ja1RhZ3MgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGJsb2NrVGFncy5hZGQoIkgxIi5pbnRlcm4oKSk7Ci0gICAgICAgIGJsb2NrVGFncy5hZGQoIkgyIi5pbnRlcm4oKSk7Ci0gICAgICAgIGJsb2NrVGFncy5hZGQoIkgzIi5pbnRlcm4oKSk7Ci0gICAgICAgIGJsb2NrVGFncy5hZGQoIkg0Ii5pbnRlcm4oKSk7Ci0gICAgICAgIGJsb2NrVGFncy5hZGQoIkg1Ii5pbnRlcm4oKSk7Ci0gICAgICAgIGJsb2NrVGFncy5hZGQoIkg2Ii5pbnRlcm4oKSk7Ci0gICAgICAgIGJsb2NrVGFncy5hZGQoIkIiLmludGVybigpKTsKLSAgICAgICAgYmxvY2tUYWdzLmFkZCgiU1RST05HIi5pbnRlcm4oKSk7Ci0gICAgICAgIGJsb2NrVGFncy5hZGQoIkRJViIuaW50ZXJuKCkpOwotICAgICAgICBibG9ja1RhZ3MuYWRkKCJTUEFOIi5pbnRlcm4oKSk7Ci0gICAgICAgIGJsb2NrVGFncy5hZGQoIlAiLmludGVybigpKTsKLSAgICAgICAgYmxvY2tUYWdzLmFkZCgiRk9OVCIuaW50ZXJuKCkpOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBIVE1MVGVybXMgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBIVE1MVGVybXMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZE5vZGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKCJIRUFEIi5lcXVhbHMobmFtZSkgfHwgIk1BUCIuZXF1YWxzKG5hbWUpKSAKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlTm9kZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNNdWx0aWxpbmVFZGl0KElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmICgiVEVYVEFSRUEiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFRleHRJbXBsKSB7Ci0gICAgICAgICAgICBUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICBOb2RlIHBhcmVudCA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElFdmFsVGFyZ2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzTXVsdGlsaW5lRWRpdCgoSUV2YWxUYXJnZXQpIHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0T3B0aW9uKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmICgiT1BUSU9OIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUZXh0SW1wbCkgewotICAgICAgICAgICAgVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgTm9kZSBwYXJlbnQgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJRXZhbFRhcmdldCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpc1NlbGVjdE9wdGlvbigoSUV2YWxUYXJnZXQpIHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5wdXRhYmxlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmICgiSU5QVVQiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIElucHV0VHlwZSB0eXBlID0gZWxlbWVudC5nZXRJbnB1dFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNFZGl0KCkgfHwgdHlwZS5pc1Bhc3N3b3JkKCkgfHwgdHlwZS5pc0ZpbGVFZGl0KCkgfHwgdHlwZS5pc0NoZWNrQm94KCkgfHwgdHlwZS5pc1JhZGlvKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJURVhUQVJFQSIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVGV4dEltcGwpIHsKLSAgICAgICAgICAgIFRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIE5vZGUgcGFyZW50ID0gdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUV2YWxUYXJnZXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVm9jYWJ1bGFyeS5pc0lucHV0YWJsZSgpLmV2YWwoKElFdmFsVGFyZ2V0KSBwYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29tYm9ib3goSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKCJTRUxFQ1QiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFRleHRJbXBsKSB7Ci0gICAgICAgICAgICBUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICBOb2RlIHBhcmVudCA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElFdmFsVGFyZ2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZvY2FidWxhcnkuaXNTZWxlY3RhYmxlKCkuZXZhbCgoSUV2YWxUYXJnZXQpIHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNNdWx0aVNlbGVjdGFibGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKCJTRUxFQ1QiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoQm9vbGVhbikgSGVscGVyLmdldChlbGVtZW50LmdldElOb2RlKCksICJtdWx0aXBsZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFRleHRJbXBsKSB7Ci0gICAgICAgICAgICBUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICBOb2RlIHBhcmVudCA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElFdmFsVGFyZ2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZvY2FidWxhcnkuaXNNdWx0aVNlbGVjdGFibGUoKS5ldmFsKChJRXZhbFRhcmdldCkgcGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NsaWNrYWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFRleHRJbXBsKSB7Ci0gICAgICAgICAgICBUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICBOb2RlIHBhcmVudCA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElFdmFsVGFyZ2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZvY2FidWxhcnkuaXNDbGlja2FibGUoKS5ldmFsKChJRXZhbFRhcmdldCkgcGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBocmVmID0gKFN0cmluZykgSGVscGVyLmdldChlbGVtZW50LmdldElOb2RlKCksICJocmVmIik7Ci0gICAgICAgICAgICBpZiAoKCJBIi5lcXVhbHMobmFtZSkgfHwgIkFSRUEiLmVxdWFscyhuYW1lKSkgCi0gICAgICAgICAgICAgICAgICAgICYmIGhyZWYgIT0gbnVsbCAmJiBocmVmLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGlmICgiQlVUVE9OIi5lcXVhbHMobmFtZSkgfHwgIk9QVElPTiIuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgaWYgKCJJTlBVVCIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRUeXBlIHR5cGUgPSBlbGVtZW50LmdldElucHV0VHlwZSgpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNDbGlja2FibGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChIZWxwZXIuaGFzUHJvcGVydHkoZWxlbWVudC5nZXRJTm9kZSgpLCAib25jbGljayIpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSB0YXJnZXQ7Ci0gICAgICAgICAgICBOb2RlIHAgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgIGlmIChwIGluc3RhbmNlb2YgSUV2YWxUYXJnZXQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFZvY2FidWxhcnkuaXNDbGlja2FibGUoKS5ldmFsKChJRXZhbFRhcmdldCkgcCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaW5rKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVGV4dEltcGwpIHsKLSAgICAgICAgICAgIFRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIE5vZGUgcGFyZW50ID0gdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUV2YWxUYXJnZXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVm9jYWJ1bGFyeS5pc0xpbmsoKS5ldmFsKChJRXZhbFRhcmdldCkgcGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBocmVmID0gKFN0cmluZykgSGVscGVyLmdldChlbGVtZW50LmdldElOb2RlKCksICJocmVmIik7Ci0gICAgICAgICAgICBpZiAoKCJBIi5lcXVhbHMobmFtZSkgfHwgIkFSRUEiLmVxdWFscyhuYW1lKSkgCi0gICAgICAgICAgICAgICAgICAgICYmIGhyZWYgIT0gbnVsbCAmJiBocmVmLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgdGFyZ2V0OwotICAgICAgICAgICAgTm9kZSBwID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBpZiAocCBpbnN0YW5jZW9mIElFdmFsVGFyZ2V0KQotICAgICAgICAgICAgICAgIHJldHVybiBWb2NhYnVsYXJ5LmlzTGluaygpLmV2YWwoKElFdmFsVGFyZ2V0KSBwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2JveChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICBFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICBJbnB1dFR5cGUgdHlwZSA9IGVsZW1lbnQuZ2V0SW5wdXRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmlzQ2hlY2tCb3goKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBIZWxwZXIuZ2V0KCgoRWxlbWVudEltcGwpIHRhcmdldCkuZ2V0SU5vZGUoKSwgImNoZWNrZWQiKTsKLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gKEJvb2xlYW4pIG9iajsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNSYWRpbyhJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICBFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICBJbnB1dFR5cGUgdHlwZSA9IGVsZW1lbnQuZ2V0SW5wdXRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmlzUmFkaW8oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNUZXh0Ym94KElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIElucHV0VHlwZSB0eXBlID0gZWxlbWVudC5nZXRJbnB1dFR5cGUoKTsKLSAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNFZGl0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUGFzc3dvcmQoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgSW5wdXRUeXBlIHR5cGUgPSBlbGVtZW50LmdldElucHV0VHlwZSgpOwotICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc1Bhc3N3b3JkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQnV0dG9uKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRhcmdldDsKLSAgICAgICAgICAgIElucHV0VHlwZSB0eXBlID0gZWxlbWVudC5nZXRJbnB1dFR5cGUoKTsKLSAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNCdXR0b24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5UYWdzKElFdmFsVGFyZ2V0IHRhcmdldCwgSGFzaFNldDxTdHJpbmc+IHRhZ3MpIHsKLSAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICBFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgICAgIGlmICh0YWdzLmNvbnRhaW5zKG5hbWUuaW50ZXJuKCkpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdFRvcChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGlzSW5UYWdzKHRhcmdldCwgbGlzdFRvcFRhZ3MpKSB7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgZSA9IChFbGVtZW50KSB0YXJnZXQ7Ci0gICAgICAgICAgICAgICAgTm9kZUxpc3QgbmwgPSBlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBOb2RlIG4gPSBubC5pdGVtKGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobiBpbnN0YW5jZW9mIElFdmFsVGFyZ2V0ICYmIGlzTGlzdEl0ZW0oKElFdmFsVGFyZ2V0KSBuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDEpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RJdGVtKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gaXNMaXN0SXRlbUp1bXBQb2ludCh0YXJnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZUVkaXQoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgSW5wdXRUeXBlIHR5cGUgPSBlbGVtZW50LmdldElucHV0VHlwZSgpOwotICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0ZpbGVFZGl0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWRPYmplY3QoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoIkVNQkVEIi5lcXVhbHMobmFtZSkgfHwgIk9CSkVDVCIuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ltYWdlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGFyZ2V0OwotICAgICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgIHJldHVybiAiSU1HIi5lcXVhbHMobmFtZSk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnRlbnQoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChpc011bHRpbGluZUVkaXQodGFyZ2V0KSkgewotICAgICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIWhhc0NvbnRlbnQoKElFdmFsVGFyZ2V0KSAoKEVsZW1lbnQpIHRhcmdldCkuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaXNJbnB1dGFibGUodGFyZ2V0KSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChpc0xpc3RUb3AodGFyZ2V0KSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBzdXBlci5oYXNDb250ZW50KHRhcmdldCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldDxTdHJpbmc+IHJlZHVjaWJsZUVsZW1lbnROYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICByZWR1Y2libGVFbGVtZW50TmFtZXMuYWRkKCJGT05UIi5pbnRlcm4oKSk7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIkJBU0VGT05UIi5pbnRlcm4oKSk7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIlMiLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiU1RSSUtFIi5pbnRlcm4oKSk7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIlUiLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiRU0iLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiU1RST05HIi5pbnRlcm4oKSk7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIlNQQU4iLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiVkFSIi5pbnRlcm4oKSk7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIkNPREUiLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiQ0lURSIuaW50ZXJuKCkpOwotICAgICAgICByZWR1Y2libGVFbGVtZW50TmFtZXMuYWRkKCJBQkJSIi5pbnRlcm4oKSk7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIkFDUk9OWU0iLmludGVybigpKTsKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiUSIuaW50ZXJuKCkpOwotICAgICAgICByZWR1Y2libGVFbGVtZW50TmFtZXMuYWRkKCJCIi5pbnRlcm4oKSk7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIkJJRyIuaW50ZXJuKCkpOwotICAgICAgICByZWR1Y2libGVFbGVtZW50TmFtZXMuYWRkKCJJIi5pbnRlcm4oKSk7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIlNNQUxMIi5pbnRlcm4oKSk7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIlRUIi5pbnRlcm4oKSk7Ci0gICAgICAgIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5hZGQoIlNVQiIuaW50ZXJuKCkpOwotICAgICAgICByZWR1Y2libGVFbGVtZW50TmFtZXMuYWRkKCJTVVAiLmludGVybigpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIG5vbiBvZmZpY2lhbCB0YWcKLSAgICAgICAgcmVkdWNpYmxlRWxlbWVudE5hbWVzLmFkZCgiV0JSIi5pbnRlcm4oKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWR1Y2libGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIC8vIE1pZ2h0IGl0IGJlIGluY2x1ZGVkIGluIHRoZSBydWxlcz8KLSAgICAgICAgLy8gaWYgKFZvY2FidWxhcnkuaXNDbGlja2FibGUoKS5ldmFsKHRhcmdldCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEltcGwpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0YXJnZXQ7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5pbnRlcm4oKTsKLSAgICAgICAgcmV0dXJuIHJlZHVjaWJsZUVsZW1lbnROYW1lcy5jb250YWlucyhuYW1lKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2l0ZWRMaW5rKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBJTm9kZUV4KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgSU5vZGVFeCBuZXggPSAoSU5vZGVFeCkgdGFyZ2V0OwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHVybCA9IG5leC5nZXRMaW5rVVJJKCk7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBDb21QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyb3dzZXJIaXN0b3J5KCkuaXNWaXNpdGVkKHVybCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNIZWFkaW5nSnVtcFBvaW50KElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gaXNKdW1wUG9pbnQodGFyZ2V0LCBoZWFkaW5nVGFncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaXN0SXRlbUp1bXBQb2ludChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIGlzSnVtcFBvaW50KHRhcmdldCwgbGlzdEl0ZW1UYWdzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2NrSnVtcFBvaW50RihJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIGlzSnVtcFBvaW50KHRhcmdldCwgYmxvY2tUYWdzLCAzKSB8fCBpc0p1bXBQb2ludDIodGFyZ2V0LCBoZWFkaW5nVGFncywgMyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNCbG9ja0p1bXBQb2ludEIoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiBpc0p1bXBQb2ludCh0YXJnZXQsIGJsb2NrVGFncywgMykgfHwgaXNKdW1wUG9pbnQyKHRhcmdldCwgaGVhZGluZ1RhZ3MsIDMpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0p1bXBQb2ludChJRXZhbFRhcmdldCB0YXJnZXQsIEhhc2hTZXQgdGFncykgewotICAgICAgICByZXR1cm4gaXNKdW1wUG9pbnQodGFyZ2V0LCB0YWdzLCAxMDApOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0p1bXBQb2ludChJRXZhbFRhcmdldCB0YXJnZXQsIEhhc2hTZXQgdGFncywgaW50IGRlcHRoKSB7Ci0gICAgICAgIGlmIChkZXB0aCA8PSAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgdGFyZ2V0OwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKHRhZ3MuY29udGFpbnMobmFtZS5pbnRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgdGFyZ2V0OwotICAgICAgICBOb2RlIHByZXYgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotICAgICAgICB3aGlsZSAocHJldiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoaGFzVGV4dChwcmV2KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXYgPSBwcmV2LmdldFByZXZpb3VzU2libGluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJRXZhbFRhcmdldCkgewotICAgICAgICAgICAgcmV0dXJuIGlzSnVtcFBvaW50KChJRXZhbFRhcmdldCkgcGFyZW50LCB0YWdzLCBkZXB0aCAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0p1bXBQb2ludDIoSUV2YWxUYXJnZXQgdGFyZ2V0LCBIYXNoU2V0IHRhZ3MsIGludCBkZXB0aCkgewotICAgICAgICBpZiAoZGVwdGggPD0gMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIHRhcmdldDsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmICh0YWdzLmNvbnRhaW5zKG5hbWUuaW50ZXJuKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIHRhcmdldDsKLQotICAgICAgICBOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElFdmFsVGFyZ2V0KSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNKdW1wUG9pbnQoKElFdmFsVGFyZ2V0KSBwYXJlbnQsIHRhZ3MsIGRlcHRoIC0gMSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1RleHQoTm9kZSBwcmV2KSB7Ci0gICAgICAgIGlmIChwcmV2IGluc3RhbmNlb2YgSU5vZGVFeCkgewotICAgICAgICAgICAgSU5vZGVFeCBuZXggPSAoSU5vZGVFeCkgcHJldjsKLSAgICAgICAgICAgIGlmIChuZXguaGFzQ2hpbGROb2RlcygpKSB7Ci0gICAgICAgICAgICAgICAgTm9kZUxpc3QgbGlzdCA9IG5leC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgTm9kZSBjbiA9IGxpc3QuaXRlbShpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1RleHQoY24pKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobmV4LmV4dHJhY3RTdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc0tleShjaGFyIGtleSwgSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgSU5vZGVFeCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIElOb2RlRXggbmV4ID0gKElOb2RlRXgpIG5vZGU7Ci0gICAgICAgIGNoYXIgYyA9IG5leC5nZXRBY2Nlc3NLZXkoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjID09IGtleTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFjaGFibGUoSUV2YWxUYXJnZXQgZXZhbFRhcmdldCwgTm9kZSB0YXJnZXQpIHsKLSAgICAgICAgaWYgKCEoZXZhbFRhcmdldCBpbnN0YW5jZW9mIE5vZGUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIGV2YWxUYXJnZXQ7Ci0gICAgICAgIAotICAgICAgICBOb2RlIGExID0gc2VhcmNoTm9uUmVkdWNpYmxlQW5jZXN0b3Iobm9kZSk7Ci0gICAgICAgIGlmIChhMSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBOb2RlIGEyID0gc2VhcmNoTm9uUmVkdWNpYmxlQW5jZXN0b3IodGFyZ2V0KTsKLSAgICAgICAgaWYgKGEyID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgaWYgKGExLmdldFBhcmVudE5vZGUoKSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoYTIuZ2V0UGFyZW50Tm9kZSgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgaWYgKCEoYTEuZ2V0UGFyZW50Tm9kZSgpLmlzU2FtZU5vZGUoYTIuZ2V0UGFyZW50Tm9kZSgpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChhMSBpbnN0YW5jZW9mIElFdmFsVGFyZ2V0ICYmIGEyIGluc3RhbmNlb2YgSUV2YWxUYXJnZXQpIHsKLSAgICAgICAgICAgICAgICBJRXZhbFRhcmdldCB0MSA9IChJRXZhbFRhcmdldCkgYTE7Ci0gICAgICAgICAgICAgICAgSUV2YWxUYXJnZXQgdDIgPSAoSUV2YWxUYXJnZXQpIGEyOwotICAgICAgICAgICAgICAgIGlmIChpc0xpbmsodDEpICYmIGlzTGluayh0MikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpc0J1dHRvbih0MSkgJiYgaXNCdXR0b24odDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE5vZGUgc3RhcnQgPSBub2RlOwotCi0gICAgICAgIE5vZGUgZW5kID0gdGFyZ2V0OwotICAgICAgICBpZiAoZW5kIGluc3RhbmNlb2YgVGV4dCkKLSAgICAgICAgICAgIGVuZCA9IGdldFByZXYoZW5kKTsKLSAgICAgICAgaWYgKGVuZCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgTm9kZSBuZXh0ID0gZ2V0TmV4dChzdGFydCk7Ci0gICAgICAgIHdoaWxlIChuZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghKG5leHQgaW5zdGFuY2VvZiBJRXZhbFRhcmdldCkpIHsKLSAgICAgICAgICAgICAgICBuZXh0ID0gZ2V0TmV4dChuZXh0KTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoIVZvY2FidWxhcnkuaXNSZWR1Y2libGUoKS5ldmFsKChJRXZhbFRhcmdldCkgbmV4dCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYobmV4dC5pc1NhbWVOb2RlKGVuZCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBuZXh0ID0gZ2V0TmV4dChuZXh0KTsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgIAotICAgIHByaXZhdGUgTm9kZSBnZXRQcmV2KE5vZGUgbm9kZSkgewotICAgICAgICBOb2RlIHByZXYgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotICAgICAgICBpZiAocHJldiAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHByZXY7Ci0gICAgICAgIHJldHVybiBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBOb2RlIGdldE5leHQoTm9kZSBub2RlKSB7Ci0gICAgICAgIE5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgICAgaWYgKG5leHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuZXh0OwotICAgICAgICByZXR1cm4gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBOb2RlIHNlYXJjaE5vblJlZHVjaWJsZUFuY2VzdG9yKE5vZGUgbm9kZSkgewotICAgICAgICBOb2RlIGNoaWxkID0gbnVsbDsKLSAgICAgICAgTm9kZSBwYXJlbnQgPSBub2RlOwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIElFdmFsVGFyZ2V0ICYmIAotICAgICAgICAgICAgICAgIChwYXJlbnQgaW5zdGFuY2VvZiBUZXh0IAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNJbWFnZSgoSUV2YWxUYXJnZXQpIHBhcmVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpc1JlZHVjaWJsZSgoSUV2YWxUYXJnZXQpIHBhcmVudCkpIHsKLSAgICAgICAgICAgIGNoaWxkID0gcGFyZW50OwotICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjaGlsZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2h0bWwvSW1hZ2VFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL0ltYWdlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQyYjVmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2h0bWwvSW1hZ2VFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklJbWFnZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklEaXNwYXRjaDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBJbWFnZUVsZW1lbnRJbXBsIGV4dGVuZHMgSFRNTEVsZW1lbnRJbXBsIGltcGxlbWVudHMgSUltYWdlRWxlbWVudCB7Ci0KLSAgICBwdWJsaWMgSW1hZ2VFbGVtZW50SW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlub2RlKSB7Ci0gICAgICAgIHN1cGVyKGJhc2VOb2RlLCBpbm9kZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVXNlbWFwKCkgewotICAgICAgICBTdHJpbmcgdXNlbWFwID0gKFN0cmluZykgSGVscGVyLmdldChpbm9kZSwgInVzZW1hcCIpOwotICAgICAgICByZXR1cm4gKHVzZW1hcCAhPSBudWxsICYmIHVzZW1hcC5sZW5ndGgoKSA+PSAyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRNYXAoKSB7Ci0gICAgICAgIFN0cmluZyB1c2VtYXAgPSAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCAidXNlbWFwIik7Ci0gICAgICAgIGlmICh1c2VtYXAgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICBpZiAodXNlbWFwLnN0YXJ0c1dpdGgoIiMiKSkgewotICAgICAgICAgICAgbmFtZSA9IHVzZW1hcC5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuYW1lID0gdXNlbWFwOwotICAgICAgICB9Ci0gICAgICAgIE5vZGVMaXN0IG5sID0gZ2V0T3duZXJEb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNQVAiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKXsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IG5sLml0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAoIk1BUCIuZXF1YWxzKG5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGFyZWEgPSAoRWxlbWVudCkgbm9kZTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoYXJlYS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmVhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9TZWxlY3RFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL1NlbGVjdEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWY3YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL1NlbGVjdEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5odG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklTZWxlY3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RFbGVtZW50SW1wbCBleHRlbmRzIEhUTUxFbGVtZW50SW1wbCBpbXBsZW1lbnRzIElTZWxlY3RFbGVtZW50IHsKLQotICAgIHB1YmxpYyBTZWxlY3RFbGVtZW50SW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlub2RlKSB7Ci0gICAgICAgIHN1cGVyKGJhc2VOb2RlLCBpbm9kZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJbmRpY2VzKGludFtdIGluZGljZXMpIHsKLSAgICAgICAgaW50W10gcHJldiA9IGdldFNlbGVjdGVkSW5kaWNlcygpOwotICAgICAgICAKLSAgICAgICAgaW50IGxlbmd0aCA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlub2RlLCAibGVuZ3RoIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElEaXNwYXRjaCBvcHRpb24gPSAoSURpc3BhdGNoKSBpbm9kZS5pbnZva2UxKCJpdGVtIiwgaSk7Ci0gICAgICAgICAgICBIZWxwZXIucHV0KG9wdGlvbiwgInNlbGVjdGVkIiwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJRGlzcGF0Y2ggb3B0aW9uID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiaXRlbSIsIGluZGljZXNbaV0pOwotICAgICAgICAgICAgSGVscGVyLnB1dChvcHRpb24sICJzZWxlY3RlZCIsIHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEhlbHBlci5oYXNQcm9wZXJ0eShpbm9kZSwgIm9uY2hhbmdlIikpIHsKLSAgICAgICAgICAgIGlmIChwcmV2Lmxlbmd0aCAhPSBpbmRpY2VzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGlub2RlLmludm9rZTAoIm9uY2hhbmdlIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJldi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJldltpXSAhPSBpbmRpY2VzW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbm9kZS5pbnZva2UwKCJvbmNoYW5nZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50W10gZ2V0U2VsZWN0ZWRJbmRpY2VzKCkgewotICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICAgICAgaW50IGxlbmd0aCA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlub2RlLCAibGVuZ3RoIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElEaXNwYXRjaCBvcHRpb24gPSAoSURpc3BhdGNoKSBpbm9kZS5pbnZva2UxKCJpdGVtIiwgaSk7Ci0gICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKEJvb2xlYW4pIEhlbHBlci5nZXQob3B0aW9uLCAic2VsZWN0ZWQiKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3RlZCkKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChpKTsKLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbbGlzdC5zaXplKCldOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBpbmRpY2VzW2ldID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgIHJldHVybiBpbmRpY2VzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldE9wdGlvbnNDb3VudCgpIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IChJbnRlZ2VyKSBIZWxwZXIuZ2V0KGlub2RlLCAibGVuZ3RoIik7Ci0gICAgICAgIHJldHVybiBsZW5ndGg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3B0aW9uVGV4dEF0KGludCBpbmRleCkgewotICAgICAgICBJRGlzcGF0Y2ggb3B0aW9uID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgiaXRlbSIsIGluZGV4KTsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIEhlbHBlci5nZXQob3B0aW9uLCAidGV4dCIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9UZXh0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL1RleHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OWY0M2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9odG1sL1RleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5odG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uSUVsZW1lbnRFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JTm9kZUV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5EaXNwYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklEaXNwYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLWNsYXNzIFRleHRJbXBsIGV4dGVuZHMgQ2hhcmFjdGVyRGF0YUltcGwgaW1wbGVtZW50cyBUZXh0LCBJTm9kZUV4IHsKLQlUZXh0SW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlub2RlKSB7Ci0JCXN1cGVyKGJhc2VOb2RlLCBpbm9kZSwgTm9kZS5URVhUX05PREUpOwotCX0KLQotCXB1YmxpYyBUZXh0IHNwbGl0VGV4dChpbnQgb2Zmc2V0KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUlEaXNwYXRjaCByID0gKElEaXNwYXRjaCkgaW5vZGUuaW52b2tlMSgic3BsaXRUZXh0IiwgSW50ZWdlcgotCQkJCQkudmFsdWVPZihvZmZzZXQpKTsKLQkJCWlmIChyID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gKFRleHQpIG5ld05vZGUociwgTm9kZS5URVhUX05PREUpOwotCQl9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdob2xlVGV4dCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dCByZXBsYWNlV2hvbGVUZXh0KFN0cmluZyBjb250ZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIElOb2RlRXggaW50ZXJmYWNlCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCXB1YmxpYyBib29sZWFuIGRvQ2xpY2soKSB7Ci0JCU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSU5vZGVFeCkgewotCQkJcmV0dXJuICgoSU5vZGVFeCkgcGFyZW50KS5kb0NsaWNrKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhpZ2hsaWdodCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJTm9kZUV4KSB7Ci0JCQlyZXR1cm4gKChJTm9kZUV4KSBwYXJlbnQpLmhpZ2hsaWdodCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1bmhpZ2hsaWdodCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJTm9kZUV4KSB7Ci0JCQlyZXR1cm4gKChJTm9kZUV4KSBwYXJlbnQpLnVuaGlnaGxpZ2h0KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdFN0cmluZygpIHsKLQkJU3RyaW5nIG52ID0gZ2V0Tm9kZVZhbHVlKCk7Ci0JCWlmIChudiA9PSBudWxsKQotCQkJcmV0dXJuICIiOwotCQludiA9IEhlbHBlci50cmltSFRNTFN0cihudik7Ci0KLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0KLQkJaWYgKCEocGFyZW50IGluc3RhbmNlb2YgRWxlbWVudEltcGwpKQotCQkJcmV0dXJuIG52OwotCi0JCWlmICghIkFCQlIiLmVxdWFscyhwYXJlbnQuZ2V0Tm9kZU5hbWUoKSkgLy8KLQkJCQkmJiAhIkFDUk9OWU0iLmVxdWFscyhwYXJlbnQuZ2V0Tm9kZU5hbWUoKSkpCi0JCQlyZXR1cm4gbnY7Ci0KLQkJRWxlbWVudEltcGwgZWwgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQotCQlTdHJpbmcgdGl0bGUgPSBlbC5nZXRBdHRyaWJ1dGUoInRpdGxlIik7Ci0JCWlmIChudWxsICE9IHRpdGxlKSB7Ci0JCQlyZXR1cm4gbnYgKyAiICgiICsgdGl0bGUgKyAiKSI7Ci0JCX0KLQkJcmV0dXJuIG52OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldEZvY3VzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFJlY3RhbmdsZSBnZXRMb2NhdGlvbigpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElFbGVtZW50RXgpKSB7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBSZWN0YW5nbGUoMCwgMCwgMCwgMCk7Ci0JCX0KLQkJcmV0dXJuICgoSU5vZGVFeCkgcGFyZW50KS5nZXRMb2NhdGlvbigpOwotCX0KLQotCXB1YmxpYyBjaGFyIGdldEFjY2Vzc0tleSgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0KLQkJaWYgKCEocGFyZW50IGluc3RhbmNlb2YgSU5vZGVFeCkpCi0JCQlyZXR1cm4gMDsKLQotCQlyZXR1cm4gKChJTm9kZUV4KSBwYXJlbnQpLmdldEFjY2Vzc0tleSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9UaXRsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL2h0bWwvVGl0bGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjJiYjUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvaHRtbC9UaXRsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MVGl0bGVFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgVGl0bGVFbGVtZW50SW1wbCBleHRlbmRzIEhUTUxFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUhUTUxUaXRsZUVsZW1lbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAidGV4dCI7Ci0KLQlwcm90ZWN0ZWQgVGl0bGVFbGVtZW50SW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlub2RlKSB7Ci0JCXN1cGVyKGJhc2VOb2RlLCBpbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRpdGxlRWxlbWVudEltcGwoRG9jdW1lbnRJbXBsIGJhc2VEb2MsIElEaXNwYXRjaCBpbm9kZSkgewotCQlzdXBlcihiYXNlRG9jLCBpbm9kZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVJbXBsI2dldFRleHQoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHJldCA9ICIiOwotCQlyZXQgPSAoU3RyaW5nKSBIZWxwZXIuZ2V0KGlub2RlLCBURVhUKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUltcGwjc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJSGVscGVyLnB1dChpbm9kZSwgVEVYVCwgdGV4dCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9NZWRpYU9iamVjdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L01lZGlhT2JqZWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGNlZDhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L01lZGlhT2JqZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5BbmFseXplZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JTm9kZUV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklOb2RlRXhTb3VuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JTm9kZUV4VmlkZW87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLmh0bWwuRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci0KLQotCi0KLQotYWJzdHJhY3QgY2xhc3MgTWVkaWFPYmplY3RJbXBsIGV4dGVuZHMgRWxlbWVudEltcGwgaW1wbGVtZW50cyBJTm9kZUV4VmlkZW8sIElOb2RlRXhTb3VuZCB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFuYWx5emVkUmVzdWx0IGFuYWx5emUoQW5hbHl6ZWRSZXN1bHQgYXIpIHsKLSAgICAgICAgYXIuYWRkVmlkZW8odGhpcyk7Ci0gICAgICAgIGFyLmFkZFNvdW5kKHRoaXMpOwotICAgICAgICByZXR1cm4gYXI7Ci0gICAgfQotCi0gICAgcHVibGljIElOb2RlRXggZ2V0UmVmZXJlbmNlTm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFic3RyYWN0VGVybXMgZ2V0VGVybXMoKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYU9iamVjdFRlcm1zLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1lZGlhT2JqZWN0SW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlkaXNwKSB7Ci0gICAgICAgIHN1cGVyKGJhc2VOb2RlLCBpZGlzcCk7Ci0gICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9NZWRpYU9iamVjdFRlcm1zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9NZWRpYU9iamVjdFRlcm1zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYWM0ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvTWVkaWFPYmplY3RUZXJtcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0OwotCi0KLQotCi1jbGFzcyBNZWRpYU9iamVjdFRlcm1zIGV4dGVuZHMgQWJzdHJhY3RUZXJtcyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVkaWFPYmplY3RUZXJtcyBpbnN0YW5jZSA9IG5ldyBNZWRpYU9iamVjdFRlcm1zKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250ZW50KElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc01lZGlhKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbHRlcmFibGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWROb2RlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGVOb2RlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtYmVkZGVkT2JqZWN0KElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgTWVkaWFPYmplY3RUZXJtcyBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvT2JqZWN0RWxlbWVudEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L09iamVjdEVsZW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYThkMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvT2JqZWN0RWxlbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklPYmplY3RFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guRGlzcGF0Y2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci0KLXB1YmxpYyBjbGFzcyBPYmplY3RFbGVtZW50RmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBJT2JqZWN0RWxlbWVudEZhY3RvcnlbXSBmYWN0b3JpZXMgPSBPYmplY3RFbGVtZW50RmFjdG9yeUV4dGVuc2lvbi5nZXRPYmplY3RFbGVtZW50RmFjdG9yaWVzKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBOb2RlSW1wbCBjcmVhdGUoTm9kZUltcGwgYmFzZSwgSURpc3BhdGNoIGlub2RlKSB7Ci0JCWZvciAoSU9iamVjdEVsZW1lbnRGYWN0b3J5IGZhY3RvcnkgOiBmYWN0b3JpZXMpewotCQkJTm9kZUltcGwgbmV3Tm9kZSA9IGZhY3RvcnkuY3JlYXRlVG9wTm9kZShiYXNlLCBpbm9kZSk7Ci0JCQlpZiAobmV3Tm9kZSAhPSBudWxsKQotCQkJCXJldHVybiBuZXdOb2RlOwkJCQotCQl9Ci0KLQkJT2JqZWN0IGNvbnRyb2xzID0gSGVscGVyLmdldChpbm9kZSwgImNvbnRyb2xzIik7Ci0JCWlmIChjb250cm9scyBpbnN0YW5jZW9mIElEaXNwYXRjaCkgewotCQkJcmV0dXJuIG5ldyBXTVBOb2RlSW1wbChiYXNlLCBpbm9kZSwgKElEaXNwYXRjaCkgY29udHJvbHMpOwotCQl9Ci0KLQkJT2JqZWN0IGNsaWVudElEID0gSGVscGVyLmdldChpbm9kZSwgIkNsaWVudElEIik7Ci0JCWlmIChjbGllbnRJRCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFdNUDY0Tm9kZUltcGwoYmFzZSwgaW5vZGUpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCU9iamVjdCBxdFZlcnNpb24gPSBpbm9kZS5pbnZva2UwKCJHZXRRdWlja1RpbWVWZXJzaW9uIik7Ci0JCQlpZiAocXRWZXJzaW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFFUTm9kZUltcGwoYmFzZSwgaW5vZGUpOwotCQkJfQotCQl9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQl0cnkgewotCQkJT2JqZWN0IHJwVmVyc2lvbiA9IGlub2RlLmludm9rZTAoIkdldFZlcnNpb25JbmZvIik7Ci0JCQlpZiAocnBWZXJzaW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFJQTm9kZUltcGwoYmFzZSwgaW5vZGUpOwotCQkJfQotCQl9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L09iamVjdEVsZW1lbnRGYWN0b3J5RXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9PYmplY3RFbGVtZW50RmFjdG9yeUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjIwMDdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L09iamVjdEVsZW1lbnRGYWN0b3J5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLm9iamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JT2JqZWN0RWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBPYmplY3RFbGVtZW50RmFjdG9yeUV4dGVuc2lvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9OQU1FID0gImVsZW1lbnRGYWN0b3J5IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfRUxFTUVOVF9GQUNUT1JZID0gIm9iamVjdEVsZW1lbnRGYWN0b3J5IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lNUEwgPSAiaW1wbGVtZW50YXRpb25zIjsKLQotCXByaXZhdGUgc3RhdGljIE9iamVjdEVsZW1lbnRGYWN0b3J5RXh0ZW5zaW9uW10gZXh0ZW5zaW9uczsKLQotCXByaXZhdGUgc3RhdGljIElPYmplY3RFbGVtZW50RmFjdG9yeVtdIGZhY3RvcmllcyA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIElPYmplY3RFbGVtZW50RmFjdG9yeVtdIGdldE9iamVjdEVsZW1lbnRGYWN0b3JpZXMoKSB7Ci0JCWlmIChmYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhY3RvcmllczsKLQkJfQotCi0JCU9iamVjdEVsZW1lbnRGYWN0b3J5RXh0ZW5zaW9uW10gdG1wRXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnMoKTsKLQkJQXJyYXlMaXN0PElPYmplY3RFbGVtZW50RmFjdG9yeT4gdG1wTGlzdCA9IG5ldyBBcnJheUxpc3Q8SU9iamVjdEVsZW1lbnRGYWN0b3J5PigpOwotCQlpZiAodG1wRXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRtcEV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJT2JqZWN0RWxlbWVudEZhY3RvcnkgdG1wRmFjdG9yeSA9IHRtcEV4dGVuc2lvbnNbaV0uZ2V0RmFjdG9yeSgpOwotCQkJCWlmICh0bXBGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQkJdG1wTGlzdC5hZGQodG1wRmFjdG9yeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZhY3RvcmllcyA9IG5ldyBJT2JqZWN0RWxlbWVudEZhY3RvcnlbdG1wTGlzdC5zaXplKCldOwotCQl0bXBMaXN0LnRvQXJyYXkoZmFjdG9yaWVzKTsKLQkJcmV0dXJuIGZhY3RvcmllczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3RFbGVtZW50RmFjdG9yeUV4dGVuc2lvbltdIGdldEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChleHRlbnNpb25zICE9IG51bGwpCi0JCQlyZXR1cm4gZXh0ZW5zaW9uczsKLQotCQlJRXh0ZW5zaW9uW10gdG1wRXh0ZW5zaW9ucyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkKLQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoIm9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tIiwgRVhURU5TSU9OX05BTUUpCi0JCQkJLmdldEV4dGVuc2lvbnMoKTsKLQotCQlMaXN0PE9iamVjdEVsZW1lbnRGYWN0b3J5RXh0ZW5zaW9uPiBsID0gbmV3IEFycmF5TGlzdDxPYmplY3RFbGVtZW50RmFjdG9yeUV4dGVuc2lvbj4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0bXBFeHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IHRtcEV4dGVuc2lvbnNbaV0KLQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCU9iamVjdEVsZW1lbnRGYWN0b3J5RXh0ZW5zaW9uIGV4ID0gcGFyc2VFeHRlbnNpb24oY29uZmlnRWxlbWVudHNbal0pOwotCQkJCWlmIChleCAhPSBudWxsKSB7Ci0JCQkJCWwuYWRkKGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZXh0ZW5zaW9ucyA9IGwudG9BcnJheShuZXcgT2JqZWN0RWxlbWVudEZhY3RvcnlFeHRlbnNpb25bbC5zaXplKCldKTsKLQkJcmV0dXJuIGV4dGVuc2lvbnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0RWxlbWVudEZhY3RvcnlFeHRlbnNpb24gcGFyc2VFeHRlbnNpb24oCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCkgewotCQlpZiAoIWNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhPQkpFQ1RfRUxFTUVOVF9GQUNUT1JZKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgT2JqZWN0RWxlbWVudEZhY3RvcnlFeHRlbnNpb24oY29uZmlnRWxlbWVudCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJT2JqZWN0RWxlbWVudEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0KLQlwcml2YXRlIE9iamVjdEVsZW1lbnRGYWN0b3J5RXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmZhY3RvcnkgPSAoSU9iamVjdEVsZW1lbnRGYWN0b3J5KSBjb25maWdFbGVtZW50Ci0JCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJfSU1QTCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgSU9iamVjdEVsZW1lbnRGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiB0aGlzLmZhY3Rvcnk7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9RVE5vZGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9RVE5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzY2NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvUVROb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwuTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5EaXNwYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklEaXNwYXRjaDsKLQotCi0KLQotY2xhc3MgUVROb2RlSW1wbCBleHRlbmRzIE1lZGlhT2JqZWN0SW1wbCB7Ci0gICAgCi0gICAgYm9vbGVhbiBwYXVzZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBWaWRlb1N0YXRlIGN1cnJlbnRTdGF0ZSA9IFZpZGVvU3RhdGUuU1RBVEVfVU5LTk9XTjsKLSAgICAKLSAgICBRVE5vZGVJbXBsKE5vZGVJbXBsIGJhc2VOb2RlLCBJRGlzcGF0Y2ggaW5vZGUpIHsKLSAgICAgICAgc3VwZXIoYmFzZU5vZGUsIGlub2RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBleGVjMChTdHJpbmcgY21kKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5vZGUuaW52b2tlMChjbWQpOwotICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZXhlYzEoU3RyaW5nIGNtZCwgT2JqZWN0IG9iaikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGlub2RlLmludm9rZTEoY21kLCBvYmopOwotICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0TXV0ZVN0YXRlKCkgewotICAgICAgICBPYmplY3QgYm9vbCA9IGV4ZWMwKCJHZXRNdXRlIik7Ci0gICAgICAgIGlmIChib29sICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gKChJbnRlZ2VyKSBib29sKS5pbnRWYWx1ZSgpICE9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsKLSAgICAgICAgLy8gcmFuZ2UgaXMgMC0yNTYKLSAgICAgICAgLy8gbWFwcGluZyB0byAwLTEwMDAKLSAgICAgICAgT2JqZWN0IHZvbHVtZSA9IGV4ZWMwKCJHZXRWb2x1bWUiKTsKLQotICAgICAgICBpZiAodm9sdW1lICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gKChJbnRlZ2VyKSB2b2x1bWUpLmludFZhbHVlKCkgKiAxMDAwIC8gMjU2OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtdXRlTWVkaWEoYm9vbGVhbiBmbGFnKSB7Ci0gICAgICAgIGV4ZWMxKCJzZXRNdXRlIiwgQm9vbGVhbi52YWx1ZU9mKGZsYWcpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0Vm9sdW1lKGludCB2YWwpIHsKLSAgICAgICAgaW50IHZvbHVtZSA9IHZhbCAqIDI1NiAvIDEwMDA7Ci0gICAgICAgIGV4ZWMxKCJTZXRWb2x1bWUiLCB2b2x1bWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmYXN0Rm9yd2FyZCgpIHsKLSAgICAgICAgLy8gVE9ETwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmFzdFJldmVyc2UoKSB7Ci0gICAgICAgIGV4ZWMwKCJSZXdpbmQiKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXRDdXJyZW50UG9zaXRpb24oKSB7Ci0gICAgICAgIE9iamVjdCB0aW1lID0gZXhlYzAoIkdldFRpbWUiKTsKLSAgICAgICAgT2JqZWN0IHNjYWxlID0gZXhlYzAoIkdldFRpbWVTY2FsZSIpOwotCi0gICAgICAgIGlmICh0aW1lICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gKChJbnRlZ2VyKSB0aW1lKS5kb3VibGVWYWx1ZSgpIC8gKChJbnRlZ2VyKSBzY2FsZSkuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3RhdGUgZ2V0Q3VycmVudFN0YXRlKCkgewotICAgICAgICByZXR1cm4gY3VycmVudFN0YXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0VG90YWxMZW5ndGgoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbmV4dFRyYWNrKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwYXVzZU1lZGlhKCkgewotICAgICAgICBpZiAoY3VycmVudFN0YXRlID09IFZpZGVvU3RhdGUuU1RBVEVfUEFVU0UpIAotICAgICAgICAgICAgcmV0dXJuIHBsYXlNZWRpYSgpOwotICAgICAgICBleGVjMCgiU3RvcCIpOwotICAgICAgICBjdXJyZW50U3RhdGUgPSBWaWRlb1N0YXRlLlNUQVRFX1BBVVNFOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwbGF5TWVkaWEoKSB7Ci0gICAgICAgIGV4ZWMwKCJQbGF5Iik7Ci0gICAgICAgIGN1cnJlbnRTdGF0ZSA9IFZpZGVvU3RhdGUuU1RBVEVfUExBWTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcHJldmlvdXNUcmFjaygpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3RvcE1lZGlhKCkgewotICAgICAgICBleGVjMCgiU3RvcCIpOwotICAgICAgICBleGVjMSgiU2V0VGltZSIsIDApOwotICAgICAgICBjdXJyZW50U3RhdGUgPSBWaWRlb1N0YXRlLlNUQVRFX1NUT1A7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L1JQTm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L1JQTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczNWVkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9kb21ieWNvbS9pbXBsL29iamVjdC9SUE5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLmltcGwub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20uaW1wbC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLkRpc3BhdGNoRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSURpc3BhdGNoOwotCi0KLQotCi1jbGFzcyBSUE5vZGVJbXBsIGV4dGVuZHMgTWVkaWFPYmplY3RJbXBsIHsKLQotICAgIC8vIEhvbGRpbmcgaW50ZXJuYWwgc3RhdGUgYmVjYXVzZSBSZWFsIFBsYXllcidzIHN0YXRlCi0gICAgLy8gaXMgbm90IGNoYW5nZWQgcmlnaHQgYWZ0ZXIgZXhlY3V0aW5nIGNvbW1hbmQKLQotICAgIHByaXZhdGUgYm9vbGVhbiBwYXVzZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHBsYXkgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBzdG9wID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbXV0ZSA9IGZhbHNlOwotCi0gICAgUlBOb2RlSW1wbChOb2RlSW1wbCBiYXNlTm9kZSwgSURpc3BhdGNoIGlub2RlKSB7Ci0gICAgICAgIHN1cGVyKGJhc2VOb2RlLCBpbm9kZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZXhlYzAoU3RyaW5nIGNtZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGlub2RlLmludm9rZTAoY21kKTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IGV4ZWMxKFN0cmluZyBjbWQsIE9iamVjdCBvYmopIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpbm9kZS5pbnZva2UxKGNtZCwgb2JqKTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldE11dGVTdGF0ZSgpIHsKLSAgICAgICAgT2JqZWN0IGJvb2wgPSBleGVjMCgiR2V0TXV0ZSIpOwotCi0gICAgICAgIGlmIChtdXRlKSB7Ci0gICAgICAgICAgICBtdXRlID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChib29sICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gKChCb29sZWFuKSBib29sKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lKCkgewotICAgICAgICAvLyByYW5nZSBpcyAwLTEwMAotICAgICAgICAvLyBtYXBwaW5nIHRvIDAtMTAwMAotICAgICAgICBPYmplY3Qgdm9sdW1lID0gZXhlYzAoIkdldFZvbHVtZSIpOwotCi0gICAgICAgIGlmICh2b2x1bWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAoKFNob3J0KSB2b2x1bWUpLmludFZhbHVlKCkgKiAxMDAwIC8gMTAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtdXRlTWVkaWEoYm9vbGVhbiBmbGFnKSB7Ci0gICAgICAgIC8vIGNhbm5vdCBtdXRlIG1lZGlhIHdpdGggInRydWUiLCBidXQgY2FuIG11dGUgbWVkaWEgd2l0aCAiMSIKLSAgICAgICAgLy8gWyBleGVjMSgiU2V0TXV0ZSIsIHRydWUpOyBdIHgKLSAgICAgICAgLy8gWyBleGVjMSgiU2V0TXV0ZSIsIDEpOyBdIG8KLSAgICAgICAgLy8gWyBleGVjMSgiU2V0TXV0ZSIsIGZhbHNlKTtdIG8KLQotICAgICAgICBleGVjMSgiU2V0TXV0ZSIsIGZsYWcgPyAxIDogMCk7Ci0gICAgICAgIG11dGUgPSB0cnVlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRWb2x1bWUoaW50IHZhbCkgewotICAgICAgICBpbnQgdm9sdW1lID0gdmFsICogMTAwIC8gMTAwMDsKLSAgICAgICAgZXhlYzEoIlNldFZvbHVtZSIsIHZvbHVtZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGZhc3RGb3J3YXJkKCkgewotICAgICAgICAvLyBUT0RPCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBmYXN0UmV2ZXJzZSgpIHsKLSAgICAgICAgZXhlYzAoIlJld2luZCIpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldEN1cnJlbnRQb3NpdGlvbigpIHsKLSAgICAgICAgT2JqZWN0IHRpbWUgPSBleGVjMCgiR2V0UG9zaXRpb24iKTsKLQotICAgICAgICBpZiAodGltZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcikgdGltZSkuZG91YmxlVmFsdWUoKSAvIDEwMDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1N0YXRlIGdldEN1cnJlbnRTdGF0ZSgpIHsKLSAgICAgICAgT2JqZWN0IHN0YXRlID0gZXhlYzAoIkdldFBsYXlTdGF0ZSIpOwotCi0gICAgICAgIGlmIChwYXVzZSkgewotICAgICAgICAgICAgcGF1c2UgPSBwbGF5ID0gc3RvcCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfUEFVU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBsYXkpIHsKLSAgICAgICAgICAgIHBhdXNlID0gcGxheSA9IHN0b3AgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1BMQVk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0b3ApIHsKLSAgICAgICAgICAgIHBhdXNlID0gcGxheSA9IHN0b3AgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1NUT1A7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgc3dpdGNoICgoKEludGVnZXIpIHN0YXRlKS5pbnRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfU1RPUDsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9XQUlUSU5HOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1BMQVk7Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfUEFVU0U7Ci0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfV0FJVElORzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9VTktOT1dOOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0VG90YWxMZW5ndGgoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbmV4dFRyYWNrKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwYXVzZU1lZGlhKCkgewotICAgICAgICBpZiAoZ2V0Q3VycmVudFN0YXRlKCkgPT0gVmlkZW9TdGF0ZS5TVEFURV9QQVVTRSkKLSAgICAgICAgICAgIHJldHVybiBwbGF5TWVkaWEoKTsKLSAgICAgICAgZXhlYzAoIkRvUGF1c2UiKTsKLSAgICAgICAgcGF1c2UgPSB0cnVlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwbGF5TWVkaWEoKSB7Ci0gICAgICAgIGV4ZWMwKCJEb1BsYXkiKTsKLSAgICAgICAgcGxheSA9IHRydWU7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHByZXZpb3VzVHJhY2soKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0b3BNZWRpYSgpIHsKLSAgICAgICAgZXhlYzAoIkRvU3RvcCIpOwotICAgICAgICBzdG9wID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvV01QNjROb2RlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvV01QNjROb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTc2MmU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L1dNUDY0Tm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklOb2RlRXhTb3VuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guRGlzcGF0Y2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci0KLQotCi0KLWNsYXNzIFdNUDY0Tm9kZUltcGwgZXh0ZW5kcyBNZWRpYU9iamVjdEltcGwgewotICAgIC8vIFRoaXMgZmxhZyBpcyBzb21ld2hhdCBhIHdvcmthcm91bmQuCi0gICAgLy8gRXZlbiBpZiB3ZSBwdXQgIk11dGUiIHByb3BlcnR5IHRvICJ0cnVlIiwKLSAgICAvLyBpdCBkb2VzIG5vdCBhZmZlY3QgdGhlIHZhbHVlIHRvIGJlIG9idGFpbmVkLgotICAgIC8vIFRoZXJlZm9yZSwgd2UgcmVtZW1iZXIgdGhlIG11dGUgc3RhdGUgYnkgb3Vyc2VsdmVzLgotICAgIHByaXZhdGUgYm9vbGVhbiBtdXRlU3RhdGU7Ci0KLSAgICBXTVA2NE5vZGVJbXBsKE5vZGVJbXBsIGJhc2VOb2RlLCBJRGlzcGF0Y2ggaWRpc3ApIHsKLSAgICAgICAgc3VwZXIoYmFzZU5vZGUsIGlkaXNwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZXhlY0NvbnRyb2xzKFN0cmluZyBjbWQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlub2RlLmludm9rZTAoY21kKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBwdXRTZXR0aW5ncyhTdHJpbmcgcHJvcCwgT2JqZWN0IHZhbCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5vZGUucHV0KHByb3AsIHZhbCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRTZXR0aW5ncyhTdHJpbmcgcHJvcCkgewotICAgICAgICByZXR1cm4gSGVscGVyLmdldChpbm9kZSwgcHJvcCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmFzdEZvcndhcmQoKSB7Ci0gICAgICAgIHJldHVybiBleGVjQ29udHJvbHMoImZhc3RGb3J3YXJkIik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmFzdFJldmVyc2UoKSB7Ci0gICAgICAgIHJldHVybiBleGVjQ29udHJvbHMoImZhc3RSZXZlcnNlIik7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXRDdXJyZW50UG9zaXRpb24oKSB7Ci0gICAgICAgIE9iamVjdCBvID0gSGVscGVyLmdldChpbm9kZSwgImN1cnJlbnRQb3NpdGlvbiIpOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIERvdWJsZSkgewotICAgICAgICAgICAgcmV0dXJuICgoRG91YmxlKSBvKS5kb3VibGVWYWx1ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGbG9hdCkgewotICAgICAgICAgICAgcmV0dXJuICgoRmxvYXQpIG8pLmZsb2F0VmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcikgbykuaW50VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldFRvdGFsTGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbmV4dFRyYWNrKCkgewotICAgICAgICByZXR1cm4gZXhlY0NvbnRyb2xzKCJuZXh0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcGF1c2VNZWRpYSgpIHsKLSAgICAgICAgcmV0dXJuIGV4ZWNDb250cm9scygicGF1c2UiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwbGF5TWVkaWEoKSB7Ci0gICAgICAgIHJldHVybiBleGVjQ29udHJvbHMoInBsYXkiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwcmV2aW91c1RyYWNrKCkgewotICAgICAgICByZXR1cm4gZXhlY0NvbnRyb2xzKCJwcmV2aW91cyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0b3BNZWRpYSgpIHsKLSAgICAgICAgcmV0dXJuIGV4ZWNDb250cm9scygic3RvcCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lKCkgewotICAgICAgICBPYmplY3QgbyA9IGdldFNldHRpbmdzKCJWb2x1bWUiKTsKLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEludGVnZXIpKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpbnQgdm9sID0gKChJbnRlZ2VyKSBvKS5pbnRWYWx1ZSgpOwotICAgICAgICAvLyBXTVA2NCB2b2x1bWUgcmFuZ2UgaXMgMCAtLSAtMTAwMDAuIERlZmF1bHQgaXMgLTYwMC4gIFdlIHJlc2NhbGUgaXQgdG8gMCAtLSAtMjAwMAotICAgICAgICBpZiAodm9sIDwgLTIwMDApIHsKLSAgICAgICAgICAgIHJldHVybiBJTm9kZUV4U291bmQuVk9MVU1FX01JTjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKCgodm9sICsgMjAwMCkgKiAoSU5vZGVFeFNvdW5kLlZPTFVNRV9NQVggLSBJTm9kZUV4U291bmQuVk9MVU1FX01JTikgLyAyMDAwKQotICAgICAgICAgICAgICAgICsgSU5vZGVFeFNvdW5kLlZPTFVNRV9NSU4pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG11dGVNZWRpYShib29sZWFuIGZsYWcpIHsKLSAgICAgICAgaWYgKHB1dFNldHRpbmdzKCJNdXRlIiwgZmxhZykpIHsKLSAgICAgICAgICAgIG11dGVTdGF0ZSA9IGZsYWc7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldE11dGVTdGF0ZSgpIHsKLSAgICAgICAgT2JqZWN0IG8gPSBnZXRTZXR0aW5ncygiTXV0ZSIpOwotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgQm9vbGVhbikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiAoKEJvb2xlYW4pIG8pLmJvb2xlYW5WYWx1ZSgpIHx8IG11dGVTdGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRWb2x1bWUoaW50IHZhbCkgewotICAgICAgICAvLyBGaXJzdCwgc2NhbGUgb3VyIHZvbHVtZSByYW5nZSB0byAyMDAwIC0tIDA7Ci0gICAgICAgIHZhbCA9ICgoKHZhbCAtIElOb2RlRXhTb3VuZC5WT0xVTUVfTUlOKSAqIDIwMDApCi0gICAgICAgICAgICAgICAvIChJTm9kZUV4U291bmQuVk9MVU1FX01BWCAtIElOb2RlRXhTb3VuZC5WT0xVTUVfTUlOKSk7Ci0gICAgICAgIGlmICh2YWwgPT0gMCkgewotICAgICAgICAgICAgdmFsID0gLSAxMDAwMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZhbCAtPSAyMDAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwdXRTZXR0aW5ncygiVm9sdW1lIiwgSW50ZWdlci52YWx1ZU9mKHZhbCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1N0YXRlIGdldEN1cnJlbnRTdGF0ZSgpIHsKLSAgICAgICAgT2JqZWN0IG8gPSBIZWxwZXIuZ2V0KGlub2RlLCAiUGxheVN0YXRlIik7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgaW50IHdtcHN0ID0gKEludGVnZXIpIG87Ci0gICAgICAgICAgICBzd2l0Y2ggKHdtcHN0KSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfU1RPUDsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9QQVVTRTsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9QTEFZOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1dBSVRJTkc7Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfRkFTVEZPUldBUkQ7Ci0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfRkFTVFJFVkVSU0U7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1NUT1A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9VTktOT1dOOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvV01QTm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2RvbWJ5Y29tL2ltcGwvb2JqZWN0L1dNUE5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTI3NDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vZG9tYnljb20vaW1wbC9vYmplY3QvV01QTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklOb2RlRXhTb3VuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guRGlzcGF0Y2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci0KLQotCi0KLWNsYXNzIFdNUE5vZGVJbXBsIGV4dGVuZHMgTWVkaWFPYmplY3RJbXBsIHsKLSAgICBwcml2YXRlIGZpbmFsIElEaXNwYXRjaCBjb250cm9sczsKLSAgICBwcml2YXRlIGZpbmFsIElEaXNwYXRjaCBzZXR0aW5nczsKLQotICAgIFdNUE5vZGVJbXBsKE5vZGVJbXBsIGJhc2VOb2RlLCBJRGlzcGF0Y2ggaWRpc3AsIElEaXNwYXRjaCBjb250cm9scykgewotICAgICAgICBzdXBlcihiYXNlTm9kZSwgaWRpc3ApOwotICAgICAgICB0aGlzLmNvbnRyb2xzID0gY29udHJvbHM7Ci0gICAgICAgIE9iamVjdCBvID0gSGVscGVyLmdldChpZGlzcCwgInNldHRpbmdzIik7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgSURpc3BhdGNoKSB7Ci0gICAgICAgICAgICB0aGlzLnNldHRpbmdzID0gKElEaXNwYXRjaCkgbzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGV4ZWNDb250cm9scyhTdHJpbmcgY21kKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9scy5pbnZva2UwKGNtZCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcHV0U2V0dGluZ3MoU3RyaW5nIHByb3AsIE9iamVjdCB2YWwpIHsKLSAgICAgICAgaWYgKHNldHRpbmdzID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldHRpbmdzLnB1dChwcm9wLCB2YWwpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0U2V0dGluZ3MoU3RyaW5nIHByb3ApIHsKLSAgICAgICAgaWYgKHNldHRpbmdzID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gSGVscGVyLmdldChzZXR0aW5ncywgcHJvcCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmFzdEZvcndhcmQoKSB7Ci0gICAgICAgIHJldHVybiBleGVjQ29udHJvbHMoImZhc3RGb3J3YXJkIik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmFzdFJldmVyc2UoKSB7Ci0gICAgICAgIHJldHVybiBleGVjQ29udHJvbHMoImZhc3RSZXZlcnNlIik7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXRDdXJyZW50UG9zaXRpb24oKSB7Ci0gICAgICAgIE9iamVjdCBvID0gSGVscGVyLmdldChjb250cm9scywgImN1cnJlbnRQb3NpdGlvbiIpOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIERvdWJsZSkgewotICAgICAgICAgICAgcmV0dXJuICgoRG91YmxlKSBvKS5kb3VibGVWYWx1ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGbG9hdCkgewotICAgICAgICAgICAgcmV0dXJuICgoRmxvYXQpIG8pLmZsb2F0VmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgSW50ZWdlcikgewotICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcikgbykuaW50VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldFRvdGFsTGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbmV4dFRyYWNrKCkgewotICAgICAgICByZXR1cm4gZXhlY0NvbnRyb2xzKCJuZXh0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcGF1c2VNZWRpYSgpIHsKLSAgICAgICAgcmV0dXJuIGV4ZWNDb250cm9scygicGF1c2UiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwbGF5TWVkaWEoKSB7Ci0gICAgICAgIHJldHVybiBleGVjQ29udHJvbHMoInBsYXkiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwcmV2aW91c1RyYWNrKCkgewotICAgICAgICByZXR1cm4gZXhlY0NvbnRyb2xzKCJwcmV2aW91cyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0b3BNZWRpYSgpIHsKLSAgICAgICAgcmV0dXJuIGV4ZWNDb250cm9scygic3RvcCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lKCkgewotICAgICAgICBPYmplY3QgbyA9IGdldFNldHRpbmdzKCJ2b2x1bWUiKTsKLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEludGVnZXIpKSByZXR1cm4gLTE7Ci0gICAgICAgIGludCB2b2wgPSAoKEludGVnZXIpIG8pLmludFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiAoKHZvbCAqICgoSU5vZGVFeFNvdW5kLlZPTFVNRV9NQVggLSBJTm9kZUV4U291bmQuVk9MVU1FX01JTikgLyAxMDApKQotICAgICAgICAgICAgICAgICsgSU5vZGVFeFNvdW5kLlZPTFVNRV9NSU4pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG11dGVNZWRpYShib29sZWFuIGZsYWcpIHsKLSAgICAgICAgcmV0dXJuIHB1dFNldHRpbmdzKCJtdXRlIiwgZmxhZyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2V0Vm9sdW1lKGludCB2YWwpIHsKLSAgICAgICAgdmFsID0gKCgodmFsIC0gSU5vZGVFeFNvdW5kLlZPTFVNRV9NSU4pICogMTAwKQotICAgICAgICAgICAgICAgLyAoSU5vZGVFeFNvdW5kLlZPTFVNRV9NQVggLSBJTm9kZUV4U291bmQuVk9MVU1FX01JTikpOwotICAgICAgICByZXR1cm4gcHV0U2V0dGluZ3MoInZvbHVtZSIsIEludGVnZXIudmFsdWVPZih2YWwpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9TdGF0ZSBnZXRDdXJyZW50U3RhdGUoKSB7Ci0gICAgICAgIE9iamVjdCBvID0gSGVscGVyLmdldChpbm9kZSwgInBsYXlTdGF0ZSIpOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgIGludCB3bXBzdCA9IChJbnRlZ2VyKSBvOwotICAgICAgICAgICAgc3dpdGNoICh3bXBzdCkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1VOS05PV047Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZpZGVvU3RhdGUuU1RBVEVfU1RPUDsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9QQVVTRTsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9QTEFZOwotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX0ZBU1RGT1JXQVJEOwotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX0ZBU1RSRVZFUlNFOwotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1dBSVRJTkc7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBWaWRlb1N0YXRlLlNUQVRFX1NUT1A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gVmlkZW9TdGF0ZS5TVEFURV9VTktOT1dOOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0TXV0ZVN0YXRlKCkgewotICAgICAgICBPYmplY3QgbyA9IGdldFNldHRpbmdzKCJtdXRlIik7Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBCb29sZWFuKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gKChCb29sZWFuKSBvKS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjAyZTc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWw8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZTY4NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RodSBGZWIgMjEgMjE6MDI6NDIgSlNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy8vYWJvdXRfZmlsZXMvVzNDX1NvZnR3YXJlX0xpY2Vuc2UuaHRtbD1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NTdlOGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFY2xpcHNlIEFDVEYgSFRNTCBNb2RlbCBQbHVnLWluIChJbmN1YmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbAotQnVuZGxlLVZlcnNpb246IDAuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUVjbGlwc2UtTGF6eVN0YXJ0OiBmYWxzZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5lcnJvcmhhbmRsZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5N2JlZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMT5BYm91dCBUaGlzIENvbnRlbnQ8L2gxPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+CQotPGgyPkxpY2Vuc2U8L2gyPgotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi0KLQk8aDI+VGhpcmQgUGFydHkgQ29udGVudDwvaDI+Ci0JPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4gSWYgeW91IAotCWRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIAotCWZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIGZvciAKLQl0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotCi08aDM+SFRNTCBEVERzPC9oMz4KLQotPHA+VGhlIHBsdWctaW4gaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIChXM0MpLjwvcD4KLQotPHA+VGhlIEhUTUwgRFREcyBhcmUgY29udGFpbmVkIGluIHRoaXMgcGx1Zy1pbi4gVGhlc2UgZmlsZXMgYXJlIHByb3ZpZGVkIHdpdGhvdXQgbW9kaWZpY2F0aW9uLiAKLVRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlIGNhbiBiZSBvYnRhaW5lZCBmcm9tIDxhIGhyZWY9Imh0dHA6Ly93d3cudzNjLm9yZy8iPldvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW08L2E+IFdlYiBzaXRlLjwvcD4KLQotPHA+WW91ciB1c2Ugb2YgdGhlIEhUTUwgRFREcyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgVzNDJnJlZzsgU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFLiAKLUEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBjb250YWluZWQgaW4gdGhlIGZpbGUgCi08YSBocmVmPSJhYm91dF9maWxlcy9XM0NfU29mdHdhcmVfTGljZW5zZS5odG1sIj5XM0NfU29mdHdhcmVfTGljZW5zZS5odG1sPC9hPiAKLWFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCAKLTxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLmh0bWwiPmh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLmh0bWw8L2E+LgotCi08cD5UaGUgbmFtZXMgb2YgdGhlc2UgRFREcyBhbmQgICZxdW90O1dvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gKFczQykmcXVvdDsgCi1tdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIAotRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPGEgaHJlZj0ibWFpbHRvOnNpdGUtcG9saWN5QHczLm9yZyI+c2l0ZS1wb2xpY3lAdzMub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvYWJvdXRfZmlsZXMvVzNDX1NvZnR3YXJlX0xpY2Vuc2UuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9hYm91dF9maWxlcy9XM0NfU29mdHdhcmVfTGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmRlOWExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9hYm91dF9maWxlcy9XM0NfU29mdHdhcmVfTGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLSAgPHRpdGxlPlczQyBTb2Z0d2FyZSBMaWNlbnNlPC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvU3R5bGVTaGVldHMvYmFzZS5jc3MiIC8+Ci0gIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci0gPCEtLQotaDMjdmVyc2lvbiB7IG1hcmdpbi10b3A6IC0wLjhlbTt9ICAKLS0tPgotCi0KLQotCi0KLQotCi0KLQotICA8L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjRkZGRkZGIj4KLTxoMT5XM0M8c3VwPq48L3N1cD4gU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFPC9oMT4KLQotPGgzIGlkPSJ2ZXJzaW9uIj48YQotaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMSI+aHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMTwvYT48L2gzPgotCi08cD5UaGlzIHdvcmsgKGFuZCBpbmNsdWRlZCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiBzdWNoIGFzIFJFQURNRXMsIG9yIG90aGVyCi1yZWxhdGVkIGl0ZW1zKSBpcyBiZWluZyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgdW5kZXIgdGhlIGZvbGxvd2luZwotbGljZW5zZS4gQnkgb2J0YWluaW5nLCB1c2luZyBhbmQvb3IgY29weWluZyB0aGlzIHdvcmssIHlvdSAodGhlIGxpY2Vuc2VlKQotYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLCBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nCi10ZXJtcyBhbmQgY29uZGl0aW9ucy48L3A+Ci0KLTxwPlBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLWRvY3VtZW50YXRpb24sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sJm5ic3A7Zm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0Ci1mZWUgb3Igcm95YWx0eSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9uCi1BTEwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcKLW1vZGlmaWNhdGlvbnM6PC9wPgotPG9sPgotICA8bGk+VGhlIGZ1bGwgdGV4dCBvZiB0aGlzIE5PVElDRSBpbiBhIGxvY2F0aW9uIHZpZXdhYmxlIHRvIHVzZXJzIG9mIHRoZQotICAgIHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSB3b3JrLjwvbGk+Ci0gIDxsaT5BbnkgcHJlLWV4aXN0aW5nIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBkaXNjbGFpbWVycywgbm90aWNlcywgb3IgdGVybXMKLSAgICBhbmQgY29uZGl0aW9ucy4gSWYgbm9uZSBleGlzdCwgdGhlIDxhCi0gICAgaHJlZj0iY29weXJpZ2h0LXNvZnR3YXJlLXNob3J0LW5vdGljZS0yMDAyMTIzMS5odG1sIj5XM0MgU29mdHdhcmUgU2hvcnQKLSAgICBOb3RpY2U8L2E+IHNob3VsZCBiZSBpbmNsdWRlZCAoaHlwZXJ0ZXh0IGlzIHByZWZlcnJlZCwgdGV4dCBpcyBwZXJtaXR0ZWQpCi0gICAgd2l0aGluIHRoZSBib2R5IG9mIGFueSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgY29kZS48L2xpPgotICA8bGk+Tm90aWNlIG9mIGFueSBjaGFuZ2VzIG9yIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGZpbGVzLCBpbmNsdWRpbmcgdGhlIGRhdGUKLSAgICBjaGFuZ2VzIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tCi0gICAgd2hpY2ggdGhlIGNvZGUgaXMgZGVyaXZlZC4pPC9saT4KLTwvb2w+Ci0KLTxwPlRISVMgU09GVFdBUkUgQU5EIERPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTLCIgQU5EIENPUFlSSUdIVCBIT0xERVJTCi1NQUtFIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UCi1MSU1JVEVEIFRPLCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUgotUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UKLUFOWSBUSElSRCBQQVJUWSBQQVRFTlRTLCBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUy48L3A+Ci0KLTxwPkNPUFlSSUdIVCBIT0xERVJTIFdJTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwgT1IKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBBTlkgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUgotRE9DVU1FTlRBVElPTi48L3A+Ci0KLTxwPlRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIGNvcHlyaWdodCBob2xkZXJzIG1heSBOT1QgYmUgdXNlZCBpbgotYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4KLXByaW9yIHBlcm1pc3Npb24uIFRpdGxlIHRvIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgYXNzb2NpYXRlZAotZG9jdW1lbnRhdGlvbiB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCBjb3B5cmlnaHQgaG9sZGVycy48L3A+Ci0KLTxwPjwvcD4KLQotPHA+X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPC9wPgotCi08cD5UaGlzIGZvcm11bGF0aW9uIG9mIFczQydzIG5vdGljZSBhbmQgbGljZW5zZSBiZWNhbWUgYWN0aXZlIG9uIERlY2VtYmVyIDMxCi0yMDAyLiBUaGlzIHZlcnNpb24gcmVtb3ZlcyB0aGUgY29weXJpZ2h0IG93bmVyc2hpcCBub3RpY2Ugc3VjaCB0aGF0IHRoaXMKLWxpY2Vuc2UgY2FuIGJlIHVzZWQgd2l0aCBtYXRlcmlhbHMgb3RoZXIgdGhhbiB0aG9zZSBvd25lZCBieSB0aGUgVzNDLAotcmVmbGVjdHMgdGhhdCBFUkNJTSBpcyBub3cgYSBob3N0IG9mIHRoZSBXM0MsIGluY2x1ZGVzIHJlZmVyZW5jZXMgdG8gdGhpcwotc3BlY2lmaWMgZGF0ZWQgdmVyc2lvbiBvZiB0aGUgbGljZW5zZSwgYW5kIHJlbW92ZXMgdGhlIGFtYmlndW91cyBncmFudCBvZgotInVzZSIuIE90aGVyd2lzZSwgdGhpcyB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSA8YQotaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAiPnByZXZpb3VzCi12ZXJzaW9uPC9hPiBhbmQgaXMgd3JpdHRlbiBzbyBhcyB0byBwcmVzZXJ2ZSB0aGUgPGEKLWhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9waGlsb3NvcGh5L2xpY2Vuc2UtbGlzdC5odG1sI0dQTENvbXBhdGlibGVMaWNlbnNlcyI+RnJlZQotU29mdHdhcmUgRm91bmRhdGlvbidzIGFzc2Vzc21lbnQgb2YgR1BMIGNvbXBhdGliaWxpdHk8L2E+IGFuZCA8YQotaHJlZj0iaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9XM0MucGhwIj5PU0kncyBjZXJ0aWZpY2F0aW9uPC9hPgotdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvZG9jcy9kZWZpbml0aW9uLnBocCI+T3BlbiBTb3VyY2UKLURlZmluaXRpb248L2E+LiBQbGVhc2Ugc2VlIG91ciA8YQotaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9JUFItRkFRIj5Db3B5cmlnaHQgRkFRPC9hPiBmb3IKLWNvbW1vbiBxdWVzdGlvbnMgYWJvdXQgdXNpbmcgbWF0ZXJpYWxzIGZyb20gb3VyIHNpdGUsIGluY2x1ZGluZyBzcGVjaWZpYwotdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHBhY2thZ2VzIGxpa2UgbGlid3d3LCBBbWF5YSwgYW5kIEppZ3Nhdy4gT3RoZXIKLXF1ZXN0aW9ucyBhYm91dCB0aGlzIG5vdGljZSBjYW4gYmUgZGlyZWN0ZWQgdG8gPGEKLWhyZWY9Im1haWx0bzpzaXRlLXBvbGljeUB3My5vcmciPnNpdGUtcG9saWN5QHczLm9yZzwvYT4uPGJyIC8+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmRhNTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvSFRNTFBhcnNlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9IVE1MUGFyc2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzFhYWI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9IVE1MUGFyc2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5wYXJzZXIuSFRNTFBhcnNlcjsKLQotLyoqCi0gKiBGYWN0b3J5IGNsYXNzIGZvciB7QGxpbmsgSUhUTUxQYXJzZXJ9Ci0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MUGFyc2VyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgSUhUTUxQYXJzZXJ9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJSFRNTFBhcnNlciBjcmVhdGVIVE1MUGFyc2VyKCkgewotCQlJSFRNTFBhcnNlciBwYXJzZXIgPSBuZXcgSFRNTFBhcnNlcigpOwotCQlwYXJzZXIuc2V0VGFnQ2FzZShJUGFyc2VyLkxPV0VSX0NBU0UpOwotCQlwYXJzZXIuc2V0QXR0ck5hbWVDYXNlKElQYXJzZXIuTE9XRVJfQ0FTRSk7Ci0JCXBhcnNlci5zZXREZWZhdWx0VGFnQ2FzZShJUGFyc2VyLkxPV0VSX0NBU0UpOwotCQlwYXJzZXIua2VlcFVua25vd25FbGVtZW50cyh0cnVlKTsKLQkJcGFyc2VyLmVsZW1lbnRIYW5kbGUoZmFsc2UpOyAvLyB0byBnZXQgbGluZSBudW1iZXIKLQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL0lFcnJvckhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9JRXJyb3JIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMThjOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL0lFcnJvckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBOb2RlLWxldmVsIGVycm9yIGhhbmRsZXIgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFcnJvckhhbmRsZXIgZXh0ZW5kcyBJUGFyc2VyRXJyb3IgewotCS8qKgotCSAqIEhhbmRsZXMgZXJyb3Igd2hvc2UgdHlwZSBpcyBzcGVjaWZpZWQgYnkgPGNvZGU+Y29kZTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gY29kZQotCSAqICAgICAgICAgICAgZXJyb3IgdHlwZS4KLQkgKiBAcGFyYW0gcGFyc2VyCi0JICogICAgICAgICAgICBjYWxsZXIgb2YgdGhpcyBoYW5kbGVyLiBUaGlzIHBhcnNlcidzIHN0YXRlIGlzIGVhc2lseSBjaGFuZ2VkCi0JICogICAgICAgICAgICBieSB0aGUgcmVmZXJlbmNlZCBtZXRob2RzLgotCSAqIEBwYXJhbSBlcnJvck5vZGUKLQkgKiAgICAgICAgICAgIGEgbm9kZSB0aGF0IGNhdXNlcyB0aGUgZXJyb3IuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlcnJvciB3YXMgaGFuZGxlZC4gT3RoZXJ3aXNlIDxjb2RlPmZhbHNlCi0JICogPC9jb2RlPi4KLQkgKiBAc2VlIElQYXJzZXIjZ2V0Tm9kZSgpCi0JICogQHNlZSBJUGFyc2VyI3B1c2hCYWNrTm9kZShvcmcudzNjLmRvbS5Ob2RlKQotCSAqIEBzZWUgSVBhcnNlciNnZXRFeHRyYUVyckluZm8oKQotCSAqIEBzZWUgSVBhcnNlciNnZXRDb250ZXh0KCkKLQkgKiBAc2VlIElQYXJzZXIjc2V0Q29udGV4dChvcmcudzNjLmRvbS5FbGVtZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhbmRsZUVycm9yKGludCBjb2RlLCBJUGFyc2VyIHBhcnNlciwgTm9kZSBlcnJvck5vZGUpCi0JCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvSUVycm9yTG9nTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9JRXJyb3JMb2dMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjVhNmUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9JRXJyb3JMb2dMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIGNsYXNzIG9mIHRoaXMgaW50ZXJmYWNlIGlzIGFkZGVkIHRvIHtAbGluayBJUGFyc2VyIElQYXJzZXJ9Ci0gKiBpbnN0YW5jZSBieSB7QGxpbmsgIElQYXJzZXIjYWRkRXJyb3JMb2dMaXN0ZW5lcihJRXJyb3JMb2dMaXN0ZW5lcikKLSAqIGFkZEVycm9yTG9nTGlzdGVuZXJ9LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFcnJvckxvZ0xpc3RlbmVyIHsKLQkvKioKLQkgKiBSZWNvcmRzIGVycm9yIG1lc3NhZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGVycm9yTG9nKGludCBlcnJvckNvZGUsIFN0cmluZyBtc2cpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL0lIVE1MUGFyc2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvSUhUTUxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjNDZiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvSUhUTUxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElIVE1MUGFyc2VyIGV4dGVuZHMgSVBhcnNlciB7Ci0KLQkvKioKLQkgKiBQYXJzZXMgYW4gSFRNTCBkb2N1bWVudCBhbmQgcmV0dXJuIGl0cyB0b3AgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaXMKLQkgKiAgICAgICAgICAgIHRhcmdldCB7QGxpbmsgSW5wdXRTdHJlYW19IHRvIHBhcnNlIHdpdGggZGVmYXVsdCBlbmNvZGluZy4KLQkgKiBAcmV0dXJuIFRvcCBlbGVtZW50LgotCSAqIEBleGNlcHRpb24gUGFzZXJFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB1bnJlY292ZXJhYmxlIHN5bnRheCBvciB0b2tlbiBlcnJvciBvY2N1cnJlZCwgdGhyb3duCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBOb2RlIHBhcnNlKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotCQkJU0FYRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUGFyc2VzIGEgSFRNTCBkb2N1bWVudCBhbmQgcmV0dXJuIGl0cyB0b3AgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaXMKLQkgKiAgICAgICAgICAgIHRhcmdldCB7QGxpbmsgSW5wdXRTdHJlYW19IHRvIHBhcnNlLgotCSAqIEBwYXJhbSBjaGFyRW5jb2RpbmcKLQkgKiAgICAgICAgICAgIGVuY29kaW5nIHVzZWQgZm9yIHBhcnNlCi0JICogQHJldHVybiBUb3AgZWxlbWVudC4KLQkgKiBAZXhjZXB0aW9uIFBhc2VyRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgdW5yZWNvdmVyYWJsZSBzeW50YXggb3IgdG9rZW4gZXJyb3Igb2NjdXJyZWQsIHRocm93bgotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTm9kZSBwYXJzZShJbnB1dFN0cmVhbSBpcywgU3RyaW5nIGNoYXJFbmNvZGluZykgdGhyb3dzIFNBWEV4Y2VwdGlvbiwKLQkJCVBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFBhcnNlcyBhIEhUTUwgZG9jdW1lbnQgYW5kIHJldHVybiBpdHMgdG9wIGVsZW1lbnQuIFRoaXMgbWV0aG9kIGlzIGFsbW9zdAotCSAqIHNhbWUgYXMge0BsaW5rICNwYXJzZShJbnB1dFN0cmVhbSkgcGFyc2UoSW5wdXRTdHJlYW0pfS4gSWYgaXQgbWVldHMKLQkgKiA8Y29kZT4gJmx0O01FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAKLQkgKiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9eHh4IiZndDs8L2NvZGU+Ci0JICogdGFnIGluIGEgZG9jdW1lbnQsIGl0IHRyaWVzIHRvIGNoYW5nZSBlbmNvZGluZyB0byA8Y29kZT54eHg8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpcwotCSAqICAgICAgICAgICAgdGFyZ2V0IHtAbGluayBJbnB1dFN0cmVhbX0gdG8gcGFyc2UKLQkgKiBAcmV0dXJuIFRvcCBlbGVtZW50LgotCSAqIEBleGNlcHRpb24gUGFzZXJFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB1bnJlY292ZXJhYmxlIHN5bnRheCBvciB0b2tlbiBlcnJvciBvY2N1cnJlZCwgdGhyb3duCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBOb2RlIHBhcnNlU3dpdGNoRW5jKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUGFyc2VzIGEgSFRNTCBkb2N1bWVudCBhbmQgcmV0dXJuIGl0cyB0b3AgZWxlbWVudC4gVGhpcyBtZXRob2QgaXMgdGhlCi0JICogc2FtZSBhcyB7QGxpbmsgI3BhcnNlKElucHV0U3RyZWFtLFN0cmluZykgcGFyc2UoSW5wdXRTdHJlYW0sU3RyaW5nKX0gSWYKLQkgKiBpdCBtZWV0cyA8Y29kZT4gJmx0O01FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotCSAqIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD14eHgiJmd0OzwvY29kZT4KLQkgKiB0YWcgaW4gYSBkb2N1bWVudCwgaXQgdHJpZXMgdG8gY2hhbmdlIGVuY29kaW5nIHRvIDxjb2RlPnh4eDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGlzCi0JICogICAgICAgICAgICB0YXJnZXQge0BsaW5rIElucHV0U3RyZWFtfSB0byBwYXJzZQotCSAqIEBwYXJhbSBkZWZhdWx0RW5jb2RpbmcKLQkgKiAgICAgICAgICAgIGRlZmF1bHQgZW5jb2RpbmcgYmVmb3JlIHN3aXRjaGluZyBlbmNvZGluZy4KLQkgKiBAcmV0dXJuIFRvcCBlbGVtZW50LgotCSAqIEBleGNlcHRpb24gUGFzZXJFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB1bnJlY292ZXJhYmxlIHN5bnRheCBvciB0b2tlbiBlcnJvciBvY2N1cnJlZCwgdGhyb3duCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBOb2RlIHBhcnNlU3dpdGNoRW5jKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgZGVmYXVsdEVuY29kaW5nKQotCQkJdGhyb3dzIFNBWEV4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ2hhcmFjdGVyIEVuY29kaW5nIHBhcnNlZCBhIGRvY3VtZW50IHdpdGguCi0JICogCi0JICogQHJldHVybiBJZiBudWxsIHBhcnNlZCBhIGRvY3VtZW50IHdpdGggZGVmYXVsdCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9JUGFyc2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvSVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDI5OWQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9JUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbC5FbmRUYWc7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBCYXNlIEludGVyZmFjZSBmb3IgcGFyc2VyIGltcGxlbWVudGF0aW9ucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUGFyc2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQUEVSX0NBU0UgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPV0VSX0NBU0UgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SSUdJTkFMX0NBU0UgPSAyOwotCi0JLyoqCi0JICogQWRkcyBhbiBFcnJvckhhbmRsZXIgaW5zdGFuY2UuIEFuIGVycm9ySGFuZGxlciBhZGRlZCBsYXRlciBpcyBpbnZva2VkCi0JICogZWFybGllciBieSB0aGlzIHBhcnNlciBpbnN0YW5jZSB0aGFuIGVycm9ySGFuZGxlcnMgYWRkZWQgZWFybGllci4gSWYgb25lCi0JICogZXJyb3JIYW5kbGVyIGhhbmRsZXMgZXJyb3IgKGUuZy4gcmV0dXJucyA8Y29kZT4KLQkgKiB0cnVlPC9jb2RlPiksIG5vIG1vcmUKLQkgKiBlcnJvckhhbmRsZXJzIGFyZSBpbnZva2VkLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvckhhbmRsZXIKLQkgKiAgICAgICAgICAgIGVycm9ySGFuZGxlciBpbnN0YW5jZSB0byBiZSBhZGRlZCB0byB0aGlzIHBhcnNlcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVycm9ySGFuZGxlcihJRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcik7Ci0KLQkvKioKLQkgKiBBZGRzIGFuIGVycm9yIGxvZyBsaXN0ZW5lci4gTGlzdGVuZXIgaXMgaW52b2tlZCB3aGVuIGVycm9yIGlzIG9jY3VycmVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGFyZ2V0IGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXJyb3JMb2dMaXN0ZW5lcihJRXJyb3JMb2dMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoaXMgcGFyc2VyCi0JICogb3Igbm90LiBGb3IgZXhhbXBsZSwgPGNvZGU+VEJPRFk8L2NvZGU+IHVuZGVyIDxjb2RlPlRBQkxFPC9jb2RlPiBpcwotCSAqIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGluIGZvbGxvd2luZyBkb2N1bWVudC4KLQkgKiAKLQkgKiA8UFJFPgotCSAqICZsdDtUQUJMRSZndDsgJmx0O1RSJmd0OyZsdDtURCZndDsmbHQ7VEQmZ3Q7ICZsdDsvVEFCTEUmZ3Q7Ci0JICogPC9QUkU+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGVsZW1lbnQgbm9kZSB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiB0cnVlIGlmIHtAbGluayBFbGVtZW50fSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGlzLgotCSAqICAgICAgICAgT3RoZXJ3aXNlIGZhbHNlLgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGF1dG9HZW5lcmF0ZWQoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIENoYW5nZSBhIHNwZWNpZmllZCBzdHJpbmcgdG8gc3BlY2lmaWVkIGNhc2VkLgotCSAqIAotCSAqIEBwYXJhbSB0YWcKLQkgKiAgICAgICAgICAgIHRhcmdldCB0YWcgY2FzZSAoe0B2YWx1ZSBJUGFyc2VyI0xPV0VSX0NBU0V9LAotCSAqICAgICAgICAgICAge0B2YWx1ZSBJUGFyc2VyI09SSUdJTkFMX0NBU0V9IG9yIHtAdmFsdWUgSVBhcnNlciNVUFBFUl9DQVNFfSkKLQkgKiBAc2VlICNzZXREZWZhdWx0VGFnQ2FzZShpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBjaGFuZ2VEZWZhdWx0VGFnQ2FzZShTdHJpbmcgdGFnKTsKLQotCS8qKgotCSAqIERldGVybWluZXMgd2hpY2ggdGhpcyBwYXJzZXIgaW52b2tlcyB7QGxpbmsgCi0JICogb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLAotCSAqIG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3QpfSBhbmQKLQkgKiB7QGxpbmsgb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyI2VuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZyl9Ci0JICogPGNvZGU+bG9naWNhbGx5PC9jb2RlPiBvciA8Y29kZT5waHlzaWNhbGx5PC9jb2RlPi48Y29kZT4KLQkgKiBMb2dpY2FsPC9jb2RlPgotCSAqIG1lYW5zIHRoYXQgaWYgYSBzdGFydCBvciBlbmQgdGFnIG9mIGEgZWxlbWVudCBpcyBvbWl0dGVkLCBhIHBhcnNlcgotCSAqIGludm9rZXMgZWFjaCBtZXRob2QuIDxjb2RlPlBoeXNpY2FsPC9jb2RlPiBtZWFucyB0aGF0IHBhcnNlcnMgaW52b2tlcwotCSAqIGVhY2ggbWV0aG9kIGlmIGFuZCBvbmx5IGlmIHRoZWlyIHRhZyBhcHBhcmVudGx5IGV4aXN0LiBJZgotCSAqIDxjb2RlPnBoeXNpY2FsPC9jb2RlPiwgYSBwYXJzZXIgZG9lcyBub3QgY2FyZSBpZiB0aGUgdGFnIGlzIGlsbGVnYWwgb3IKLQkgKiBub3QuIERlZmF1bHQgaXMgPGNvZGU+cGh5c2ljYWw8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGxvZ2ljYWwKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIGRlYWwgd2l0aCB0YWdzIGFzIGxvZ2ljYWwuIE90aGVyd2lzZSwgYXMgcGh5c2ljYWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbGVtZW50SGFuZGxlKGJvb2xlYW4gbG9naWNhbCk7Ci0KLQkvKioKLQkgKiBSZWNvcmRzIGFuIGVycm9yLiBEb2VzIG5vdGhpbmcgYnkgZGVmYXVsdC4gSWYgaXQgaGFzIEVycm9yTG9nTGlzdGVuZXIKLQkgKiBpbnN0YW5jZXMsIGNhbGxzIHRoZWlyIHtAbGluayBJRXJyb3JMb2dMaXN0ZW5lciNlcnJvckxvZyhpbnQsU3RyaW5nKX0KLQkgKiBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIGNvZGUKLQkgKiAgICAgICAgICAgIGVycm9yIGNvZGUuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgbWVzc2FnZSBvZiB0aGUgZXJyb3IuCi0JICovCi0JcHVibGljIHZvaWQgZXJyb3IoaW50IGNvZGUsIFN0cmluZyBtc2cpOwotCi0JLyoqCi0JICogR2V0cyBhIGN1cnJlbnQgY29udGV4dCBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gY29udGV4dCBlbGVtZW50Ci0JICogQHNlZSAjc2V0Q29udGV4dChvcmcudzNjLmRvbS5FbGVtZW50KQotCSAqLwotCXB1YmxpYyBFbGVtZW50IGdldENvbnRleHQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYXJyYXkgb2YgY29udGV4dCBlbGVtZW50Ci0JICovCi0JcHVibGljIEVsZW1lbnRbXSBnZXRDb250ZXh0RWxlbWVudHMoKTsKLQotCS8qKgotCSAqIEdldHMgYSBkb2N1bWVudCBwYXJzZWQgYnkgdGhpcyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHBhcnNlZCBkb2N1bWVudCBpbnN0YW5jZS4KLQkgKiBAc2VlICNzZXREb2N1bWVudChvcmcudzNjLmRvbS5Eb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIEdldHMgbm9kZS1sZXZlbCBlcnJvciBoYW5kbGVycyBpbmNsdWRlZCBpbiB0aGlzIHBhcnNlcgotCSAqIAotCSAqIEByZXR1cm4gZXJyb3IgaGFuZGxlcnMKLQkgKi8KLQlwdWJsaWMgSUVycm9ySGFuZGxlcltdIGdldEVycm9ySGFuZGxlcnMoKTsKLQotCS8qKgotCSAqIEdldHMgZXh0cmEgZXJyb3IgaW5mb3JtYXRpb24uIEEgcGFyc2VyIHBhc3NlcyB0d28gZXJyb3IgaW5mb3JtYXRpb24gKGUuZy4KLQkgKiBlcnJvciBjb2RlIGFuZCBlcnJvciBub2RlKSB0byBub2RlLWxldmVsIGVycm9yIGhhbmRsZXJzLiBIb3dldmVyLCBpdCBpcwotCSAqIG5vdyBlbm91Z2ggZm9yIHNvbWUga2luZCBvZiBlcnJvciBoYW5kbGVycyB0byByZWNvdmVyIHRoZSBlcnJvci4gSWYKLQkgKiB7QGxpbmsgSVBhcnNlckVycm9yI1NVRERFTl9FTkRUQUd9ZXJyb3Igb2NjdXJzLCBwYXJzZXIgc2V0IG1pc3NlZCBlbmQKLQkgKiB0YWdzIGJldHdlZW4gZXJyb3Igbm9kZSBhbmQgZnV0dXJlIGNvbnRleHQgdG8gZXh0cmEgZXJyb3IgaW5mb3JtYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRFeHRyYUVyckluZm8oKTsKLQotCS8qKgotCSAqIEdldHMgYSBOb2RlIG9yIHtAbGluayBFbmRUYWd9ZnJvbSBhIGN1cnJlbnRseSByZWFkaW5nIHN0cmVhbSBhcyBhIHJlc3VsdAotCSAqIG9mIHRva2VuaXppbmcuCi0JICogCi0JICogQHJldHVybiB7QGxpbmsgb3JnLnczYy5kb20uTm9kZSBOb2RlfSBvciB7QGxpbmsgRW5kVGFnfQotCSAqIEBleGNlcHRpb24gUGFyc2VFeGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogQHNlZSAjcHVzaEJhY2tOb2RlKG9yZy53M2MuZG9tLk5vZGUpCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbjsKLQotCXB1YmxpYyBpbnQgZ2V0UHVzaGJhY2tCdWZmZXJTaXplKCk7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgYSBzcGVjaWZpZWQgZWxlbWVudCBoYXMgaXRzIGVuZCB0YWcgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBlbGVtZW50IHRvIGJlIGNoZWNrZWQuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB7QGxpbmsgRWxlbWVudH0gaGFzIGl0cyBlbmQgdGFnLgotCSAqICAgICAgICAgT3RoZXJ3aXNlLCBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNFbmRUYWcoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIERldGVybWluZXMgdW5rbm93biBlbGVtZW50cyBhcmUga2VwdCBvciBub3QuIFRoZSBkZWZpbml0aW9uIG9mIHRoZQotCSAqIGVsZW1lbnRzIGlzIDxjb2RlPiZsdDshRUxFTUVOVCA8aT5hbm9ueW1vdXM8L2k+IC0gLSBBTlkmZ3Q7PC9jb2RlPiwKLQkgKiB3aGVyZSA8aT5hbm9ueW1vdXMgPC9pPiBpcyBhbiB1bmtub3duIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGtlZXAKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBhcnNlciBrZWVwcy4gT3RoZXJ3aXNlCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBrZWVwVW5rbm93bkVsZW1lbnRzKGJvb2xlYW4ga2VlcCk7Ci0KLQkvKioKLQkgKiBQdXNoZXMgYmFjayBhIG5vZGUgdG8gdGhpcyBwYXJzZXIuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG5vZGUgdG8gYmUgcHVzaGVkIGJhY2suCi0JICogQHNlZSAjZ2V0Tm9kZSgpCi0JICovCi0JcHVibGljIHZvaWQgcHVzaEJhY2tOb2RlKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaQotCSAqICAgICAgICAgICAgZGVwdGgKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW9wZW5Db250ZXh0KGludCBpKSB0aHJvd3MgU0FYRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU3BlY2lmaWVzIGF0dHJpYnV0ZSBuYW1lcycgY2FzZS4gRGVmYXVsdCBiZWhhdmlvciBtYWtlcyB0aGVtIG9yaWdpbmFsCi0JICogY2FzZWQuCi0JICogCi0JICogQHBhcmFtIGF0dHJDYXNlCi0JICogICAgICAgICAgICB0aGlzIG11c3QgYmUge0BsaW5rIElQYXJzZXIjVVBQRVJfQ0FTRX0se0BsaW5rIElQYXJzZXIjTE9XRVJfQ0FTRX1vcgotCSAqICAgICAgICAgICAge0BsaW5rIElQYXJzZXIjT1JJR0lOQUxfQ0FTRX0uIElmIG90aGVyd2lzZSwgaWdub3JlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJOYW1lQ2FzZShpbnQgYXR0ckNhc2UpOwotCi0JLyoqCi0JICogU2V0cyBjdXJyZW50IGNvbnRleHQgZWxlbWVudCBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBuZXcgY29udGV4dC4KLQkgKiBAc2VlICNnZXRDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFNBWEV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldHMgY3VycmVudCBub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG5ldyBjdXJyZW50IG5vZGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudE5vZGUoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIFNwZWNpZmllcyBlbGVtZW50IG5hbWVzJyBjYXNlIHdob3NlIHN0YXJ0IHRhZ3MgYXJlIG9taXR0ZWQuIERlZmF1bHQKLQkgKiBiZWhhdmlvciBtYWtlcyB0aGVtIHVwcGVyLWNhc2VkLgotCSAqIAotCSAqIEBwYXJhbSB0YWdDYXNlCi0JICogICAgICAgICAgICB0aGlzIG11c3QgYmUge0BsaW5rIElQYXJzZXIjVVBQRVJfQ0FTRX1vcgotCSAqICAgICAgICAgICAge0BsaW5rIElQYXJzZXIjTE9XRVJfQ0FTRX0uIElmIG90aGVyd2lzZSwgaWdub3JlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRUYWdDYXNlKGludCB0YWdDYXNlKTsKLQotCS8qKgotCSAqIERldGVybWluZXMgdGhhdCBhIHNwZWNpZmllZCBlbGVtZW50IGhhcyBpdHMgZW5kIHRhZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYXNFbmRUYWcoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIFNwZWNpZmllcyBlbGVtZW50IG5hbWVzJyBjYXNlLiBEZWZhdWx0IGJlaGF2aW9yIG1ha2VzIHRoZW0gb3JpZ2luYWwKLQkgKiBjYXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFnQ2FzZQotCSAqICAgICAgICAgICAgdGhpcyBtdXN0IGJlIHtAbGluayBJUGFyc2VyI1VQUEVSX0NBU0V9LHtAbGluayBJUGFyc2VyI0xPV0VSX0NBU0V9b3IKLQkgKiAgICAgICAgICAgIHtAbGluayBJUGFyc2VyI09SSUdJTkFMX0NBU0V9LiBJZiBvdGhlcndpc2UsIGlnbm9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdDYXNlKGludCB0YWdDYXNlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL0lQYXJzZXJFcnJvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL0lQYXJzZXJFcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTJhOGE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9JUGFyc2VyRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBwYXJzZXIgZXJyb3IgY29uc3RhbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBhcnNlckVycm9yIHsKLQotCS8qKgotCSAqIEVycm9yIGNvZGUgZm9yIG1pc3NpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbi4gVGhpcyBraW5kIG9mIGVycm9yIGlzIG5vdAotCSAqIGRlYWx0IHdpdGggZXJyb3IgaGFuZGxlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET0NUWVBFX01JU1NFRCA9IDE7Ci0JLyoqCi0JICogRXJyb3IgY29kZSBmb3Igc3ludGF4IGVycm9yIG9mIERPQ1RZUEUgZGVjbGFyYXRpb24uIFRoaXMga2luZCBvZiBlcnJvciBpcwotCSAqIG5vdCBkZWFsdCB3aXRoIGVycm9yIGhhbmRsZXJzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUxMRUdBTF9ET0NUWVBFID0gMjsKLQkvKioKLQkgKiBFcnJvciBjb2RlIGZvciBhbiBpbGxlZ2FsIHRvcCBlbGVtZW50LiBGb3IgSFRNTCBleGFtcGxlLCBpZiBhbiBIVE1MCi0JICogZG9jdW1lbnQgc3RhcnRzIHdpdGggJmx0O0xJJmd0OyBhcyBmb2xsb3dzLCB0aGlzIGlzIGFuIGlsbGVnYWwgdG9wCi0JICogZWxlbWVudC4gQmVjYXVzZSBvZiB0aGUgZG9jdHlwZSBkZWNsYXJhdGlvbiB0aGUgZG9jdW1lbnQgbXVzdCBzdGFydCB3aXRoCi0JICogJmx0O0hUTUwmZ3Q7Ci0JICogCi0JICogPHByZT4KLQkgKiAgICZsdDshRE9DVFlQRQotCSAqIDxlbT4KLQkgKiBIVE1MCi0JICogPC9lbT4KLQkgKiAgUFVCTElDICZxdW90Oy0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiZxdW90OyZndDsKLQkgKiA8ZW0+Ci0JICogJmx0O0xJJmd0OwotCSAqIDwvZW0+Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBraW5kIG9mIGVycm9yIGlzIG5vdCBkZWFsdCB3aXRoIGVycm9yIGhhbmRsZXJzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUxMRUdBTF9UT1BfRUxFTUVOVCA9IDM7Ci0JLyoqCi0JICogRXJyb3IgY29kZSBmb3IgYW4gaWxsZWdhbCBhdHRyaWJ1dGUuIElmIGFuIGVsZW1lbnQgaGFzIGFuIHVua25vd24KLQkgKiBhdHRyaWJ1dGUsIHRoYXQgaXMgYW4gaWxsZWdhbCBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUxMRUdBTF9BVFRSSUJVVEUgPSA0OwotCS8qKgotCSAqIEVycm9yIGNvZGUgZm9yIGEgZmxvYXRpbmcgZW5kdGFnLiBFbmR0YWdzIHdob3NlIGNvcnJlc3BvbmRpbmcgc3RhcnQgdGFnCi0JICogaXMgbWlzc2luZyBhcmUgZGVmaW5lZCBhcyA8ZW0+ZmxvYXRpbmc8L2VtPi4gRm9yIEhUTUwgZXhhbXBsZSwKLQkgKiBmb2xsb3dpbmcgJmx0Oy9QJmd0OyBpcyBmbG9hdGluZyBiZWNhdXNlIHRoZSBQIGVsZW1lbnQgaXMgY2xvc2VkIGJlZm9yZQotCSAqIEhSLgotCSAqIAotCSAqIDxwcmU+Ci0JICogICAmbHQ7UCZndDsKLQkgKiAgICAgLi4uCi0JICogICAmbHQ7IS0tIEhlcmUgaXMgYW4gb21pdHRlZCBlbmQgdGFnIG9mIFAgYmVjYXNlIGZvbGxvd2luZyBIUiBpcyBub3cgYWxsb3dlZAotCSAqICAgICAgICAgICBhcyBhIGNoaWxkIG9mIFAgLS0mZ3Q7Ci0JICogICAmbHQ7SFImZ3Q7Ci0JICogICAgIC4uLgotCSAqICAgJmx0Oy9QJmd0OwotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMT0FUSU5HX0VORFRBRyA9IDU7Ci0JLyoqCi0JICogRXJyb3IgY29kZSBmb3Igc3VkZGVuIGVuZHRhZy4gQSBzdHJhbmdlIGVuZHRhZyB0aGF0IGFwcGVhcnMgaW4gc29tZQotCSAqIGNvbnRleHQgaXMgZGVmaW5lZCBhcyA8ZW0+c3VkZGVuPC9lbT4uIEZvciBIVE1MIGV4YW1wbGUsIGZvbGxvd2luZwotCSAqIDxlbT4KLQkgKiAmbHQ7L0kmZ3Q7PC9lbT4gaXMgc3VkZGVuLgotCSAqIAotCSAqIDxwcmU+Ci0JICogICAgJmx0O0kmZ3Q7IC4uLiAmbHQ7QiZndDsgLi4uCi0JICogPGVtPgotCSAqICZsdDsvSSZndDsKLQkgKiA8L2VtPgotCSAqICAuLi4gJmx0Oy9CJmd0OwotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVRERFTl9FTkRUQUcgPSA2OwotCS8qKgotCSAqIEVycm9yIGNvZGUgZm9yIGlsbGVnYWwgY2hpbGQuIEEgbm9kZSB0aGF0IGlzIG5vdCBhbGxvd2VkIGFzIGEgY2hpbGQgb2YKLQkgKiBjb250ZXh0J3MgZWxlbWVudCBpcyBkZWZpbmVkIGFzIGFuIGlsbGVnYWwgY2hpbGQuIEZvciBIVE1MIGV4YW1wbGUsCi0JICogZm9sbG93aW5nIDxlbT5QPC9lbT4gZWxlbWVudCBpcyBhbiBpbGxlZ2FsIGNoaWxkIG9mIEhFQUQKLQkgKiAKLQkgKiA8cHJlPgotCSAqICAmbHQ7SFRNTCZndDsKLQkgKiAgICZsdDtIRUFEJmd0OwotCSAqIDxlbT4KLQkgKiAmbHQ7UCZndDsgSWxsZWdhbCAmbHQ7L1AmZ3Q7Ci0JICogPC9lbT4KLQkgKiAgICAmbHQ7VElUTEUmZ3Q7Ci0JICogIC4uLgotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElMTEVHQUxfQ0hJTEQgPSA3OwotCS8qKgotCSAqIEVycm9yIGNvZGUgZm9yIHVua25vd24gZWxlbWVudHMgKG5vdCBkZWZpbmVkIGluIHByZS1yZWFkIERURCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOX0VMRU1FTlQgPSA4OwotCS8qKgotCSAqIEVycm9yIGNvZGUgZm9yIHN5bnRheCBlcnJvciBvZiBzdGFydCB0YWcgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVFRBR19TWU5UQVhfRVJSID0gOTsKLQkvKioKLQkgKiBFcnJvciBjb2RlIGZvciBtaXNjZWxsZW5pb3VzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlTQ19FUlIgPSAxMDsKLQkvKioKLQkgKiBFcnJvciBjb2RlIGZvciB0b2tlbi1sZXZlbCBlcnJvciBvZiBhdHRyaWJ1dGUgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUl9WQUxVRSA9IDExOwotCS8qKgotCSAqIEVycm9yIGNvZGUgZm9yIHRva2VuLWxldmVsIGVycm9yIGJlZm9yZSBhdHRyaWJ1dGUncyBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFRk9SRV9BVFRSTkFNRSA9IDEyOwotCS8qKgotCSAqIEVycm9yIGNvZGUgZm9yIHRva2VuLWxldmVsIGVycm9yIG9mIHRhZyBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19OQU1FID0gMTM7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9Ob2RlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL05vZGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMmU1OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL05vZGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxDb2xsZWN0aW9uOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gbWFuaXB1bGF0ZSB7QGxpbmsgTm9kZX0KLSAqLwotcHVibGljIGNsYXNzIE5vZGVVdGlsIHsKLQkvKioKLQkgKiBGaW5kIGNvbW1vbiBhbmNlc3RvciB7QGxpbmsgTm9kZX0gb2YgdGFyZ2V0cwotCSAqIAotCSAqIEBwYXJhbSBhbmMxCi0JICogICAgICAgICAgICB0YXJnZXQgTm9kZSAxCi0JICogQHBhcmFtIGFuYzIKLQkgKiAgICAgICAgICAgIHRhcmdldCBOb2RlIDIKLQkgKiBAcmV0dXJuIGNvbW1vbiBhbmNlc3RvciB7QGxpbmsgTm9kZX0gb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlIGNvbW1vbkFuY2VzdG9yKE5vZGUgYW5jMSwgTm9kZSBhbmMyKSB7Ci0JCWZvciAoTm9kZSBwMSA9IGFuYzEuZ2V0UGFyZW50Tm9kZSgpOyBwMSAhPSBudWxsOyBwMSA9IHAxCi0JCQkJLmdldFBhcmVudE5vZGUoKSkgewotCQkJZm9yIChOb2RlIHAyID0gYW5jMi5nZXRQYXJlbnROb2RlKCk7IHAyICE9IG51bGw7IHAyID0gcDIKLQkJCQkJLmdldFBhcmVudE5vZGUoKSkgewotCQkJCWlmIChwMSA9PSBwMikKLQkJCQkJcmV0dXJuIHAxOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIDxjb2RlPm5vZGU8L2NvZGU+IHdpdGggaXRzIGNoaWxkcmVuLiBUaGUgZm9sbG93aW5nIGlzIGFuCi0JICogZXhhbXBsZToKLQkgKiAKLQkgKiA8cHJlPgotCSAqICAgICAgUiAgICAgICAgICBSICAgICAKLQkgKiAgICAvIFwgICAgICAgIC98XCAgICAKLQkgKiAgIEEgICBCICAtJmd0OyAgQSBFIEYgICAKLQkgKiAgICAgIC8gXCAgICAgICAgICAgICAKLQkgKiAgICAgRSAgIEYgICAgICAgICAgICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAKLQkgKiAgICAgIHJlbW92ZSBCICAgICAgICAKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdGFyZ2V0IG5vZGUuCi0JICogQHJldHVybiA8Y29kZT5ub2RlPC9jb2RlPiBpZiBzdWNjZWVkZWQuIE90aGVyd2lzZSwgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlKE5vZGUgbm9kZSkgewotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obm9kZSArICIgZG9lc24ndCBoYXZlIGEgcGFyZW50Iik7Ci0JCX0KLQkJZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gbm9kZQotCQkJCS5nZXRGaXJzdENoaWxkKCkpIHsKLQkJCW5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbm9kZSk7Ci0JCX0KLQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgPGNvZGU+bm9kZTwvY29kZT4gYW5kIG1vdmVzIGNoaWxkcmVuIHNwZWNpZmllZCBieQotCSAqIDxjb2RlPmZyb208L2NvZGU+IGFuZCA8Y29kZT50bzwvY29kZT4gdG8gaXQuIFRoZSBmb2xsb3dpbmcgaXMgYW4KLQkgKiBleGFtcGxlOgotCSAqIAotCSAqIDxwcmU+Ci0JICogICAgICBSICAgICAgICAgUiAgICAgICAKLQkgKiAgICAgL3xcICAgICAgIC8gXCAgICAgIAotCSAqICAgIEEgRSBGICAtJmd0OyBBICAgQiAgICAgCi0JICogICAgICAgICAgICAgICAgIC8gXCAgICAKLQkgKiAgICAgICAgICAgICAgICBFICAgRiAgIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogICAgIGFkZCBCIC4uLiAgICAgICAgICAKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0YXJnZXQgcGFyZW50IG5vZGUKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdGFyZ2V0IG5vZGUKLQkgKiBAcGFyYW0gZnJvbQotCSAqICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBjaGlsZHJlbiBtb3ZlZCB0byA8Y29kZT5ub2RlPC9jb2RlPi4gSWYKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBubyBjaGlsZCB3aWxsIGJlIG1vdmVkLgotCSAqIEBwYXJhbSB0bwotCSAqICAgICAgICAgICAgZW5kIG9mIHRoZSBjaGlsZHJlbiBtb3ZlZCB0byA8Y29kZT5ub2RlPC9jb2RlPgotCSAqIEByZXR1cm4gPGNvZGU+bm9kZTwvY29kZT4gaWYgc3VjY2VlZGVkLiBPdGhlcndpemUsIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZChOb2RlIHBhcmVudCwgTm9kZSBub2RlLCBOb2RlIGZyb20sIE5vZGUgdG8pIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnQ9bnVsbCIpOwotCQl9IGVsc2UgaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obm9kZSArICIgYWxyZWFkeSBoYXMgaXRzIHBhcmVudCIpOwotCQl9IGVsc2UgaWYgKGZyb20gPT0gbnVsbCkgewotCQkJcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBudWxsKTsKLQkJfSBlbHNlIGlmIChmcm9tLmdldFBhcmVudE5vZGUoKSAhPSBwYXJlbnQpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZnJvbSArICIncyBwYXJlbnQgaXNuJ3QgIgotCQkJCQkrIHBhcmVudCk7Ci0JCX0gZWxzZSBpZiAodG8uZ2V0UGFyZW50Tm9kZSgpICE9IHBhcmVudCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0byArICIncyBwYXJlbnQgaXNuJ3QgIiArIHBhcmVudCk7Ci0JCX0gZWxzZSBpZiAoZnJvbSAhPSBudWxsKSB7Ci0JCQlmb3IgKE5vZGUgY2hpbGQgPSBmcm9tOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkCi0JCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJaWYgKGNoaWxkID09IHRvKSB7Ci0JCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgZnJvbSk7Ci0JCQkJCWZvciAoY2hpbGQgPSBmcm9tOyBjaGlsZCAhPSB0bzsgY2hpbGQgPSBub2RlCi0JCQkJCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCQlub2RlLmluc2VydEJlZm9yZShjaGlsZCwgbnVsbCk7Ci0JCQkJCX0KLQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKHRvKTsKLQkJCQkJbm9kZS5pbnNlcnRCZWZvcmUodG8sIG51bGwpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gbGluayBmcm9tICIgKyBmcm9tICsgIiB0byAiCi0JCQkJCSsgdG8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZCBjb21tb24gYW5jZXN0b3Ige0BsaW5rIE5vZGV9IG9mIHRhcmdldHMKLQkgKiAKLQkgKiBAcGFyYW0gYW5jZXN0b3JzCi0JICogICAgICAgICAgICBsaXN0IG9mIHRhcmdldCB7QGxpbmsgTm9kZX1zCi0JICogCi0JICogQHJldHVybiBjb21tb24gYW5jZXN0b3Ige0BsaW5rIE5vZGV9IG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBjb21tb25BbmNlc3RvcihIVE1MQ29sbGVjdGlvbiBhbmNlc3RvcnMpIHsKLQkJc3dpdGNoIChhbmNlc3RvcnMuZ2V0TGVuZ3RoKCkpIHsKLQkJY2FzZSAwOgotCQkJcmV0dXJuIG51bGw7Ci0JCWNhc2UgMToKLQkJCXJldHVybiBhbmNlc3RvcnMuaXRlbSgwKS5nZXRQYXJlbnROb2RlKCk7Ci0JCWRlZmF1bHQ6Ci0JCQlOb2RlIHJldCA9IGNvbW1vbkFuY2VzdG9yKGFuY2VzdG9ycy5pdGVtKDApLCBhbmNlc3RvcnMuaXRlbSgxKSk7Ci0JCQlmb3IgKGludCBpID0gMjsgaSA8IGFuY2VzdG9ycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSB0bXAgPSBjb21tb25BbmNlc3RvcihhbmNlc3RvcnMuaXRlbShpIC0gMSksIGFuY2VzdG9ycwotCQkJCQkJLml0ZW0oaSkpOwotCQkJCWlmIChyZXQgIT0gdG1wKSB7Ci0JCQkJCXJldCA9IGNvbW1vbkFuY2VzdG9yKHJldCwgdG1wKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL1BhcnNlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvUGFyc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhNjQ1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvUGFyc2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbDsKLQotLyoqCi0gKiBXaGVuIGEgcGFyc2VyIG1lZXRzIGFuIHVuZXhwZWN0ZWQgYW5kIHVucmVjb3ZlcmFibGUgZXJyb3IsIFBhcnNlRXhjZXB0aW9uIGlzCi0gKiB0aHJvd24KLSAqLwotcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA5NDA0MTMwNzQwNTk3MjQ2MTdMOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgdGhlIEV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgUGFyc2VFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgdGhlIEV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBFeGNlcHRpb24gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0JCXN1cGVyKG1zZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9IVE1MMzIuZHRkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9IVE1MMzIuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGU2MGQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSFRNTDMyLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDU5NyArMCwwIEBACi08IS0tCi0gICAgICAgIFczQyBEb2N1bWVudCBUeXBlIERlZmluaXRpb24gZm9yIHRoZSBIeXBlclRleHQgTWFya3VwIExhbmd1YWdlCi0gICAgICAgIHZlcnNpb24gMy4yIGFzIHJhdGlmaWVkIGJ5IGEgdm90ZSBvZiBXM0MgbWVtYmVyIGNvbXBhbmllcy4KLSAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVzNDIGxvb2sgYXQgIFVSTCBodHRwOi8vd3d3LnczLm9yZy8KLQotICAgICAgICBEYXRlOiBUdWVzZGF5IEphbnVhcnkgMTR0aCAxOTk3Ci0KLSAgICAgICAgQXV0aG9yOiBEYXZlIFJhZ2dldHQgPGRzckB3My5vcmc+Ci0KLSAgICAgICAgSFRNTCAzLjIgYWltcyB0byBjYXB0dXJlIHJlY29tbWVuZGVkIHByYWN0aWNlIGFzIG9mIGVhcmx5ICc5NgotICAgICAgICBhbmQgYXMgc3VjaCB0byBiZSB1c2VkIGFzIGEgcmVwbGFjZW1lbnQgZm9yIEhUTUwgMi4wIChSRkMgMTg2NikuCi0gICAgICAgIFdpZGVseSBkZXBsb3llZCByZW5kZXJpbmcgYXR0cmlidXRlcyBhcmUgaW5jbHVkZWQgd2hlcmUgdGhleQotICAgICAgICBoYXZlIGJlZW4gc2hvd24gdG8gYmUgaW50ZXJvcGVyYWJsZS4gU0NSSVBUIGFuZCBTVFlMRSBhcmUKLSAgICAgICAgaW5jbHVkZWQgdG8gc21vb3RoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgY2xpZW50LXNpZGUgc2NyaXB0cwotICAgICAgICBhbmQgc3R5bGUgc2hlZXRzLiBCcm93c2VycyBtdXN0IGF2b2lkIHNob3dpbmcgdGhlIGNvbnRlbnRzCi0gICAgICAgIG9mIHRoZXNlIGVsZW1lbnQgT3RoZXJ3aXNlIHN1cHBvcnQgZm9yIHRoZW0gaXMgbm90IHJlcXVpcmVkLgotICAgICAgICBJRCwgQ0xBU1MgYW5kIFNUWUxFIGF0dHJpYnV0ZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGlzIHZlcnNpb24KLSAgICAgICAgb2YgSFRNTC4KLS0tPgotCi08IUVOVElUWSAlIEhUTUwuVmVyc2lvbgotICAgICAgICAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIgotCi0gICAgICAgIC0tIFR5cGljYWwgdXNhZ2U6Ci0KLSAgICAgICAgICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLSAgICAgICAgICAgIDxodG1sPgotICAgICAgICAgICAgLi4uCi0gICAgICAgICAgICA8L2h0bWw+Ci0gICAgICAgIC0tCi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBEZXByZWNhdGVkIEZlYXR1cmVzIFN3aXRjaCA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgSFRNTC5EZXByZWNhdGVkICJJTkNMVURFIj4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBJbXBvcnRlZCBOYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgQ29udGVudC1UeXBlICJDREFUQSIKLSAgICAgICAgLS0gbWVhbmluZyBhIE1JTUUgY29udGVudCB0eXBlLCBhcyBwZXIgUkZDMTUyMQotICAgICAgICAtLT4KLQotPCFFTlRJVFkgJSBIVFRQLU1ldGhvZCAiR0VUIHwgUE9TVCIKLSAgICAgICAgLS0gYXMgcGVyIEhUVFAgc3BlY2lmaWNhdGlvbgotICAgICAgICAtLT4KLQotPCFFTlRJVFkgJSBVUkwgIkNEQVRBIgotICAgICAgICAtLSBUaGUgdGVybSBVUkwgbWVhbnMgYSBDREFUQSBhdHRyaWJ1dGUKLSAgICAgICAgICAgd2hvc2UgdmFsdWUgaXMgYSBVbmlmb3JtIFJlc291cmNlIExvY2F0b3IsCi0gICAgICAgICAgIFNlZSBSRkMxODA4IChKdW5lIDk1KSBhbmQgUkZDMTczOCAoRGVjIDk0KS4KLSAgICAgICAgLS0+Ci0KLTwhLS0gUGFyYW1ldGVyIEVudGl0aWVzIC0tPgotCi08IUVOVElUWSAlIGhlYWQubWlzYyAiU0NSSVBUfFNUWUxFfE1FVEF8TElOSyIgLS0gcmVwZWF0YWJsZSBoZWFkIGVsZW1lbnRzIC0tPgotCi08IUVOVElUWSAlIGhlYWRpbmcgIkgxfEgyfEgzfEg0fEg1fEg2Ij4KLQotPCFFTlRJVFkgJSBsaXN0ICJVTCB8IE9MIHwgIERJUiB8IE1FTlUiPgotCi08IVsgJUhUTUwuRGVwcmVjYXRlZCBbCi0gICAgPCFFTlRJVFkgJSBwcmVmb3JtYXR0ZWQgIlBSRSB8IFhNUCB8IExJU1RJTkciPgotXV0+Ci0KLTwhRU5USVRZICUgcHJlZm9ybWF0dGVkICJQUkUiPgotCi08IS0tPT09PT09PT09PT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBJU09sYXQxIFBVQkxJQwotICAgICAgICJJU08gODg3OS0xOTg2Ly9FTlRJVElFUyBBZGRlZCBMYXRpbiAxLy9FTi8vSFRNTCI+Ci0lSVNPbGF0MTsKLQotPCEtLT09PT09PT09PT09PT09PT0gRW50aXRpZXMgZm9yIHNwZWNpYWwgc3ltYm9scyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tICZ0cmFkZSBhbmQgJmNic3AgYXJlIG5vdCB3aWRlbHkgZGVwbG95ZWQgYW5kIHNvIG5vdCBpbmNsdWRlZCBoZXJlIC0tPgotCi08IUVOVElUWSBhbXAgICAgQ0RBVEEgIiYjMzg7IiAgIC0tIGFtcGVyc2FuZCAgICAgICAgICAtLT4KLTwhRU5USVRZIGd0ICAgICBDREFUQSAiJiM2MjsiICAgLS0gZ3JlYXRlciB0aGFuICAgICAgIC0tPgotPCFFTlRJVFkgbHQgICAgIENEQVRBICImIzYwOyIgICAtLSBsZXNzIHRoYW4gICAgICAgICAgLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgTWFya3VwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGZvbnQgIlRUIHwgSSB8IEIgIHwgVSB8IFNUUklLRSB8IEJJRyB8IFNNQUxMIHwgU1VCIHwgU1VQIj4KLQotPCFFTlRJVFkgJSBwaHJhc2UgIkVNIHwgU1RST05HIHwgREZOIHwgQ09ERSB8IFNBTVAgfCBLQkQgfCBWQVIgfCBDSVRFIj4KLQotPCFFTlRJVFkgJSBzcGVjaWFsICJBIHwgSU1HIHwgQVBQTEVUIHwgRk9OVCB8IEJBU0VGT05UIHwgQlIgfCBTQ1JJUFQgfCBNQVAiPgotCi08IUVOVElUWSAlIGZvcm0gIklOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEiPgotCi08IUVOVElUWSAlIHRleHQgIiNQQ0RBVEEgfCAlZm9udCB8ICVwaHJhc2UgfCAlc3BlY2lhbCB8ICVmb3JtIj4KLQotPCFFTEVNRU5UICglZm9udHwlcGhyYXNlKSAtIC0gKCV0ZXh0KSo+Ci0KLTwhLS0gdGhlcmUgYXJlIGFsc28gMTYgd2lkZWx5IGtub3duIGNvbG9yIG5hbWVzIGFsdGhvdWdoCi0gIHRoZSByZXN1bHRpbmcgY29sb3JzIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQ6Ci0KLSAgIGFxdWEsIGJsYWNrLCBibHVlLCBmdWNoc2lhLCBncmF5LCBncmVlbiwgbGltZSwgbWFyb29uLAotICAgbmF2eSwgb2xpdmUsIHB1cnBsZSwgcmVkLCBzaWx2ZXIsIHRlYWwsIHdoaXRlLCBhbmQgeWVsbG93Ci0KLSBUaGVzZSBjb2xvcnMgd2VyZSBvcmlnaW5hbGx5IHBpY2tlZCBhcyBiZWluZyB0aGUgc3RhbmRhcmQKLSAxNiBjb2xvcnMgc3VwcG9ydGVkIHdpdGggdGhlIFdpbmRvd3MgVkdBIHBhbGV0dGUuCi0gLS0+Ci0KLTwhRUxFTUVOVCBGT05UIC0gLSAoJXRleHQpKiAgICAgLS0gbG9jYWwgY2hhbmdlIHRvIGZvbnQgLS0+Ci08IUFUVExJU1QgRk9OVAotICAgIHNpemUgICAgQ0RBVEEgICAjSU1QTElFRCAgICAtLSBbK11ubiBlLmcuIHNpemU9IisxIiwgc2l6ZT00IC0tCi0gICAgY29sb3IgICBDREFUQSAgICNJTVBMSUVEICAgIC0tICNSUkdHQkIgaW4gaGV4LCBlLmcuIHJlZDogY29sb3I9IiNGRjAwMDAiIC0tCi0gICAgPgotCi08IUVMRU1FTlQgQkFTRUZPTlQgLSBPIEVNUFRZICAgIC0tIGJhc2UgZm9udCBzaXplICgxIHRvIDcpLS0+Ci08IUFUVExJU1QgQkFTRUZPTlQKLSAgICBzaXplICAgIENEQVRBICAgI0lNUExJRUQgICAgLS0gZS5nLiBzaXplPTMgLS0KLSAgICA+Ci0KLTwhRUxFTUVOVCBCUiAgICAtIE8gRU1QVFkgICAgLS0gZm9yY2VkIGxpbmUgYnJlYWsgLS0+Ci08IUFUVExJU1QgQlIKLSAgICAgICAgY2xlYXIgKGxlZnR8YWxsfHJpZ2h0fG5vbmUpIG5vbmUgLS0gY29udHJvbCBvZiB0ZXh0IGZsb3cgLS0KLSAgICAgICAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEhUTUwgY29udGVudCBtb2RlbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0KLSAgICBIVE1MIGhhcyB0aHJlZSBiYXNpYyBjb250ZW50IG1vZGVsczoKLQotICAgICAgICAldGV4dCAgICAgICBjaGFyYWN0ZXIgbGV2ZWwgZWxlbWVudHMgYW5kIHRleHQgc3RyaW5ncwotICAgICAgICAlZmxvdyAgICAgICBibG9jay1saWtlIGVsZW1lbnRzIGUuZy4gcGFyYWdyYXBocyBhbmQgbGlzdHMKLSAgICAgICAgJWJvZHl0ZXh0ICAgYXMgJWZsb3cgcGx1cyBoZWFkZXJzIEgxLUg2IGFuZCBBRERSRVNTCi0tLT4KLQotPCFFTlRJVFkgJSBibG9jawotICAgICAiUCB8ICVsaXN0IHwgJXByZWZvcm1hdHRlZCB8IERMIHwgRElWIHwgQ0VOVEVSIHwKLSAgICAgIEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwgVEFCTEUiPgotCi08IS0tICVmbG93IGlzIHVzZWQgZm9yIEREIGFuZCBMSSAtLT4KLQotPCFFTlRJVFkgJSBmbG93ICIoJXRleHQgfCAlYmxvY2spKiI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IERvY3VtZW50IEJvZHkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGJvZHkuY29udGVudCAiKCVoZWFkaW5nIHwgJXRleHQgfCAlYmxvY2sgfCBBRERSRVNTKSoiPgotCi08IUVOVElUWSAlIGNvbG9yICJDREFUQSIgLS0gYSBjb2xvciBzcGVjaWZpY2F0aW9uOiAjSEhISEhIIEBAIGRldGFpbHM/IC0tPgotCi08IUVOVElUWSAlIGJvZHktY29sb3ItYXR0cnMgIgotICAgICAgICBiZ2NvbG9yICVjb2xvciAjSU1QTElFRAotICAgICAgICB0ZXh0ICVjb2xvciAjSU1QTElFRAotICAgICAgICBsaW5rICVjb2xvciAjSU1QTElFRAotICAgICAgICB2bGluayAlY29sb3IgI0lNUExJRUQKLSAgICAgICAgYWxpbmsgJWNvbG9yICNJTVBMSUVECi0gICAgICAgICI+Ci0KLTwhRUxFTUVOVCBCT0RZIE8gTyAgJWJvZHkuY29udGVudD4KLTwhQVRUTElTVCBCT0RZCi0gICAgICAgIGJhY2tncm91bmQgJVVSTCAjSU1QTElFRCAgLS0gdGV4dHVyZSB0aWxlIGZvciBkb2N1bWVudCBiYWNrZ3JvdW5kIC0tCi0gICAgICAgICVib2R5LWNvbG9yLWF0dHJzOyAgLS0gYmdjb2xvciwgdGV4dCwgbGluaywgdmxpbmssIGFsaW5rIC0tCi0gICAgICAgID4KLQotPCFFTlRJVFkgJSBhZGRyZXNzLmNvbnRlbnQgIigoJXRleHQ7KSB8IFApKiI+Ci0KLTwhRUxFTUVOVCBBRERSRVNTIC0gLSAlYWRkcmVzcy5jb250ZW50PgotCi08IUVMRU1FTlQgRElWIC0gLSAlYm9keS5jb250ZW50PgotPCFBVFRMSVNUIERJVgotICAgICAgICBhbGlnbiAgIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQgLS0gYWxpZ25tZW50IG9mIGZvbGxvd2luZyB0ZXh0IC0tCi0gICAgICAgID4KLQotPCEtLSBDRU5URVIgaXMgYSBzaG9ydGhhbmQgZm9yIERJViB3aXRoIEFMSUdOPUNFTlRFUiAtLT4KLTwhRUxFTUVOVCBjZW50ZXIgLSAtICVib2R5LmNvbnRlbnQ+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQSAtIC0gKCV0ZXh0KSogLShBKT4KLTwhQVRUTElTVCBBCi0gICAgICAgIG5hbWUgICAgQ0RBVEEgICAjSU1QTElFRCAgICAtLSBuYW1lZCBsaW5rIGVuZCAtLQotICAgICAgICBocmVmICAgICVVUkwgICAgI0lNUExJRUQgICAgLS0gVVJMIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgICAgICAgcmVsICAgICBDREFUQSAgICNJTVBMSUVEICAgIC0tIGZvcndhcmQgbGluayB0eXBlcyAtLQotICAgICAgICByZXYgICAgIENEQVRBICAgI0lNUExJRUQgICAgLS0gcmV2ZXJzZSBsaW5rIHR5cGVzIC0tCi0gICAgICAgIHRpdGxlICAgQ0RBVEEgICAjSU1QTElFRCAgICAtLSBhZHZpc29yeSB0aXRsZSBzdHJpbmcgLS0KLSAgICAgICAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENsaWVudC1zaWRlIGltYWdlIG1hcHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFRoZXNlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgb3IgZ3JvdXBlZCBpbiBhCi0gICAgIHNlcGFyYXRlIGRvY3VtZW50IGFsdGhvdWdoIHRoaXMgaXNuJ3QgeWV0IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhRU5USVRZICUgU0hBUEUgIihyZWN0fGNpcmNsZXxwb2x5KSI+Ci08IUVOVElUWSAlIENPT1JEUyAiQ0RBVEEiIC0tIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG51bWJlcnMgLS0+Ci0KLTwhRUxFTUVOVCBNQVAgLSAtIChBUkVBKSo+Ci08IUFUVExJU1QgTUFQCi0gICAgbmFtZSAgICBDREFUQSAgICNJTVBMSUVECi0gICAgPgotCi08IUVMRU1FTlQgQVJFQSAtIE8gRU1QVFk+Ci08IUFUVExJU1QgQVJFQQotICAgIHNoYXBlICAgJVNIQVBFICByZWN0Ci0gICAgY29vcmRzICAlQ09PUkRTICNJTVBMSUVEICAtLSBkZWZpbmVzIGNvb3JkaW5hdGVzIGZvciBzaGFwZSAtLQotICAgIGhyZWYgICAgJVVSTCAgICAjSU1QTElFRCAgLS0gdGhpcyByZWdpb24gYWN0cyBhcyBoeXBlcnRleHQgbGluayAtLQotICAgIG5vaHJlZiAobm9ocmVmKSAjSU1QTElFRCAgLS0gdGhpcyByZWdpb24gaGFzIG5vIGFjdGlvbiAtLQotICAgIGFsdCAgICAgQ0RBVEEgICAjUkVRVUlSRUQgLS0gbmVlZGVkIGZvciBub24tZ3JhcGhpY2FsIHVzZXIgYWdlbnRzIC0tCi0gICAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBMSU5LIEVsZW1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIFR5cGVzICJDREFUQSIKLSAgICAgICAgLS0gU2VlIEludGVybmV0IERyYWZ0OiBkcmFmdC1pZXRmLWh0bWwtcmVscmV2LTAwLnR4dAotICAgICAgICAgICBMSU5LIGhhcyBiZWVuIHBhcnQgb2YgSFRNTCBzaW5jZSB0aGUgZWFybHkgZGF5cwotICAgICAgICAgICBhbHRob3VnaCBmZXcgYnJvd3NlcnMgYXMgeWV0IHRha2UgYWR2YW50YWdlIG9mIGl0LgotCi0gICAgICAgICAgIFJlbGF0aW9uc2hpcCB2YWx1ZXMgY2FuIGJlIHVzZWQgaW4gcHJpbmNpcGxlOgotCi0gICAgICAgICAgICAgICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzIHdoZW4gdXNlZAotICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIExJTksgZWxlbWVudCBpbiB0aGUgZG9jdW1lbnQgaGVhZDoKLSAgICAgICAgICAgICAgICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQKLSAgICAgICAgICAgICAgICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdAotICAgICAgICAgICAgICAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mCi0gICAgICAgICAgICAgICAgICAgaHRtbCBub2RlcyBhcmUgcmVuZGVyZWQgaW50byBwcmludGVkIGRvY3VtZW50cwotICAgICAgICAgICAgICAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgICAgICAgICAgICAgIGUuZy4gYSBwb3N0c2NyaXB0IG9yIHBkZiB2ZXJzaW9uCi0tLT4KLQotPCFFTEVNRU5UIExJTksgLSBPIEVNUFRZPgotPCFBVFRMSVNUIExJTksKLSAgICAgICAgaHJlZiAgICAlVVJMICAgICNJTVBMSUVEICAgIC0tIFVSTCBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gICAgICAgIHJlbCAgICAgJVR5cGVzICAjSU1QTElFRCAgICAtLSBmb3J3YXJkIGxpbmsgdHlwZXMgLS0KLSAgICAgICAgcmV2ICAgICAlVHlwZXMgICNJTVBMSUVEICAgIC0tIHJldmVyc2UgbGluayB0eXBlcyAtLQotICAgICAgICB0aXRsZSAgIENEQVRBICAgI0lNUExJRUQgICAgLS0gYWR2aXNvcnkgdGl0bGUgc3RyaW5nIC0tCi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW1hZ2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgTGVuZ3RoICJDREFUQSIgICAtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIFBpeGVscyAiTlVNQkVSIiAgLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLQotPCEtLSBTdWdnZXN0ZWQgd2lkdGhzIGFyZSB1c2VkIGZvciBuZWdvdGlhdGluZyBpbWFnZSBzaXplCi0gICAgIHdpdGggdGhlIG1vZHVsZSByZXNwb25zaWJsZSBmb3IgcGFpbnRpbmcgdGhlIGltYWdlLgotICAgICBhbGlnbj1sZWZ0IG9yIHJpZ2h0IGNhdXNlIGltYWdlIHRvIGZsb2F0IHRvIG1hcmdpbgotICAgICBhbmQgZm9yIHN1YnNlcXVlbnQgdGV4dCB0byB3cmFwIGFyb3VuZCBpbWFnZSAtLT4KLQotPCFFTlRJVFkgJSBJQWxpZ24gIih0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhRUxFTUVOVCBJTUcgICAgLSBPIEVNUFRZIC0tICBFbWJlZGRlZCBpbWFnZSAtLT4KLTwhQVRUTElTVCBJTUcKLSAgICAgICAgc3JjICAgICAlVVJMICAgICAjUkVRVUlSRUQgIC0tIFVSTCBvZiBpbWFnZSB0byBlbWJlZCAtLQotICAgICAgICBhbHQgICAgIENEQVRBICAgICNJTVBMSUVEICAgLS0gZm9yIGRpc3BsYXkgaW4gcGxhY2Ugb2YgaW1hZ2UgLS0KLSAgICAgICAgYWxpZ24gICAlSUFsaWduICAjSU1QTElFRCAgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gICAgICAgIGhlaWdodCAgJVBpeGVscyAgI0lNUExJRUQgICAtLSBzdWdnZXN0ZWQgaGVpZ2h0IGluIHBpeGVscyAtLQotICAgICAgICB3aWR0aCAgICVQaXhlbHMgICNJTVBMSUVEICAgLS0gc3VnZ2VzdGVkIHdpZHRoIGluIHBpeGVscyAtLQotICAgICAgICBib3JkZXIgICVQaXhlbHMgICNJTVBMSUVEICAgLS0gc3VnZ2VzdGVkIGxpbmsgYm9yZGVyIHdpZHRoIC0tCi0gICAgICAgIGhzcGFjZSAgJVBpeGVscyAgI0lNUExJRUQgICAtLSBzdWdnZXN0ZWQgaG9yaXpvbnRhbCBndXR0ZXIgLS0KLSAgICAgICAgdnNwYWNlICAlUGl4ZWxzICAjSU1QTElFRCAgIC0tIHN1Z2dlc3RlZCB2ZXJ0aWNhbCBndXR0ZXIgLS0KLSAgICAgICAgdXNlbWFwICAlVVJMICAgICAjSU1QTElFRCAgIC0tIHVzZSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0KLSAgICAgICAgaXNtYXAgICAoaXNtYXApICAjSU1QTElFRCAgIC0tIHVzZSBzZXJ2ZXIgaW1hZ2UgbWFwIC0tCi0gICAgICAgID4KLQotPCEtLSBVU0VNQVAgcG9pbnRzIHRvIGEgTUFQIGVsZW1lbnQgd2hpY2ggbWF5IGJlIGluIHRoaXMgZG9jdW1lbnQKLSAgb3IgYW4gZXh0ZXJuYWwgZG9jdW1lbnQsIGFsdGhvdWdoIHRoZSBsYXR0ZXIgaXMgbm90IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEphdmEgQVBQTEVUIHRhZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBUaGlzIHRhZyBpcyBzdXBwb3J0ZWQgYnkgYWxsIEphdmEgZW5hYmxlZCBicm93c2Vycy4gQXBwbGV0IHJlc291cmNlcwotICAoaW5jbHVkaW5nIHRoZWlyIGNsYXNzZXMpIGFyZSBub3JtYWxseSBsb2FkZWQgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50Ci0gIFVSTCAob3IgPEJBU0U+IGVsZW1lbnQgaWYgaXQgaXMgZGVmaW5lZCkuIFRoZSBDT0RFQkFTRSBhdHRyaWJ1dGUgaXMgdXNlZAotICB0byBjaGFuZ2UgdGhpcyBkZWZhdWx0IGJlaGF2aW9yLiBJZiB0aGUgQ09ERUJBU0UgYXR0cmlidXRlIGlzIGRlZmluZWQgdGhlbgotICBpdCBzcGVjaWZpZXMgYSBkaWZmZXJlbnQgbG9jYXRpb24gdG8gZmluZCBhcHBsZXQgcmVzb3VyY2VzLiBUaGUgdmFsdWUKLSAgY2FuIGJlIGFuIGFic29sdXRlIFVSTCBvciBhIHJlbGF0aXZlIFVSTC4gVGhlIGFic29sdXRlIFVSTCBpcyB1c2VkIGFzIGlzCi0gIHdpdGhvdXQgbW9kaWZpY2F0aW9uIGFuZCBpcyBub3QgZWZmZWN0ZWQgYnkgdGhlIGRvY3VtZW50cyA8QkFTRT4gZWxlbWVudC4KLSAgV2hlbiB0aGUgY29kZWJhc2UgYXR0cmlidXRlIGlzIHJlbGF0aXZlLCB0aGVuIGl0IGlzIHJlbGF0aXZlIHRvIHRoZQotICBkb2N1bWVudCBVUkwgKG9yIDxCQVNFPiB0YWcgaWYgZGVmaW5lZCkuCi0tLT4KLTwhRUxFTUVOVCBBUFBMRVQgLSAtIChQQVJBTSB8ICV0ZXh0KSo+Ci08IUFUVExJU1QgQVBQTEVUCi0gICAgICAgIGNvZGViYXNlICVVUkwgICAgICNJTVBMSUVEICAgLS0gY29kZSBiYXNlIC0tCi0gICAgICAgIGNvZGUgICAgIENEQVRBICAgICNSRVFVSVJFRCAgLS0gY2xhc3MgZmlsZSAtLQotICAgICAgICBhbHQgICAgICBDREFUQSAgICAjSU1QTElFRCAgIC0tIGZvciBkaXNwbGF5IGluIHBsYWNlIG9mIGFwcGxldCAtLQotICAgICAgICBuYW1lICAgICBDREFUQSAgICAjSU1QTElFRCAgIC0tIGFwcGxldCBuYW1lIC0tCi0gICAgICAgIHdpZHRoICAgICVQaXhlbHMgICNSRVFVSVJFRCAgLS0gc3VnZ2VzdGVkIHdpZHRoIGluIHBpeGVscyAtLQotICAgICAgICBoZWlnaHQgICAlUGl4ZWxzICAjUkVRVUlSRUQgIC0tIHN1Z2dlc3RlZCBoZWlnaHQgaW4gcGl4ZWxzIC0tCi0gICAgICAgIGFsaWduICAgICVJQWxpZ24gICNJTVBMSUVEICAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgICAgICAgaHNwYWNlICAgJVBpeGVscyAgI0lNUExJRUQgICAtLSBzdWdnZXN0ZWQgaG9yaXpvbnRhbCBndXR0ZXIgLS0KLSAgICAgICAgdnNwYWNlICAgJVBpeGVscyAgI0lNUExJRUQgICAtLSBzdWdnZXN0ZWQgdmVydGljYWwgZ3V0dGVyIC0tCi0gICAgICAgID4KLQotPCFFTEVNRU5UIFBBUkFNIC0gTyBFTVBUWT4KLTwhQVRUTElTVCBQQVJBTQotICAgICAgICBuYW1lICAgIE5NVE9LRU4gICAjUkVRVUlSRUQgIC0tIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgLS0KLSAgICAgICAgdmFsdWUgICBDREFUQSAgICAgI0lNUExJRUQgICAtLSBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciAtLQotICAgICAgICA+Ci0KLTwhLS0KLUhlcmUgaXMgYW4gZXhhbXBsZToKLQotICAgIDxhcHBsZXQgY29kZWJhc2U9ImFwcGxldHMvTmVydm91c1RleHQiCi0gICAgICAgIGNvZGU9TmVydm91c1RleHQuY2xhc3MKLSAgICAgICAgd2lkdGg9MzAwCi0gICAgICAgIGhlaWdodD01MD4KLSAgICA8cGFyYW0gbmFtZT10ZXh0IHZhbHVlPSJKYXZhIGlzIENvb2whIj4KLSAgICA8aW1nIHNyYz1zb3JyeS5naWYgYWx0PSJUaGlzIGxvb2tzIGJldHRlciB3aXRoIEphdmEgc3VwcG9ydCI+Ci0gICAgPC9hcHBsZXQ+Ci0tLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBIUiAgICAtIE8gRU1QVFk+Ci08IUFUVExJU1QgSFIKLSAgICAgICAgYWxpZ24gKGxlZnR8cmlnaHR8Y2VudGVyKSAjSU1QTElFRAotICAgICAgICBub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRAotICAgICAgICBzaXplICAlUGl4ZWxzICNJTVBMSUVECi0gICAgICAgIHdpZHRoICVMZW5ndGggI0lNUExJRUQKLSAgICAgICAgPgotPCEtLT09PT09PT09PT09PT09PT09PT0gUGFyYWdyYXBocz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBQICAgICAtIE8gKCV0ZXh0KSo+Ci08IUFUVExJU1QgUAotICAgICAgICBhbGlnbiAgKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRAotICAgICAgICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhlYWRpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZXJlIGFyZSBzaXggbGV2ZWxzIG9mIGhlYWRlcnMgZnJvbSBIMSAodGhlIG1vc3QgaW1wb3J0YW50KQotICB0byBINiAodGhlIGxlYXN0IGltcG9ydGFudCkuCi0tLT4KLQotPCFFTEVNRU5UICggJWhlYWRpbmcgKSAgLSAtICAoJXRleHQ7KSo+Ci08IUFUVExJU1QgKCAlaGVhZGluZyApCi0gICAgICAgIGFsaWduICAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVECi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUHJlZm9ybWF0dGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZXhjbHVkZXMgaW1hZ2VzIGFuZCBjaGFuZ2VzIGluIGZvbnQgc2l6ZSAtLT4KLQotPCFFTlRJVFkgJSBwcmUuZXhjbHVzaW9uICJJTUd8QklHfFNNQUxMfFNVQnxTVVB8Rk9OVCI+Ci0KLTwhRUxFTUVOVCBQUkUgLSAtICgldGV4dCkqIC0oJXByZS5leGNsdXNpb24pPgotPCFBVFRMSVNUIFBSRQotICAgICAgICB3aWR0aCBOVU1CRVIgI2ltcGxpZWQgLS0gaXMgdGhpcyB3aWRlbHkgc3VwcG9ydGVkPyAtLQotICAgICAgICA+Ci0KLTwhWyAlSFRNTC5EZXByZWNhdGVkIFsKLQotPCFFTlRJVFkgJSBsaXRlcmFsICJDREFUQSIKLSAgICAgICAgLS0gaGlzdG9yaWNhbCwgbm9uLWNvbmZvcm1pbmcgcGFyc2luZyBtb2RlIHdoZXJlCi0gICAgICAgICAgIHRoZSBvbmx5IG1hcmt1cCBzaWduYWwgaXMgdGhlIGVuZCB0YWcKLSAgICAgICAgICAgaW4gZnVsbAotICAgICAgICAtLT4KLQotPCFFTEVNRU5UIChYTVB8TElTVElORykgLSAtICAlbGl0ZXJhbD4KLTwhRUxFTUVOVCBQTEFJTlRFWFQgLSBPICVsaXRlcmFsPgotCi1dXT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gQmxvY2stbGlrZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBCTE9DS1FVT1RFIC0gLSAlYm9keS5jb250ZW50PgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICAgIEhUTUwgMy4yIGFsbG93cyB5b3UgdG8gY29udHJvbCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvciBvcmRlcmVkIGxpc3RzLgotICAgIFlvdSBjYW4gc2V0IHRoZSBzZXF1ZW5jZSBudW1iZXIgd2l0aCB0aGUgU1RBUlQgYW5kIFZBTFVFIGF0dHJpYnV0ZXMuCi0gICAgVGhlIFRZUEUgYXR0cmlidXRlIG1heSBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlbmRlcmluZyBvZiBvcmRlcmVkCi0gICAgYW5kIHVub3JkZXJlZCBsaXN0cy4KLS0tPgotCi08IS0tIGRlZmluaXRpb24gbGlzdHMgLSBEVCBmb3IgdGVybSwgREQgZm9yIGl0cyBkZWZpbml0aW9uIC0tPgotCi08IUVMRU1FTlQgREwgICAgLSAtICAoRFR8REQpKz4KLTwhQVRUTElTVCBETAotICAgICAgICBjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCAtLSBtb3JlIGNvbXBhY3Qgc3R5bGUgLS0KLSAgICAgICAgPgotCi08IUVMRU1FTlQgRFQgLSBPICAoJXRleHQpKj4KLTwhRUxFTUVOVCBERCAtIE8gICVmbG93Oz4KLQotPCEtLSBPcmRlcmVkIGxpc3RzIE9MLCBhbmQgdW5vcmRlcmVkIGxpc3RzIFVMIC0tPgotPCFFTEVNRU5UIChPTHxVTCkgLSAtICAoTEkpKz4KLQotPCEtLQotICAgICAgIE51bWJlcmluZyBzdHlsZQotICAgIDEgICBhcmFibGljIG51bWJlcnMgICAgIDEsIDIsIDMsIC4uLgotICAgIGEgICBsb3dlciBhbHBoYSAgICAgICAgIGEsIGIsIGMsIC4uLgotICAgIEEgICB1cHBlciBhbHBoYSAgICAgICAgIEEsIEIsIEMsIC4uLgotICAgIGkgICBsb3dlciByb21hbiAgICAgICAgIGksIGlpLCBpaWksIC4uLgotICAgIEkgICB1cHBlciByb21hbiAgICAgICAgIEksIElJLCBJSUksIC4uLgotCi0gICAgVGhlIHN0eWxlIGlzIGFwcGxpZWQgdG8gdGhlIHNlcXVlbmNlIG51bWJlciB3aGljaCBieSBkZWZhdWx0Ci0gICAgaXMgcmVzZXQgdG8gMSBmb3IgdGhlIGZpcnN0IGxpc3QgaXRlbSBpbiBhbiBvcmRlcmVkIGxpc3QuCi0KLSAgICBUaGlzIGNhbid0IGJlIGV4cHJlc3NlZCBkaXJlY3RseSBpbiBTR01MIGR1ZSB0byBjYXNlIGZvbGRpbmcuCi0tLT4KLQotPCFFTlRJVFkgJSBPTFN0eWxlICJDREFUQSIgLS0gY29uc3RyYWluZWQgdG86IFsxfGF8QXxpfEldIC0tPgotCi08IUFUVExJU1QgT0wgLS0gb3JkZXJlZCBsaXN0cyAtLQotICAgICAgICB0eXBlICAgICAgJU9MU3R5bGUgICAjSU1QTElFRCAgIC0tIG51bWJlcmluZyBzdHlsZSAtLQotICAgICAgICBzdGFydCAgICAgTlVNQkVSICAgICAjSU1QTElFRCAgIC0tIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciAtLQotICAgICAgICBjb21wYWN0ICAoY29tcGFjdCkgICAjSU1QTElFRCAgIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgICAgICAgPgotCi08IS0tIGJ1bGxldCBzdHlsZXMgLS0+Ci0KLTwhRU5USVRZICUgVUxTdHlsZSAiZGlzY3xzcXVhcmV8Y2lyY2xlIj4KLQotPCFBVFRMSVNUIFVMIC0tIHVub3JkZXJlZCBsaXN0cyAtLQotICAgICAgICB0eXBlICAgICglVUxTdHlsZSkgICAjSU1QTElFRCAgIC0tIGJ1bGxldCBzdHlsZSAtLQotICAgICAgICBjb21wYWN0IChjb21wYWN0KSAgICAjSU1QTElFRCAgIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgICAgICAgPgotCi08IUVMRU1FTlQgKERJUnxNRU5VKSAtIC0gIChMSSkrIC0oJWJsb2NrKT4KLTwhQVRUTElTVCBESVIKLSAgICAgICAgY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQKLSAgICAgICAgPgotPCFBVFRMSVNUIE1FTlUKLSAgICAgICAgY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQKLSAgICAgICAgPgotCi08IS0tIDxESVI+ICAgICAgICAgICAgICBEaXJlY3RvcnkgbGlzdCAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA8RElSIENPTVBBQ1Q+ICAgICAgQ29tcGFjdCBsaXN0IHN0eWxlICAgICAgICAgICAgICAtLT4KLTwhLS0gPE1FTlU+ICAgICAgICAgICAgIE1lbnUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIDxNRU5VIENPTVBBQ1Q+ICAgICBDb21wYWN0IGxpc3Qgc3R5bGUgICAgICAgICAgICAgIC0tPgotCi08IS0tIFRoZSB0eXBlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIGJ1bGxldCBzdHlsZQotICAgICBpbiB1bm9yZGVyZWQgbGlzdHMgYW5kIHRoZSBudW1iZXJpbmcgc3R5bGUgaW4gb3JkZXJlZCBsaXN0cyAtLT4KLQotPCFFTlRJVFkgJSBMSVN0eWxlICJDREFUQSIgLS0gY29uc3RyYWluZWQgdG86ICIoJVVMU3R5bGV8JU9MU3R5bGUpIiAtLT4KLQotPCFFTEVNRU5UIExJIC0gTyAlZmxvdyAtLSBsaXN0IGl0ZW0gLS0+Ci08IUFUVExJU1QgTEkKLSAgICAgICAgdHlwZSAgICAlTElTdHlsZSAgICAgI0lNUExJRUQgICAtLSBsaXN0IGl0ZW0gc3R5bGUgLS0KLSAgICAgICAgdmFsdWUgICAgTlVNQkVSICAgICAgI0lNUExJRUQgICAtLSByZXNldCBzZXF1ZW5jZSBudW1iZXIgLS0KLSAgICAgICAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBGb3JtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgRk9STSAtIC0gJWJvZHkuY29udGVudCAtKEZPUk0pPgotPCFBVFRMSVNUIEZPUk0KLSAgICAgICAgYWN0aW9uICVVUkwgI0lNUExJRUQgIC0tIHNlcnZlci1zaWRlIGZvcm0gaGFuZGxlciAtLQotICAgICAgICBtZXRob2QgKCVIVFRQLU1ldGhvZCkgR0VUIC0tIHNlZSBIVFRQIHNwZWNpZmljYXRpb24gLS0KLSAgICAgICAgZW5jdHlwZSAlQ29udGVudC1UeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICAgICAgICA+Ci0KLTwhRU5USVRZICUgSW5wdXRUeXBlCi0gICAgICAgICIoVEVYVCB8IFBBU1NXT1JEIHwgQ0hFQ0tCT1ggfCBSQURJTyB8IFNVQk1JVAotICAgICAgICAgICAgfCBSRVNFVCB8IEZJTEUgfCBISURERU4gfCBJTUFHRSkiPgotCi08IUVMRU1FTlQgSU5QVVQgLSBPIEVNUFRZPgotPCFBVFRMSVNUIElOUFVUCi0gICAgICAgIHR5cGUgJUlucHV0VHlwZSBURVhUICAgICAtLSB3aGF0IGtpbmQgb2Ygd2lkZ2V0IGlzIG5lZWRlZCAtLQotICAgICAgICBuYW1lICBDREFUQSAgICNJTVBMSUVEICAgLS0gcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0IGFuZCByZXNldCAtLQotICAgICAgICB2YWx1ZSBDREFUQSAgICNJTVBMSUVEICAgLS0gcmVxdWlyZWQgZm9yIHJhZGlvIGFuZCBjaGVja2JveGVzIC0tCi0gICAgICAgIGNoZWNrZWQgKGNoZWNrZWQpICNJTVBMSUVEIC0tIGZvciByYWRpbyBidXR0b25zIGFuZCBjaGVjayBib3hlcyAtLQotICAgICAgICBzaXplIENEQVRBICAgICNJTVBMSUVEICAgLS0gc3BlY2lmaWMgdG8gZWFjaCB0eXBlIG9mIGZpZWxkIC0tCi0gICAgICAgIG1heGxlbmd0aCBOVU1CRVIgI0lNUExJRUQgLS0gbWF4IGNoYXJzIGFsbG93ZWQgaW4gdGV4dCBmaWVsZHMgLS0KLSAgICAgICAgc3JjICAgJVVSTCAgICAjSU1QTElFRCAgIC0tIGZvciBmaWVsZHMgd2l0aCBiYWNrZ3JvdW5kIGltYWdlcyAtLQotICAgICAgICBhbGlnbiAlSUFsaWduICNJTVBMSUVEICAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgICAgICAgPgotCi08IUVMRU1FTlQgU0VMRUNUIC0gLSAoT1BUSU9OKyk+Ci08IUFUVExJU1QgU0VMRUNUCi0gICAgICAgIG5hbWUgQ0RBVEEgI1JFUVVJUkVECi0gICAgICAgIHNpemUgTlVNQkVSICNJTVBMSUVECi0gICAgICAgIG11bHRpcGxlIChtdWx0aXBsZSkgI0lNUExJRUQKLSAgICAgICAgPgotCi08IUVMRU1FTlQgT1BUSU9OIC0gTyAoI1BDREFUQSkqPgotPCFBVFRMSVNUIE9QVElPTgotICAgICAgICBzZWxlY3RlZCAoc2VsZWN0ZWQpICNJTVBMSUVECi0gICAgICAgIHZhbHVlICBDREFUQSAgI0lNUExJRUQgLS0gZGVmYXVsdHMgdG8gZWxlbWVudCBjb250ZW50IC0tCi0gICAgICAgID4KLQotPCEtLSBNdWx0aS1saW5lIHRleHQgaW5wdXQgZmllbGQuIC0tPgotCi08IUVMRU1FTlQgVEVYVEFSRUEgLSAtICgjUENEQVRBKSo+Ci08IUFUVExJU1QgVEVYVEFSRUEKLSAgICAgICAgbmFtZSBDREFUQSAjUkVRVUlSRUQKLSAgICAgICAgcm93cyBOVU1CRVIgI1JFUVVJUkVECi0gICAgICAgIGNvbHMgTlVNQkVSICNSRVFVSVJFRAotICAgICAgICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PSBUYWJsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFdpZGVseSBkZXBsb3llZCBzdWJzZXQgb2YgdGhlIGZ1bGwgdGFibGUgc3RhbmRhcmQsIHNlZSBSRkMgMTk0MgotICAgICBlLmcuIGF0IGh0dHA6Ly93d3cuaWNzLnVjaS5lZHUvcHViL2lldGYvaHRtbC9yZmMxOTQyLnR4dCAtLT4KLQotPCEtLSBob3Jpem9udGFsIHBsYWNlbWVudCBvZiB0YWJsZSByZWxhdGl2ZSB0byB3aW5kb3cgLS0+Ci08IUVOVElUWSAlIFdoZXJlICIobGVmdHxjZW50ZXJ8cmlnaHQpIj4KLQotPCEtLSBob3Jpem9udGFsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzIC0tPgotPCFFTlRJVFkgJSBjZWxsLmhhbGlnbgotICAgICAgICAiYWxpZ24gIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQiCi0gICAgICAgID4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbC52YWxpZ24KLSAgICAgICAgInZhbGlnbiAgKHRvcHxtaWRkbGV8Ym90dG9tKSAgI0lNUExJRUQiCi0gICAgICAgID4KLQotPCFFTEVNRU5UIHRhYmxlIC0gLSAoY2FwdGlvbj8sIHRyKyk+Ci08IUVMRU1FTlQgdHIgLSBPICh0aHx0ZCkqPgotPCFFTEVNRU5UICh0aHx0ZCkgLSBPICVib2R5LmNvbnRlbnQ+Ci0KLTwhQVRUTElTVCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgLS0gdGFibGUgZWxlbWVudCAtLQotICAgICAgICBhbGlnbiAgICAgJVdoZXJlOyAgICNJTVBMSUVEICAtLSB0YWJsZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB3aW5kb3cgLS0KLSAgICAgICAgd2lkdGggICAgICVMZW5ndGggICAjSU1QTElFRCAgLS0gdGFibGUgd2lkdGggcmVsYXRpdmUgdG8gd2luZG93IC0tCi0gICAgICAgIGJvcmRlciAgICAlUGl4ZWxzICAgI0lNUExJRUQgIC0tIGNvbnRyb2xzIGZyYW1lIHdpZHRoIGFyb3VuZCB0YWJsZSAtLQotICAgICAgICBjZWxsc3BhY2luZyAlUGl4ZWxzICNJTVBMSUVEICAtLSBzcGFjaW5nIGJldHdlZW4gY2VsbHMgLS0KLSAgICAgICAgY2VsbHBhZGRpbmcgJVBpeGVscyAjSU1QTElFRCAgLS0gc3BhY2luZyB3aXRoaW4gY2VsbHMgLS0KLSAgICAgICAgPgotCi08IUVMRU1FTlQgQ0FQVElPTiAtIC0gKCV0ZXh0OykqIC0tIHRhYmxlIG9yIGZpZ3VyZSBjYXB0aW9uIC0tPgotPCFBVFRMSVNUIENBUFRJT04KLSAgICAgICAgYWxpZ24gKHRvcHxib3R0b20pICNJTVBMSUVECi0gICAgICAgID4KLQotPCFBVFRMSVNUIHRyICAgICAgICAgICAgICAgICAgICAgICAtLSB0YWJsZSByb3cgLS0KLSAgICAgICAgJWNlbGwuaGFsaWduOyAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgICAgICAgJWNlbGwudmFsaWduOyAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICAgICAgID4KLQotPCFBVFRMSVNUICh0aHx0ZCkgICAgICAgICAgICAgICAgICAtLSBoZWFkZXIgb3IgZGF0YSBjZWxsIC0tCi0gICAgICAgIG5vd3JhcCAobm93cmFwKSAgI0lNUExJRUQgIC0tIHN1cHByZXNzIHdvcmQgd3JhcCAtLQotICAgICAgICByb3dzcGFuIE5VTUJFUiAgIDEgICAgICAgICAtLSBudW1iZXIgb2Ygcm93cyBzcGFubmVkIGJ5IGNlbGwgLS0KLSAgICAgICAgY29sc3BhbiBOVU1CRVIgICAxICAgICAgICAgLS0gbnVtYmVyIG9mIGNvbHMgc3Bhbm5lZCBieSBjZWxsIC0tCi0gICAgICAgICVjZWxsLmhhbGlnbjsgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGwgLS0KLSAgICAgICAgJWNlbGwudmFsaWduOyAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGwgLS0KLSAgICAgICAgd2lkdGggICAlUGl4ZWxzICAjSU1QTElFRCAgLS0gc3VnZ2VzdGVkIHdpZHRoIGZvciBjZWxsIC0tCi0gICAgICAgIGhlaWdodCAgJVBpeGVscyAgI0lNUExJRUQgIC0tIHN1Z2dlc3RlZCBoZWlnaHQgZm9yIGNlbGwgLS0KLSAgICAgICAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBIZWFkID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSAlaGVhZC5taXNjIGRlZmluZWQgZWFybGllciBvbiBhcyAiU0NSSVBUfFNUWUxFfE1FVEF8TElOSyIgLS0+Ci0KLTwhRU5USVRZICUgaGVhZC5jb250ZW50ICJUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8iPgotCi08IUVMRU1FTlQgSEVBRCBPIE8gICglaGVhZC5jb250ZW50KSArKCVoZWFkLm1pc2MpPgotCi08IUVMRU1FTlQgVElUTEUgLSAtICAoI1BDREFUQSkqIC0oJWhlYWQubWlzYykKLSAgICAgICAgICAtLSBUaGUgVElUTEUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgICAgICAgICAgSXQgc2hvdWxkIGJlIGRpc3BsYXllZCwgZm9yIGV4YW1wbGUgYXMgdGhlIHBhZ2UgaGVhZGVyIG9yCi0gICAgICAgICAgICAgd2luZG93IHRpdGxlLgotICAgICAgICAgIC0tPgotCi08IUVMRU1FTlQgSVNJTkRFWCAtIE8gRU1QVFk+Ci08IUFUVExJU1QgSVNJTkRFWAotICAgICAgICBwcm9tcHQgQ0RBVEEgI0lNUExJRUQgLS0gcHJvbXB0IG1lc3NhZ2UgLS0+Ci0KLTwhLS0KLSAgICBUaGUgQkFTRSBlbGVtZW50IGdpdmVzIGFuIGFic29sdXRlIFVSTCBmb3IgZGVyZWZlcmVuY2luZyByZWxhdGl2ZQotICAgIFVSTHMsIGUuZy4KLQotICAgICAgICAgPEJBU0UgaHJlZj0iaHR0cDovL2Zvby5jb20vaW5kZXguaHRtbCI+Ci0gICAgICAgICAuLi4KLSAgICAgICAgIDxJTUcgU1JDPSJpbWFnZXMvYmFyLmdpZiI+Ci0KLSAgICBUaGUgaW1hZ2UgaXMgZGVmZXJlbmNlZCB0bwotCi0gICAgICAgICBodHRwOi8vZm9vLmNvbS9pbWFnZXMvYmFyLmdpZgotCi0gICBJbiB0aGUgYWJzZW5jZSBvZiBhIEJBU0UgZWxlbWVudCB0aGUgZG9jdW1lbnQgVVJMIHNob3VsZCBiZSB1c2VkLgotICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBVUkwgdXNlZCB0bwotICAgcmVxdWVzdCB0aGUgZG9jdW1lbnQsIGFzIHRoZSBiYXNlIFVSTCBtYXkgYmUgb3ZlcnJpZGRlbiBieSBhbiBIVFRQCi0gICBoZWFkZXIgYWNjb21wYW55aW5nIHRoZSBkb2N1bWVudC4KLS0tPgotCi08IUVMRU1FTlQgQkFTRSAtIE8gRU1QVFk+Ci08IUFUVExJU1QgQkFTRQotICAgICAgICBocmVmICVVUkwgICNSRVFVSVJFRAotICAgICAgICA+Ci0KLTwhRUxFTUVOVCBNRVRBIC0gTyBFTVBUWSAtLSBHZW5lcmljIE1ldGFpbmZvcm1hdGlvbiAtLT4KLTwhQVRUTElTVCBNRVRBCi0gICAgICAgIGh0dHAtZXF1aXYgIE5BTUUgICAgI0lNUExJRUQgIC0tIEhUVFAgcmVzcG9uc2UgaGVhZGVyIG5hbWUgIC0tCi0gICAgICAgIG5hbWUgICAgICAgIE5BTUUgICAgI0lNUExJRUQgIC0tIG1ldGFpbmZvcm1hdGlvbiBuYW1lICAgICAgIC0tCi0gICAgICAgIGNvbnRlbnQgICAgIENEQVRBICAgI1JFUVVJUkVEIC0tIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gICAgIC0tCi0gICAgICAgID4KLQotPCEtLSBTQ1JJUFQvU1RZTEUgYXJlIHBsYWNlIGhvbGRlcnMgZm9yIHRyYW5zaXRpb24gdG8gbmV4dCB2ZXJzaW9uIG9mIEhUTUwgLS0+Ci0KLTwhRUxFTUVOVCBTVFlMRSAgLSAtIENEQVRBIC0tIHBsYWNlaG9sZGVyIGZvciBzdHlsZSBpbmZvIC0tPgotPCFFTEVNRU5UIFNDUklQVCAtIC0gQ0RBVEEgLS0gcGxhY2Vob2xkZXIgZm9yIHNjcmlwdCBzdGF0ZW1lbnRzIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBTdHJ1Y3R1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSB2ZXJzaW9uLmF0dHIgIlZFUlNJT04gQ0RBVEEgI0ZJWEVEICclSFRNTC5WZXJzaW9uOyciPgotCi08IVsgJUhUTUwuRGVwcmVjYXRlZCBbCi0gICAgPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEJPRFksIFBMQUlOVEVYVD8iPgotXV0+Ci0KLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICJIRUFELCBCT0RZIj4KLQotPCFFTEVNRU5UIEhUTUwgTyBPICAoJWh0bWwuY29udGVudCk+Ci08IUFUVExJU1QgSFRNTAotICAgICAgICAldmVyc2lvbi5hdHRyOwotICAgICAgICA+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL0hUTUxsYXQxLmVudCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSFRNTGxhdDEuZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQ0NDg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSFRNTGxhdDEuZW50CisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgIDwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAgICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMS8vRU4vL0hUTUwiPgotICAgICAlSFRNTGxhdDE7Ci0tLT4KLQotPCFFTlRJVFkgbmJzcCAgIENEQVRBICImIzE2MDsiIC0tIG5vLWJyZWFrIHNwYWNlID0gbm9uLWJyZWFraW5nIHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBMCBJU09udW0gLS0+Ci08IUVOVElUWSBpZXhjbCAgQ0RBVEEgIiYjMTYxOyIgLS0gaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyaywgVSswMEExIElTT251bSAtLT4KLTwhRU5USVRZIGNlbnQgICBDREFUQSAiJiMxNjI7IiAtLSBjZW50IHNpZ24sIFUrMDBBMiBJU09udW0gLS0+Ci08IUVOVElUWSBwb3VuZCAgQ0RBVEEgIiYjMTYzOyIgLS0gcG91bmQgc2lnbiwgVSswMEEzIElTT251bSAtLT4KLTwhRU5USVRZIGN1cnJlbiBDREFUQSAiJiMxNjQ7IiAtLSBjdXJyZW5jeSBzaWduLCBVKzAwQTQgSVNPbnVtIC0tPgotPCFFTlRJVFkgeWVuICAgIENEQVRBICImIzE2NTsiIC0tIHllbiBzaWduID0geXVhbiBzaWduLCBVKzAwQTUgSVNPbnVtIC0tPgotPCFFTlRJVFkgYnJ2YmFyIENEQVRBICImIzE2NjsiIC0tIGJyb2tlbiBiYXIgPSBicm9rZW4gdmVydGljYWwgYmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBNiBJU09udW0gLS0+Ci08IUVOVElUWSBzZWN0ICAgQ0RBVEEgIiYjMTY3OyIgLS0gc2VjdGlvbiBzaWduLCBVKzAwQTcgSVNPbnVtIC0tPgotPCFFTlRJVFkgdW1sICAgIENEQVRBICImIzE2ODsiIC0tIGRpYWVyZXNpcyA9IHNwYWNpbmcgZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBOCBJU09kaWEgLS0+Ci08IUVOVElUWSBjb3B5ICAgQ0RBVEEgIiYjMTY5OyIgLS0gY29weXJpZ2h0IHNpZ24sIFUrMDBBOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRmICAgQ0RBVEEgIiYjMTcwOyIgLS0gZmVtaW5pbmUgb3JkaW5hbCBpbmRpY2F0b3IsIFUrMDBBQSBJU09udW0gLS0+Ci08IUVOVElUWSBsYXF1byAgQ0RBVEEgIiYjMTcxOyIgLS0gbGVmdC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxlZnQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQUIgSVNPbnVtIC0tPgotPCFFTlRJVFkgbm90ICAgIENEQVRBICImIzE3MjsiIC0tIG5vdCBzaWduLCBVKzAwQUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2h5ICAgIENEQVRBICImIzE3MzsiIC0tIHNvZnQgaHlwaGVuID0gZGlzY3JldGlvbmFyeSBoeXBoZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFEIElTT251bSAtLT4KLTwhRU5USVRZIHJlZyAgICBDREFUQSAiJiMxNzQ7IiAtLSByZWdpc3RlcmVkIHNpZ24gPSByZWdpc3RlcmVkIHRyYWRlIG1hcmsgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUUgSVNPbnVtIC0tPgotPCFFTlRJVFkgbWFjciAgIENEQVRBICImIzE3NTsiIC0tIG1hY3JvbiA9IHNwYWNpbmcgbWFjcm9uID0gb3ZlcmxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFQTCBvdmVyYmFyLCBVKzAwQUYgSVNPZGlhIC0tPgotPCFFTlRJVFkgZGVnICAgIENEQVRBICImIzE3NjsiIC0tIGRlZ3JlZSBzaWduLCBVKzAwQjAgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGx1c21uIENEQVRBICImIzE3NzsiIC0tIHBsdXMtbWludXMgc2lnbiA9IHBsdXMtb3ItbWludXMgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjEgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMiAgIENEQVRBICImIzE3ODsiIC0tIHN1cGVyc2NyaXB0IHR3byA9IHN1cGVyc2NyaXB0IGRpZ2l0IHR3bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3F1YXJlZCwgVSswMEIyIElTT251bSAtLT4KLTwhRU5USVRZIHN1cDMgICBDREFUQSAiJiMxNzk7IiAtLSBzdXBlcnNjcmlwdCB0aHJlZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IHRocmVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjdWJlZCwgVSswMEIzIElTT251bSAtLT4KLTwhRU5USVRZIGFjdXRlICBDREFUQSAiJiMxODA7IiAtLSBhY3V0ZSBhY2NlbnQgPSBzcGFjaW5nIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCNCBJU09kaWEgLS0+Ci08IUVOVElUWSBtaWNybyAgQ0RBVEEgIiYjMTgxOyIgLS0gbWljcm8gc2lnbiwgVSswMEI1IElTT251bSAtLT4KLTwhRU5USVRZIHBhcmEgICBDREFUQSAiJiMxODI7IiAtLSBwaWxjcm93IHNpZ24gPSBwYXJhZ3JhcGggc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgbWlkZG90IENEQVRBICImIzE4MzsiIC0tIG1pZGRsZSBkb3QgPSBHZW9yZ2lhbiBjb21tYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gR3JlZWsgbWlkZGxlIGRvdCwgVSswMEI3IElTT251bSAtLT4KLTwhRU5USVRZIGNlZGlsICBDREFUQSAiJiMxODQ7IiAtLSBjZWRpbGxhID0gc3BhY2luZyBjZWRpbGxhLCBVKzAwQjggSVNPZGlhIC0tPgotPCFFTlRJVFkgc3VwMSAgIENEQVRBICImIzE4NTsiIC0tIHN1cGVyc2NyaXB0IG9uZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjkgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3JkbSAgIENEQVRBICImIzE4NjsiIC0tIG1hc2N1bGluZSBvcmRpbmFsIGluZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQkEgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmFxdW8gIENEQVRBICImIzE4NzsiIC0tIHJpZ2h0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcmlnaHQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQkIgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzE0IENEQVRBICImIzE4ODsiIC0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgcXVhcnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gb25lIHF1YXJ0ZXIsIFUrMDBCQyBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMTIgQ0RBVEEgIiYjMTg5OyIgLS0gdnVsZ2FyIGZyYWN0aW9uIG9uZSBoYWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiBvbmUgaGFsZiwgVSswMEJEIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMzNCBDREFUQSAiJiMxOTA7IiAtLSB2dWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzLCBVKzAwQkUgSVNPbnVtIC0tPgotPCFFTlRJVFkgaXF1ZXN0IENEQVRBICImIzE5MTsiIC0tIGludmVydGVkIHF1ZXN0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHR1cm5lZCBxdWVzdGlvbiBtYXJrLCBVKzAwQkYgSVNPbnVtIC0tPgotPCFFTlRJVFkgQWdyYXZlIENEQVRBICImIzE5MjsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBncmF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFhY3V0ZSBDREFUQSAiJiMxOTM7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBY2lyYyAgQ0RBVEEgIiYjMTk0OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBdGlsZGUgQ0RBVEEgIiYjMTk1OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXVtbCAgIENEQVRBICImIzE5NjsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBBcmluZyAgQ0RBVEEgIiYjMTk3OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHJpbmcgYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFFbGlnICBDREFUQSAiJiMxOTg7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBBRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIENjZWRpbCBDREFUQSAiJiMxOTk7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBDIHdpdGggY2VkaWxsYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzcgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVncmF2ZSBDREFUQSAiJiMyMDA7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFYWN1dGUgQ0RBVEEgIiYjMjAxOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWNpcmMgIENEQVRBICImIzIwMjsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgRXVtbCAgIENEQVRBICImIzIwMzsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJZ3JhdmUgQ0RBVEEgIiYjMjA0OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWFjdXRlIENEQVRBICImIzIwNTsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0QgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEljaXJjICBDREFUQSAiJiMyMDY7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0UgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEl1bWwgICBDREFUQSAiJiMyMDc7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRiBJU09sYXQxIC0tPgotPCFFTlRJVFkgRVRIICAgIENEQVRBICImIzIwODsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEVUSCwgVSswMEQwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBOdGlsZGUgQ0RBVEEgIiYjMjA5OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTiB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2dyYXZlIENEQVRBICImIzIxMDsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9hY3V0ZSBDREFUQSAiJiMyMTE7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPY2lyYyAgQ0RBVEEgIiYjMjEyOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBPdGlsZGUgQ0RBVEEgIiYjMjEzOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENSBJU09sYXQxIC0tPgotPCFFTlRJVFkgT3VtbCAgIENEQVRBICImIzIxNDsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ2IElTT2xhdDEgLS0+Ci08IUVOVElUWSB0aW1lcyAgQ0RBVEEgIiYjMjE1OyIgLS0gbXVsdGlwbGljYXRpb24gc2lnbiwgVSswMEQ3IElTT251bSAtLT4KLTwhRU5USVRZIE9zbGFzaCBDREFUQSAiJiMyMTY7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggc3Ryb2tlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHNsYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWdyYXZlIENEQVRBICImIzIxNzsiIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVhY3V0ZSBDREFUQSAiJiMyMTg7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBVY2lyYyAgQ0RBVEEgIiYjMjE5OyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBVdW1sICAgQ0RBVEEgIiYjMjIwOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFlhY3V0ZSBDREFUQSAiJiMyMjE7IiAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBZIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEREIElTT2xhdDEgLS0+Ci08IUVOVElUWSBUSE9STiAgQ0RBVEEgIiYjMjIyOyIgLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVEhPUk4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBzemxpZyAgQ0RBVEEgIiYjMjIzOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHNoYXJwIHMgPSBlc3MtemVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERiBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWdyYXZlIENEQVRBICImIzIyNDsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZ3JhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBhIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWFjdXRlIENEQVRBICImIzIyNTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhY2lyYyAgQ0RBVEEgIiYjMjI2OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXRpbGRlIENEQVRBICImIzIyNzsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhdW1sICAgQ0RBVEEgIiYjMjI4OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBhcmluZyAgQ0RBVEEgIiYjMjI5OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCByaW5nIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSByaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWVsaWcgIENEQVRBICImIzIzMDsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBhZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGlnYXR1cmUgYWUsIFUrMDBFNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgY2NlZGlsIENEQVRBICImIzIzMTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBjIHdpdGggY2VkaWxsYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTcgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVncmF2ZSBDREFUQSAiJiMyMzI7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWFjdXRlIENEQVRBICImIzIzMzsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlY2lyYyAgQ0RBVEEgIiYjMjM0OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgZXVtbCAgIENEQVRBICImIzIzNTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWdyYXZlIENEQVRBICImIzIzNjsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpYWN1dGUgQ0RBVEEgIiYjMjM3OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGljaXJjICBDREFUQSAiJiMyMzg7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpdW1sICAgQ0RBVEEgIiYjMjM5OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBldGggICAgQ0RBVEEgIiYjMjQwOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIGV0aCwgVSswMEYwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBudGlsZGUgQ0RBVEEgIiYjMjQxOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIG4gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9ncmF2ZSBDREFUQSAiJiMyNDI7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2FjdXRlIENEQVRBICImIzI0MzsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvY2lyYyAgQ0RBVEEgIiYjMjQ0OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgb3RpbGRlIENEQVRBICImIzI0NTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdW1sICAgQ0RBVEEgIiYjMjQ2OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBkaXZpZGUgQ0RBVEEgIiYjMjQ3OyIgLS0gZGl2aXNpb24gc2lnbiwgVSswMEY3IElTT251bSAtLT4KLTwhRU5USVRZIG9zbGFzaCBDREFUQSAiJiMyNDg7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHN0cm9rZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBvIHNsYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWdyYXZlIENEQVRBICImIzI0OTsiIC0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY5IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1YWN1dGUgQ0RBVEEgIiYjMjUwOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVjaXJjICBDREFUQSAiJiMyNTE7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZCIElTT2xhdDEgLS0+Ci08IUVOVElUWSB1dW1sICAgQ0RBVEEgIiYjMjUyOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZDIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5YWN1dGUgQ0RBVEEgIiYjMjUzOyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRob3JuICBDREFUQSAiJiMyNTQ7IiAtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdGhvcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZFIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5dW1sICAgQ0RBVEEgIiYjMjU1OyIgLS0gbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZGIElTT2xhdDEgLS0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9IVE1Mc3BlY2lhbC5lbnQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL0hUTUxzcGVjaWFsLmVudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlNWM2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL0hUTUxzcGVjaWFsLmVudAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTwhLS0gU3BlY2lhbCBjaGFyYWN0ZXJzIGZvciBIVE1MIC0tPgotCi08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgIDwhRU5USVRZICUgSFRNTHNwZWNpYWwgUFVCTElDCi0gICAgICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbC8vRU4vL0hUTUwiPgotICAgICAlSFRNTHNwZWNpYWw7IC0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIENEQVRBIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBJU08gMTA2NDYgbmFtZXMuIAotCi0tLT4KLQotPCEtLSBDMCBDb250cm9scyBhbmQgQmFzaWMgTGF0aW4gLS0+Ci08IUVOVElUWSBxdW90ICAgIENEQVRBICImIzM0OyIgICAtLSBxdW90YXRpb24gbWFyayA9IEFQTCBxdW90ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDAyMiBJU09udW0gLS0+Ci08IUVOVElUWSBhbXAgICAgIENEQVRBICImIzM4OyIgICAtLSBhbXBlcnNhbmQsIFUrMDAyNiBJU09udW0gLS0+Ci08IUVOVElUWSBsdCAgICAgIENEQVRBICImIzYwOyIgICAtLSBsZXNzLXRoYW4gc2lnbiwgVSswMDNDIElTT251bSAtLT4KLTwhRU5USVRZIGd0ICAgICAgQ0RBVEEgIiYjNjI7IiAgIC0tIGdyZWF0ZXItdGhhbiBzaWduLCBVKzAwM0UgSVNPbnVtIC0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUEgLS0+Ci08IUVOVElUWSBPRWxpZyAgIENEQVRBICImIzMzODsiICAtLSBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIE9FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTUyIElTT2xhdDIgLS0+Ci08IUVOVElUWSBvZWxpZyAgIENEQVRBICImIzMzOTsiICAtLSBsYXRpbiBzbWFsbCBsaWdhdHVyZSBvZSwgVSswMTUzIElTT2xhdDIgLS0+Ci08IS0tIGxpZ2F0dXJlIGlzIGEgbWlzbm9tZXIsIHRoaXMgaXMgYSBzZXBhcmF0ZSBjaGFyYWN0ZXIgaW4gc29tZSBsYW5ndWFnZXMgLS0+Ci08IUVOVElUWSBTY2Fyb24gIENEQVRBICImIzM1MjsiICAtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBTIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjAgSVNPbGF0MiAtLT4KLTwhRU5USVRZIHNjYXJvbiAgQ0RBVEEgIiYjMzUzOyIgIC0tIGxhdGluIHNtYWxsIGxldHRlciBzIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjEgSVNPbGF0MiAtLT4KLTwhRU5USVRZIFl1bWwgICAgQ0RBVEEgIiYjMzc2OyIgIC0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNzggSVNPbGF0MiAtLT4KLQotPCEtLSBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMgLS0+Ci08IUVOVElUWSBjaXJjICAgIENEQVRBICImIzcxMDsiICAtLSBtb2RpZmllciBsZXR0ZXIgY2lyY3VtZmxleCBhY2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAyQzYgSVNPcHViIC0tPgotPCFFTlRJVFkgdGlsZGUgICBDREFUQSAiJiM3MzI7IiAgLS0gc21hbGwgdGlsZGUsIFUrMDJEQyBJU09kaWEgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGVuc3AgICAgQ0RBVEEgIiYjODE5NDsiIC0tIGVuIHNwYWNlLCBVKzIwMDIgSVNPcHViIC0tPgotPCFFTlRJVFkgZW1zcCAgICBDREFUQSAiJiM4MTk1OyIgLS0gZW0gc3BhY2UsIFUrMjAwMyBJU09wdWIgLS0+Ci08IUVOVElUWSB0aGluc3AgIENEQVRBICImIzgyMDE7IiAtLSB0aGluIHNwYWNlLCBVKzIwMDkgSVNPcHViIC0tPgotPCFFTlRJVFkgenduaiAgICBDREFUQSAiJiM4MjA0OyIgLS0gemVybyB3aWR0aCBub24tam9pbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDBDIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHp3aiAgICAgQ0RBVEEgIiYjODIwNTsiIC0tIHplcm8gd2lkdGggam9pbmVyLCBVKzIwMEQgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbHJtICAgICBDREFUQSAiJiM4MjA2OyIgLS0gbGVmdC10by1yaWdodCBtYXJrLCBVKzIwMEUgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgcmxtICAgICBDREFUQSAiJiM4MjA3OyIgLS0gcmlnaHQtdG8tbGVmdCBtYXJrLCBVKzIwMEYgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbmRhc2ggICBDREFUQSAiJiM4MjExOyIgLS0gZW4gZGFzaCwgVSsyMDEzIElTT3B1YiAtLT4KLTwhRU5USVRZIG1kYXNoICAgQ0RBVEEgIiYjODIxMjsiIC0tIGVtIGRhc2gsIFUrMjAxNCBJU09wdWIgLS0+Ci08IUVOVElUWSBsc3F1byAgIENEQVRBICImIzgyMTY7IiAtLSBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxOCBJU09udW0gLS0+Ci08IUVOVElUWSByc3F1byAgIENEQVRBICImIzgyMTc7IiAtLSByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2JxdW8gICBDREFUQSAiJiM4MjE4OyIgLS0gc2luZ2xlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUEgTkVXIC0tPgotPCFFTlRJVFkgbGRxdW8gICBDREFUQSAiJiM4MjIwOyIgLS0gbGVmdCBkb3VibGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmRxdW8gICBDREFUQSAiJiM4MjIxOyIgLS0gcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDFEIElTT251bSAtLT4KLTwhRU5USVRZIGJkcXVvICAgQ0RBVEEgIiYjODIyMjsiIC0tIGRvdWJsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFFIE5FVyAtLT4KLTwhRU5USVRZIGRhZ2dlciAgQ0RBVEEgIiYjODIyNDsiIC0tIGRhZ2dlciwgVSsyMDIwIElTT3B1YiAtLT4KLTwhRU5USVRZIERhZ2dlciAgQ0RBVEEgIiYjODIyNTsiIC0tIGRvdWJsZSBkYWdnZXIsIFUrMjAyMSBJU09wdWIgLS0+Ci08IUVOVElUWSBwZXJtaWwgIENEQVRBICImIzgyNDA7IiAtLSBwZXIgbWlsbGUgc2lnbiwgVSsyMDMwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsc2FxdW8gIENEQVRBICImIzgyNDk7IiAtLSBzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzOSBJU08gcHJvcG9zZWQgLS0+Ci08IS0tIGxzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkIC0tPgotPCFFTlRJVFkgcnNhcXVvICBDREFUQSAiJiM4MjUwOyIgLS0gc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDNBIElTTyBwcm9wb3NlZCAtLT4KLTwhLS0gcnNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSBldXJvICAgQ0RBVEEgIiYjODM2NDsiICAtLSBldXJvIHNpZ24sIFUrMjBBQyBORVcgLS0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9IVE1Mc3ltYm9sLmVudCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSFRNTHN5bWJvbC5lbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNGJmZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9IVE1Mc3ltYm9sLmVudAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi08IS0tIE1hdGhlbWF0aWNhbCwgR3JlZWsgYW5kIFN5bWJvbGljIGNoYXJhY3RlcnMgZm9yIEhUTUwgLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgICAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMvL0VOLy9IVE1MIj4KLSAgICAgJUhUTUxzeW1ib2w7IC0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIENEQVRBIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBJU08gMTA2NDYgbmFtZXMuIAotCi0tLT4KLQotPCEtLSBMYXRpbiBFeHRlbmRlZC1CIC0tPgotPCFFTlRJVFkgZm5vZiAgICAgQ0RBVEEgIiYjNDAyOyIgLS0gbGF0aW4gc21hbGwgZiB3aXRoIGhvb2sgPSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmbG9yaW4sIFUrMDE5MiBJU090ZWNoIC0tPgotCi08IS0tIEdyZWVrIC0tPgotPCFFTlRJVFkgQWxwaGEgICAgQ0RBVEEgIiYjOTEzOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYWxwaGEsIFUrMDM5MSAtLT4KLTwhRU5USVRZIEJldGEgICAgIENEQVRBICImIzkxNDsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGJldGEsIFUrMDM5MiAtLT4KLTwhRU5USVRZIEdhbW1hICAgIENEQVRBICImIzkxNTsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGdhbW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzkzIElTT2dyazMgLS0+Ci08IUVOVElUWSBEZWx0YSAgICBDREFUQSAiJiM5MTY7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5NCBJU09ncmszIC0tPgotPCFFTlRJVFkgRXBzaWxvbiAgQ0RBVEEgIiYjOTE3OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXBzaWxvbiwgVSswMzk1IC0tPgotPCFFTlRJVFkgWmV0YSAgICAgQ0RBVEEgIiYjOTE4OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgemV0YSwgVSswMzk2IC0tPgotPCFFTlRJVFkgRXRhICAgICAgQ0RBVEEgIiYjOTE5OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXRhLCBVKzAzOTcgLS0+Ci08IUVOVElUWSBUaGV0YSAgICBDREFUQSAiJiM5MjA7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciB0aGV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5OCBJU09ncmszIC0tPgotPCFFTlRJVFkgSW90YSAgICAgQ0RBVEEgIiYjOTIxOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgaW90YSwgVSswMzk5IC0tPgotPCFFTlRJVFkgS2FwcGEgICAgQ0RBVEEgIiYjOTIyOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIga2FwcGEsIFUrMDM5QSAtLT4KLTwhRU5USVRZIExhbWJkYSAgIENEQVRBICImIzkyMzsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5QiBJU09ncmszIC0tPgotPCFFTlRJVFkgTXUgICAgICAgQ0RBVEEgIiYjOTI0OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbXUsIFUrMDM5QyAtLT4KLTwhRU5USVRZIE51ICAgICAgIENEQVRBICImIzkyNTsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG51LCBVKzAzOUQgLS0+Ci08IUVOVElUWSBYaSAgICAgICBDREFUQSAiJiM5MjY7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciB4aSwgVSswMzlFIElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWljcm9uICBDREFUQSAiJiM5Mjc7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWljcm9uLCBVKzAzOUYgLS0+Ci08IUVOVElUWSBQaSAgICAgICBDREFUQSAiJiM5Mjg7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaSwgVSswM0EwIElTT2dyazMgLS0+Ci08IUVOVElUWSBSaG8gICAgICBDREFUQSAiJiM5Mjk7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciByaG8sIFUrMDNBMSAtLT4KLTwhLS0gdGhlcmUgaXMgbm8gU2lnbWFmLCBhbmQgbm8gVSswM0EyIGNoYXJhY3RlciBlaXRoZXIgLS0+Ci08IUVOVElUWSBTaWdtYSAgICBDREFUQSAiJiM5MzE7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBMyBJU09ncmszIC0tPgotPCFFTlRJVFkgVGF1ICAgICAgQ0RBVEEgIiYjOTMyOyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGF1LCBVKzAzQTQgLS0+Ci08IUVOVElUWSBVcHNpbG9uICBDREFUQSAiJiM5MzM7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciB1cHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E1IElTT2dyazMgLS0+Ci08IUVOVElUWSBQaGkgICAgICBDREFUQSAiJiM5MzQ7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIENoaSAgICAgIENEQVRBICImIzkzNTsiIC0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGNoaSwgVSswM0E3IC0tPgotPCFFTlRJVFkgUHNpICAgICAgQ0RBVEEgIiYjOTM2OyIgLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcHNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E4IElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWVnYSAgICBDREFUQSAiJiM5Mzc7IiAtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWVnYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBOSBJU09ncmszIC0tPgotCi08IUVOVElUWSBhbHBoYSAgICBDREFUQSAiJiM5NDU7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGJldGEgICAgIENEQVRBICImIzk0NjsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBiZXRhLCBVKzAzQjIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGdhbW1hICAgIENEQVRBICImIzk0NzsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBnYW1tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCMyBJU09ncmszIC0tPgotPCFFTlRJVFkgZGVsdGEgICAgQ0RBVEEgIiYjOTQ4OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I0IElTT2dyazMgLS0+Ci08IUVOVElUWSBlcHNpbG9uICBDREFUQSAiJiM5NDk7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgZXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCNSBJU09ncmszIC0tPgotPCFFTlRJVFkgemV0YSAgICAgQ0RBVEEgIiYjOTUwOyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHpldGEsIFUrMDNCNiBJU09ncmszIC0tPgotPCFFTlRJVFkgZXRhICAgICAgQ0RBVEEgIiYjOTUxOyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGV0YSwgVSswM0I3IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YSAgICBDREFUQSAiJiM5NTI7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGlvdGEgICAgIENEQVRBICImIzk1MzsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBpb3RhLCBVKzAzQjkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGthcHBhICAgIENEQVRBICImIzk1NDsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBrYXBwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCQSBJU09ncmszIC0tPgotPCFFTlRJVFkgbGFtYmRhICAgQ0RBVEEgIiYjOTU1OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCQiBJU09ncmszIC0tPgotPCFFTlRJVFkgbXUgICAgICAgQ0RBVEEgIiYjOTU2OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG11LCBVKzAzQkMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG51ICAgICAgIENEQVRBICImIzk1NzsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBudSwgVSswM0JEIElTT2dyazMgLS0+Ci08IUVOVElUWSB4aSAgICAgICBDREFUQSAiJiM5NTg7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgeGksIFUrMDNCRSBJU09ncmszIC0tPgotPCFFTlRJVFkgb21pY3JvbiAgQ0RBVEEgIiYjOTU5OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9taWNyb24sIFUrMDNCRiBORVcgLS0+Ci08IUVOVElUWSBwaSAgICAgICBDREFUQSAiJiM5NjA7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgcGksIFUrMDNDMCBJU09ncmszIC0tPgotPCFFTlRJVFkgcmhvICAgICAgQ0RBVEEgIiYjOTYxOyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHJobywgVSswM0MxIElTT2dyazMgLS0+Ci08IUVOVElUWSBzaWdtYWYgICBDREFUQSAiJiM5NjI7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgZmluYWwgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hICAgIENEQVRBICImIzk2MzsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDMyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGF1ICAgICAgQ0RBVEEgIiYjOTY0OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRhdSwgVSswM0M0IElTT2dyazMgLS0+Ci08IUVOVElUWSB1cHNpbG9uICBDREFUQSAiJiM5NjU7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgdXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDNSBJU09ncmszIC0tPgotPCFFTlRJVFkgcGhpICAgICAgQ0RBVEEgIiYjOTY2OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBoaSwgVSswM0M2IElTT2dyazMgLS0+Ci08IUVOVElUWSBjaGkgICAgICBDREFUQSAiJiM5Njc7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgY2hpLCBVKzAzQzcgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBzaSAgICAgIENEQVRBICImIzk2ODsiIC0tIGdyZWVrIHNtYWxsIGxldHRlciBwc2ksIFUrMDNDOCBJU09ncmszIC0tPgotPCFFTlRJVFkgb21lZ2EgICAgQ0RBVEEgIiYjOTY5OyIgLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9tZWdhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0M5IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YXN5bSBDREFUQSAiJiM5Nzc7IiAtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0QxIE5FVyAtLT4KLTwhRU5USVRZIHVwc2loICAgIENEQVRBICImIzk3ODsiIC0tIGdyZWVrIHVwc2lsb24gd2l0aCBob29rIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNEMiBORVcgLS0+Ci08IUVOVElUWSBwaXYgICAgICBDREFUQSAiJiM5ODI7IiAtLSBncmVlayBwaSBzeW1ib2wsIFUrMDNENiBJU09ncmszIC0tPgotCi08IS0tIEdlbmVyYWwgUHVuY3R1YXRpb24gLS0+Ci08IUVOVElUWSBidWxsICAgICBDREFUQSAiJiM4MjI2OyIgLS0gYnVsbGV0ID0gYmxhY2sgc21hbGwgY2lyY2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAyMiBJU09wdWIgIC0tPgotPCEtLSBidWxsZXQgaXMgTk9UIHRoZSBzYW1lIGFzIGJ1bGxldCBvcGVyYXRvciwgVSsyMjE5IC0tPgotPCFFTlRJVFkgaGVsbGlwICAgQ0RBVEEgIiYjODIzMDsiIC0tIGhvcml6b250YWwgZWxsaXBzaXMgPSB0aHJlZSBkb3QgbGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAyNiBJU09wdWIgIC0tPgotPCFFTlRJVFkgcHJpbWUgICAgQ0RBVEEgIiYjODI0MjsiIC0tIHByaW1lID0gbWludXRlcyA9IGZlZXQsIFUrMjAzMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgUHJpbWUgICAgQ0RBVEEgIiYjODI0MzsiIC0tIGRvdWJsZSBwcmltZSA9IHNlY29uZHMgPSBpbmNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDMzIElTT3RlY2ggLS0+Ci08IUVOVElUWSBvbGluZSAgICBDREFUQSAiJiM4MjU0OyIgLS0gb3ZlcmxpbmUgPSBzcGFjaW5nIG92ZXJzY29yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwM0UgTkVXIC0tPgotPCFFTlRJVFkgZnJhc2wgICAgQ0RBVEEgIiYjODI2MDsiIC0tIGZyYWN0aW9uIHNsYXNoLCBVKzIwNDQgTkVXIC0tPgotCi08IS0tIExldHRlcmxpa2UgU3ltYm9scyAtLT4KLTwhRU5USVRZIHdlaWVycCAgIENEQVRBICImIzg0NzI7IiAtLSBzY3JpcHQgY2FwaXRhbCBQID0gcG93ZXIgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBXZWllcnN0cmFzcyBwLCBVKzIxMTggSVNPYW1zbyAtLT4KLTwhRU5USVRZIGltYWdlICAgIENEQVRBICImIzg0NjU7IiAtLSBibGFja2xldHRlciBjYXBpdGFsIEkgPSBpbWFnaW5hcnkgcGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMTEgSVNPYW1zbyAtLT4KLTwhRU5USVRZIHJlYWwgICAgIENEQVRBICImIzg0NzY7IiAtLSBibGFja2xldHRlciBjYXBpdGFsIFIgPSByZWFsIHBhcnQgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjExQyBJU09hbXNvIC0tPgotPCFFTlRJVFkgdHJhZGUgICAgQ0RBVEEgIiYjODQ4MjsiIC0tIHRyYWRlIG1hcmsgc2lnbiwgVSsyMTIyIElTT251bSAtLT4KLTwhRU5USVRZIGFsZWZzeW0gIENEQVRBICImIzg1MDE7IiAtLSBhbGVmIHN5bWJvbCA9IGZpcnN0IHRyYW5zZmluaXRlIGNhcmRpbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjEzNSBORVcgLS0+Ci08IS0tIGFsZWYgc3ltYm9sIGlzIE5PVCB0aGUgc2FtZSBhcyBoZWJyZXcgbGV0dGVyIGFsZWYsCi0gICAgIFUrMDVEMCBhbHRob3VnaCB0aGUgc2FtZSBnbHlwaCBjb3VsZCBiZSB1c2VkIHRvIGRlcGljdCBib3RoIGNoYXJhY3RlcnMgLS0+Ci0KLTwhLS0gQXJyb3dzIC0tPgotPCFFTlRJVFkgbGFyciAgICAgQ0RBVEEgIiYjODU5MjsiIC0tIGxlZnR3YXJkcyBhcnJvdywgVSsyMTkwIElTT251bSAtLT4KLTwhRU5USVRZIHVhcnIgICAgIENEQVRBICImIzg1OTM7IiAtLSB1cHdhcmRzIGFycm93LCBVKzIxOTEgSVNPbnVtLS0+Ci08IUVOVElUWSByYXJyICAgICBDREFUQSAiJiM4NTk0OyIgLS0gcmlnaHR3YXJkcyBhcnJvdywgVSsyMTkyIElTT251bSAtLT4KLTwhRU5USVRZIGRhcnIgICAgIENEQVRBICImIzg1OTU7IiAtLSBkb3dud2FyZHMgYXJyb3csIFUrMjE5MyBJU09udW0gLS0+Ci08IUVOVElUWSBoYXJyICAgICBDREFUQSAiJiM4NTk2OyIgLS0gbGVmdCByaWdodCBhcnJvdywgVSsyMTk0IElTT2Ftc2EgLS0+Ci08IUVOVElUWSBjcmFyciAgICBDREFUQSAiJiM4NjI5OyIgLS0gZG93bndhcmRzIGFycm93IHdpdGggY29ybmVyIGxlZnR3YXJkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY2FycmlhZ2UgcmV0dXJuLCBVKzIxQjUgTkVXIC0tPgotPCFFTlRJVFkgbEFyciAgICAgQ0RBVEEgIiYjODY1NjsiIC0tIGxlZnR3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMCBJU090ZWNoIC0tPgotPCEtLSBJU08gMTA2NDYgZG9lcyBub3Qgc2F5IHRoYXQgbEFyciBpcyB0aGUgc2FtZSBhcyB0aGUgJ2lzIGltcGxpZWQgYnknIGFycm93Ci0gICAgYnV0IGFsc28gZG9lcyBub3QgaGF2ZSBhbnkgb3RoZXIgY2hhcmFjdGVyIGZvciB0aGF0IGZ1bmN0aW9uLiBTbyA/IGxBcnIgY2FuCi0gICAgYmUgdXNlZCBmb3IgJ2lzIGltcGxpZWQgYnknIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSB1QXJyICAgICBDREFUQSAiJiM4NjU3OyIgLS0gdXB3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMSBJU09hbXNhIC0tPgotPCFFTlRJVFkgckFyciAgICAgQ0RBVEEgIiYjODY1ODsiIC0tIHJpZ2h0d2FyZHMgZG91YmxlIGFycm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjFEMiBJU090ZWNoIC0tPgotPCEtLSBJU08gMTA2NDYgZG9lcyBub3Qgc2F5IHRoaXMgaXMgdGhlICdpbXBsaWVzJyBjaGFyYWN0ZXIgYnV0IGRvZXMgbm90IGhhdmUgCi0gICAgIGFub3RoZXIgY2hhcmFjdGVyIHdpdGggdGhpcyBmdW5jdGlvbiBzbyA/Ci0gICAgIHJBcnIgY2FuIGJlIHVzZWQgZm9yICdpbXBsaWVzJyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgZEFyciAgICAgQ0RBVEEgIiYjODY1OTsiIC0tIGRvd253YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMyBJU09hbXNhIC0tPgotPCFFTlRJVFkgaEFyciAgICAgQ0RBVEEgIiYjODY2MDsiIC0tIGxlZnQgcmlnaHQgZG91YmxlIGFycm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjFENCBJU09hbXNhIC0tPgotCi08IS0tIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMgLS0+Ci08IUVOVElUWSBmb3JhbGwgICBDREFUQSAiJiM4NzA0OyIgLS0gZm9yIGFsbCwgVSsyMjAwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwYXJ0ICAgICBDREFUQSAiJiM4NzA2OyIgLS0gcGFydGlhbCBkaWZmZXJlbnRpYWwsIFUrMjIwMiBJU090ZWNoICAtLT4KLTwhRU5USVRZIGV4aXN0ICAgIENEQVRBICImIzg3MDc7IiAtLSB0aGVyZSBleGlzdHMsIFUrMjIwMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgZW1wdHkgICAgQ0RBVEEgIiYjODcwOTsiIC0tIGVtcHR5IHNldCA9IG51bGwgc2V0ID0gZGlhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjA1IElTT2Ftc28gLS0+Ci08IUVOVElUWSBuYWJsYSAgICBDREFUQSAiJiM4NzExOyIgLS0gbmFibGEgPSBiYWNrd2FyZCBkaWZmZXJlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgaXNpbiAgICAgQ0RBVEEgIiYjODcxMjsiIC0tIGVsZW1lbnQgb2YsIFUrMjIwOCBJU090ZWNoIC0tPgotPCFFTlRJVFkgbm90aW4gICAgQ0RBVEEgIiYjODcxMzsiIC0tIG5vdCBhbiBlbGVtZW50IG9mLCBVKzIyMDkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG5pICAgICAgIENEQVRBICImIzg3MTU7IiAtLSBjb250YWlucyBhcyBtZW1iZXIsIFUrMjIwQiBJU090ZWNoIC0tPgotPCEtLSBzaG91bGQgdGhlcmUgYmUgYSBtb3JlIG1lbW9yYWJsZSBuYW1lIHRoYW4gJ25pJz8gLS0+Ci08IUVOVElUWSBwcm9kICAgICBDREFUQSAiJiM4NzE5OyIgLS0gbi1hcnkgcHJvZHVjdCA9IHByb2R1Y3Qgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMEYgSVNPYW1zYiAtLT4KLTwhLS0gcHJvZCBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMCAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGknIHRob3VnaAotICAgICB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgc3VtICAgICAgQ0RBVEEgIiYjODcyMTsiIC0tIG4tYXJ5IHN1bWF0aW9uLCBVKzIyMTEgSVNPYW1zYiAtLT4KLTwhLS0gc3VtIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EzICdncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYScKLSAgICAgdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBtaW51cyAgICBDREFUQSAiJiM4NzIyOyIgLS0gbWludXMgc2lnbiwgVSsyMjEyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsb3dhc3QgICBDREFUQSAiJiM4NzI3OyIgLS0gYXN0ZXJpc2sgb3BlcmF0b3IsIFUrMjIxNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgcmFkaWMgICAgQ0RBVEEgIiYjODczMDsiIC0tIHNxdWFyZSByb290ID0gcmFkaWNhbCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIxQSBJU090ZWNoIC0tPgotPCFFTlRJVFkgcHJvcCAgICAgQ0RBVEEgIiYjODczMzsiIC0tIHByb3BvcnRpb25hbCB0bywgVSsyMjFEIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbmZpbiAgICBDREFUQSAiJiM4NzM0OyIgLS0gaW5maW5pdHksIFUrMjIxRSBJU090ZWNoIC0tPgotPCFFTlRJVFkgYW5nICAgICAgQ0RBVEEgIiYjODczNjsiIC0tIGFuZ2xlLCBVKzIyMjAgSVNPYW1zbyAtLT4KLTwhRU5USVRZIGFuZCAgICAgIENEQVRBICImIzg3NDM7IiAtLSBsb2dpY2FsIGFuZCA9IHdlZGdlLCBVKzIyMjcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9yICAgICAgIENEQVRBICImIzg3NDQ7IiAtLSBsb2dpY2FsIG9yID0gdmVlLCBVKzIyMjggSVNPdGVjaCAtLT4KLTwhRU5USVRZIGNhcCAgICAgIENEQVRBICImIzg3NDU7IiAtLSBpbnRlcnNlY3Rpb24gPSBjYXAsIFUrMjIyOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgY3VwICAgICAgQ0RBVEEgIiYjODc0NjsiIC0tIHVuaW9uID0gY3VwLCBVKzIyMkEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGludCAgICAgIENEQVRBICImIzg3NDc7IiAtLSBpbnRlZ3JhbCwgVSsyMjJCIElTT3RlY2ggLS0+Ci08IUVOVElUWSB0aGVyZTQgICBDREFUQSAiJiM4NzU2OyIgLS0gdGhlcmVmb3JlLCBVKzIyMzQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHNpbSAgICAgIENEQVRBICImIzg3NjQ7IiAtLSB0aWxkZSBvcGVyYXRvciA9IHZhcmllcyB3aXRoID0gc2ltaWxhciB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyM0MgSVNPdGVjaCAtLT4KLTwhLS0gdGlsZGUgb3BlcmF0b3IgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyB0aGUgdGlsZGUsIFUrMDA3RSwKLSAgICAgYWx0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCB0byByZXByZXNlbnQgYm90aCAgLS0+Ci08IUVOVElUWSBjb25nICAgICBDREFUQSAiJiM4NzczOyIgLS0gYXBwcm94aW1hdGVseSBlcXVhbCB0bywgVSsyMjQ1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBhc3ltcCAgICBDREFUQSAiJiM4Nzc2OyIgLS0gYWxtb3N0IGVxdWFsIHRvID0gYXN5bXB0b3RpYyB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyNDggSVNPYW1zciAtLT4KLTwhRU5USVRZIG5lICAgICAgIENEQVRBICImIzg4MDA7IiAtLSBub3QgZXF1YWwgdG8sIFUrMjI2MCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZXF1aXYgICAgQ0RBVEEgIiYjODgwMTsiIC0tIGlkZW50aWNhbCB0bywgVSsyMjYxIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsZSAgICAgICBDREFUQSAiJiM4ODA0OyIgLS0gbGVzcy10aGFuIG9yIGVxdWFsIHRvLCBVKzIyNjQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGdlICAgICAgIENEQVRBICImIzg4MDU7IiAtLSBncmVhdGVyLXRoYW4gb3IgZXF1YWwgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjY1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdWIgICAgICBDREFUQSAiJiM4ODM0OyIgLS0gc3Vic2V0IG9mLCBVKzIyODIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cCAgICAgIENEQVRBICImIzg4MzU7IiAtLSBzdXBlcnNldCBvZiwgVSsyMjgzIElTT3RlY2ggLS0+Ci08IS0tIG5vdGUgdGhhdCBuc3VwLCAnbm90IGEgc3VwZXJzZXQgb2YsIFUrMjI4MycgaXMgbm90IGNvdmVyZWQgYnkgdGhlIFN5bWJvbCAKLSAgICAgZm9udCBlbmNvZGluZyBhbmQgaXMgbm90IGluY2x1ZGVkLiBTaG91bGQgaXQgYmUsIGZvciBzeW1tZXRyeT8KLSAgICAgSXQgaXMgaW4gSVNPYW1zbiAgLS0+IAotPCFFTlRJVFkgbnN1YiAgICAgQ0RBVEEgIiYjODgzNjsiIC0tIG5vdCBhIHN1YnNldCBvZiwgVSsyMjg0IElTT2Ftc24gLS0+Ci08IUVOVElUWSBzdWJlICAgICBDREFUQSAiJiM4ODM4OyIgLS0gc3Vic2V0IG9mIG9yIGVxdWFsIHRvLCBVKzIyODYgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cGUgICAgIENEQVRBICImIzg4Mzk7IiAtLSBzdXBlcnNldCBvZiBvciBlcXVhbCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyODcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9wbHVzICAgIENEQVRBICImIzg4NTM7IiAtLSBjaXJjbGVkIHBsdXMgPSBkaXJlY3Qgc3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI5NSBJU09hbXNiIC0tPgotPCFFTlRJVFkgb3RpbWVzICAgQ0RBVEEgIiYjODg1NTsiIC0tIGNpcmNsZWQgdGltZXMgPSB2ZWN0b3IgcHJvZHVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyOTcgSVNPYW1zYiAtLT4KLTwhRU5USVRZIHBlcnAgICAgIENEQVRBICImIzg4Njk7IiAtLSB1cCB0YWNrID0gb3J0aG9nb25hbCB0byA9IHBlcnBlbmRpY3VsYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMkE1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzZG90ICAgICBDREFUQSAiJiM4OTAxOyIgLS0gZG90IG9wZXJhdG9yLCBVKzIyQzUgSVNPYW1zYiAtLT4KLTwhLS0gZG90IG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMEI3IG1pZGRsZSBkb3QgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBUZWNobmljYWwgLS0+Ci08IUVOVElUWSBsY2VpbCAgICBDREFUQSAiJiM4OTY4OyIgLS0gbGVmdCBjZWlsaW5nID0gYXBsIHVwc3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzA4IElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgcmNlaWwgICAgQ0RBVEEgIiYjODk2OTsiIC0tIHJpZ2h0IGNlaWxpbmcsIFUrMjMwOSBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxmbG9vciAgIENEQVRBICImIzg5NzA7IiAtLSBsZWZ0IGZsb29yID0gYXBsIGRvd25zdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMEEgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSByZmxvb3IgICBDREFUQSAiJiM4OTcxOyIgLS0gcmlnaHQgZmxvb3IsIFUrMjMwQiBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxhbmcgICAgIENEQVRBICImIzkwMDE7IiAtLSBsZWZ0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBicmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzI5IElTT3RlY2ggLS0+Ci08IS0tIGxhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0MgJ2xlc3MgdGhhbicgCi0gICAgIG9yIFUrMjAzOSAnc2luZ2xlIGxlZnQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotPCFFTlRJVFkgcmFuZyAgICAgQ0RBVEEgIiYjOTAwMjsiIC0tIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzJBIElTT3RlY2ggLS0+Ci08IS0tIHJhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0UgJ2dyZWF0ZXIgdGhhbicgCi0gICAgIG9yIFUrMjAzQSAnc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrJyAtLT4KLQotPCEtLSBHZW9tZXRyaWMgU2hhcGVzIC0tPgotPCFFTlRJVFkgbG96ICAgICAgQ0RBVEEgIiYjOTY3NDsiIC0tIGxvemVuZ2UsIFUrMjVDQSBJU09wdWIgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBTeW1ib2xzIC0tPgotPCFFTlRJVFkgc3BhZGVzICAgQ0RBVEEgIiYjOTgyNDsiIC0tIGJsYWNrIHNwYWRlIHN1aXQsIFUrMjY2MCBJU09wdWIgLS0+Ci08IS0tIGJsYWNrIGhlcmUgc2VlbXMgdG8gbWVhbiBmaWxsZWQgYXMgb3Bwb3NlZCB0byBob2xsb3cgLS0+Ci08IUVOVElUWSBjbHVicyAgICBDREFUQSAiJiM5ODI3OyIgLS0gYmxhY2sgY2x1YiBzdWl0ID0gc2hhbXJvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyNjYzIElTT3B1YiAtLT4KLTwhRU5USVRZIGhlYXJ0cyAgIENEQVRBICImIzk4Mjk7IiAtLSBibGFjayBoZWFydCBzdWl0ID0gdmFsZW50aW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjY2NSBJU09wdWIgLS0+Ci08IUVOVElUWSBkaWFtcyAgICBDREFUQSAiJiM5ODMwOyIgLS0gYmxhY2sgZGlhbW9uZCBzdWl0LCBVKzI2NjYgSVNPcHViIC0tPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSVNPbGF0MS5lbnQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL0lTT2xhdDEuZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjI1ODk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSVNPbGF0MS5lbnQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPCEtLSAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0gICAgIFRoaXMgaGFzIGJlZW4gZXh0ZW5kZWQgZm9yIHVzZSB3aXRoIEhUTUwgdG8gY292ZXIgdGhlIGZ1bGwKLSAgICAgc2V0IG9mIGNvZGVzIGluIHRoZSByYW5nZSAxNjAtMjU1IGRlY2ltYWwuCi0tLT4KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBJU09sYXQxIFBVQkxJQwotICAgICAgICJJU08gODg3OS0xOTg2Ly9FTlRJVElFUyBBZGRlZCBMYXRpbiAxLy9FTi8vSFRNTCI+Ci0gICAgICVJU09sYXQxOwotLS0+Ci08IUVOVElUWSBuYnNwICAgQ0RBVEEgIiYjMTYwOyIgLS0gbm8tYnJlYWsgc3BhY2UgLS0+Ci08IUVOVElUWSBpZXhjbCAgQ0RBVEEgIiYjMTYxOyIgLS0gaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyayAtLT4KLTwhRU5USVRZIGNlbnQgICBDREFUQSAiJiMxNjI7IiAtLSBjZW50IHNpZ24gLS0+Ci08IUVOVElUWSBwb3VuZCAgQ0RBVEEgIiYjMTYzOyIgLS0gcG91bmQgc3Rlcmxpbmcgc2lnbiAtLT4KLTwhRU5USVRZIGN1cnJlbiBDREFUQSAiJiMxNjQ7IiAtLSBnZW5lcmFsIGN1cnJlbmN5IHNpZ24gLS0+Ci08IUVOVElUWSB5ZW4gICAgQ0RBVEEgIiYjMTY1OyIgLS0geWVuIHNpZ24gLS0+Ci08IUVOVElUWSBicnZiYXIgQ0RBVEEgIiYjMTY2OyIgLS0gYnJva2VuICh2ZXJ0aWNhbCkgYmFyIC0tPgotPCFFTlRJVFkgc2VjdCAgIENEQVRBICImIzE2NzsiIC0tIHNlY3Rpb24gc2lnbiAtLT4KLTwhRU5USVRZIHVtbCAgICBDREFUQSAiJiMxNjg7IiAtLSB1bWxhdXQgKGRpZXJlc2lzKSAtLT4KLTwhRU5USVRZIGNvcHkgICBDREFUQSAiJiMxNjk7IiAtLSBjb3B5cmlnaHQgc2lnbiAtLT4KLTwhRU5USVRZIG9yZGYgICBDREFUQSAiJiMxNzA7IiAtLSBvcmRpbmFsIGluZGljYXRvciwgZmVtaW5pbmUgLS0+Ci08IUVOVElUWSBsYXF1byAgQ0RBVEEgIiYjMTcxOyIgLS0gYW5nbGUgcXVvdGF0aW9uIG1hcmssIGxlZnQgLS0+Ci08IUVOVElUWSBub3QgICAgQ0RBVEEgIiYjMTcyOyIgLS0gbm90IHNpZ24gLS0+Ci08IUVOVElUWSBzaHkgICAgQ0RBVEEgIiYjMTczOyIgLS0gc29mdCBoeXBoZW4gLS0+Ci08IUVOVElUWSByZWcgICAgQ0RBVEEgIiYjMTc0OyIgLS0gcmVnaXN0ZXJlZCBzaWduIC0tPgotPCFFTlRJVFkgbWFjciAgIENEQVRBICImIzE3NTsiIC0tIG1hY3JvbiAtLT4KLTwhRU5USVRZIGRlZyAgICBDREFUQSAiJiMxNzY7IiAtLSBkZWdyZWUgc2lnbiAtLT4KLTwhRU5USVRZIHBsdXNtbiBDREFUQSAiJiMxNzc7IiAtLSBwbHVzLW9yLW1pbnVzIHNpZ24gLS0+Ci08IUVOVElUWSBzdXAyICAgQ0RBVEEgIiYjMTc4OyIgLS0gc3VwZXJzY3JpcHQgdHdvIC0tPgotPCFFTlRJVFkgc3VwMyAgIENEQVRBICImIzE3OTsiIC0tIHN1cGVyc2NyaXB0IHRocmVlIC0tPgotPCFFTlRJVFkgYWN1dGUgIENEQVRBICImIzE4MDsiIC0tIGFjdXRlIGFjY2VudCAtLT4KLTwhRU5USVRZIG1pY3JvICBDREFUQSAiJiMxODE7IiAtLSBtaWNybyBzaWduIC0tPgotPCFFTlRJVFkgcGFyYSAgIENEQVRBICImIzE4MjsiIC0tIHBpbGNyb3cgKHBhcmFncmFwaCBzaWduKSAtLT4KLTwhRU5USVRZIG1pZGRvdCBDREFUQSAiJiMxODM7IiAtLSBtaWRkbGUgZG90IC0tPgotPCFFTlRJVFkgY2VkaWwgIENEQVRBICImIzE4NDsiIC0tIGNlZGlsbGEgLS0+Ci08IUVOVElUWSBzdXAxICAgQ0RBVEEgIiYjMTg1OyIgLS0gc3VwZXJzY3JpcHQgb25lIC0tPgotPCFFTlRJVFkgb3JkbSAgIENEQVRBICImIzE4NjsiIC0tIG9yZGluYWwgaW5kaWNhdG9yLCBtYXNjdWxpbmUgLS0+Ci08IUVOVElUWSByYXF1byAgQ0RBVEEgIiYjMTg3OyIgLS0gYW5nbGUgcXVvdGF0aW9uIG1hcmssIHJpZ2h0IC0tPgotPCFFTlRJVFkgZnJhYzE0IENEQVRBICImIzE4ODsiIC0tIGZyYWN0aW9uIG9uZS1xdWFydGVyIC0tPgotPCFFTlRJVFkgZnJhYzEyIENEQVRBICImIzE4OTsiIC0tIGZyYWN0aW9uIG9uZS1oYWxmIC0tPgotPCFFTlRJVFkgZnJhYzM0IENEQVRBICImIzE5MDsiIC0tIGZyYWN0aW9uIHRocmVlLXF1YXJ0ZXJzIC0tPgotPCFFTlRJVFkgaXF1ZXN0IENEQVRBICImIzE5MTsiIC0tIGludmVydGVkIHF1ZXN0aW9uIG1hcmsgLS0+Ci08IUVOVElUWSBBZ3JhdmUgQ0RBVEEgIiYjMTkyOyIgLS0gY2FwaXRhbCBBLCBncmF2ZSBhY2NlbnQgLS0+Ci08IUVOVElUWSBBYWN1dGUgQ0RBVEEgIiYjMTkzOyIgLS0gY2FwaXRhbCBBLCBhY3V0ZSBhY2NlbnQgLS0+Ci08IUVOVElUWSBBY2lyYyAgQ0RBVEEgIiYjMTk0OyIgLS0gY2FwaXRhbCBBLCBjaXJjdW1mbGV4IGFjY2VudCAtLT4KLTwhRU5USVRZIEF0aWxkZSBDREFUQSAiJiMxOTU7IiAtLSBjYXBpdGFsIEEsIHRpbGRlIC0tPgotPCFFTlRJVFkgQXVtbCAgIENEQVRBICImIzE5NjsiIC0tIGNhcGl0YWwgQSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+Ci08IUVOVElUWSBBcmluZyAgQ0RBVEEgIiYjMTk3OyIgLS0gY2FwaXRhbCBBLCByaW5nIC0tPgotPCFFTlRJVFkgQUVsaWcgIENEQVRBICImIzE5ODsiIC0tIGNhcGl0YWwgQUUgZGlwaHRob25nIChsaWdhdHVyZSkgLS0+Ci08IUVOVElUWSBDY2VkaWwgQ0RBVEEgIiYjMTk5OyIgLS0gY2FwaXRhbCBDLCBjZWRpbGxhIC0tPgotPCFFTlRJVFkgRWdyYXZlIENEQVRBICImIzIwMDsiIC0tIGNhcGl0YWwgRSwgZ3JhdmUgYWNjZW50IC0tPgotPCFFTlRJVFkgRWFjdXRlIENEQVRBICImIzIwMTsiIC0tIGNhcGl0YWwgRSwgYWN1dGUgYWNjZW50IC0tPgotPCFFTlRJVFkgRWNpcmMgIENEQVRBICImIzIwMjsiIC0tIGNhcGl0YWwgRSwgY2lyY3VtZmxleCBhY2NlbnQgLS0+Ci08IUVOVElUWSBFdW1sICAgQ0RBVEEgIiYjMjAzOyIgLS0gY2FwaXRhbCBFLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyayAtLT4KLTwhRU5USVRZIElncmF2ZSBDREFUQSAiJiMyMDQ7IiAtLSBjYXBpdGFsIEksIGdyYXZlIGFjY2VudCAtLT4KLTwhRU5USVRZIElhY3V0ZSBDREFUQSAiJiMyMDU7IiAtLSBjYXBpdGFsIEksIGFjdXRlIGFjY2VudCAtLT4KLTwhRU5USVRZIEljaXJjICBDREFUQSAiJiMyMDY7IiAtLSBjYXBpdGFsIEksIGNpcmN1bWZsZXggYWNjZW50IC0tPgotPCFFTlRJVFkgSXVtbCAgIENEQVRBICImIzIwNzsiIC0tIGNhcGl0YWwgSSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+Ci08IUVOVElUWSBFVEggICAgQ0RBVEEgIiYjMjA4OyIgLS0gY2FwaXRhbCBFdGgsIEljZWxhbmRpYyAtLT4KLTwhRU5USVRZIE50aWxkZSBDREFUQSAiJiMyMDk7IiAtLSBjYXBpdGFsIE4sIHRpbGRlIC0tPgotPCFFTlRJVFkgT2dyYXZlIENEQVRBICImIzIxMDsiIC0tIGNhcGl0YWwgTywgZ3JhdmUgYWNjZW50IC0tPgotPCFFTlRJVFkgT2FjdXRlIENEQVRBICImIzIxMTsiIC0tIGNhcGl0YWwgTywgYWN1dGUgYWNjZW50IC0tPgotPCFFTlRJVFkgT2NpcmMgIENEQVRBICImIzIxMjsiIC0tIGNhcGl0YWwgTywgY2lyY3VtZmxleCBhY2NlbnQgLS0+Ci08IUVOVElUWSBPdGlsZGUgQ0RBVEEgIiYjMjEzOyIgLS0gY2FwaXRhbCBPLCB0aWxkZSAtLT4KLTwhRU5USVRZIE91bWwgICBDREFUQSAiJiMyMTQ7IiAtLSBjYXBpdGFsIE8sIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrIC0tPgotPCFFTlRJVFkgdGltZXMgIENEQVRBICImIzIxNTsiIC0tIG11bHRpcGx5IHNpZ24gLS0+Ci08IUVOVElUWSBPc2xhc2ggQ0RBVEEgIiYjMjE2OyIgLS0gY2FwaXRhbCBPLCBzbGFzaCAtLT4KLTwhRU5USVRZIFVncmF2ZSBDREFUQSAiJiMyMTc7IiAtLSBjYXBpdGFsIFUsIGdyYXZlIGFjY2VudCAtLT4KLTwhRU5USVRZIFVhY3V0ZSBDREFUQSAiJiMyMTg7IiAtLSBjYXBpdGFsIFUsIGFjdXRlIGFjY2VudCAtLT4KLTwhRU5USVRZIFVjaXJjICBDREFUQSAiJiMyMTk7IiAtLSBjYXBpdGFsIFUsIGNpcmN1bWZsZXggYWNjZW50IC0tPgotPCFFTlRJVFkgVXVtbCAgIENEQVRBICImIzIyMDsiIC0tIGNhcGl0YWwgVSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+Ci08IUVOVElUWSBZYWN1dGUgQ0RBVEEgIiYjMjIxOyIgLS0gY2FwaXRhbCBZLCBhY3V0ZSBhY2NlbnQgLS0+Ci08IUVOVElUWSBUSE9STiAgQ0RBVEEgIiYjMjIyOyIgLS0gY2FwaXRhbCBUSE9STiwgSWNlbGFuZGljIC0tPgotPCFFTlRJVFkgc3psaWcgIENEQVRBICImIzIyMzsiIC0tIHNtYWxsIHNoYXJwIHMsIEdlcm1hbiAoc3ogbGlnYXR1cmUpIC0tPgotPCFFTlRJVFkgYWdyYXZlIENEQVRBICImIzIyNDsiIC0tIHNtYWxsIGEsIGdyYXZlIGFjY2VudCAtLT4KLTwhRU5USVRZIGFhY3V0ZSBDREFUQSAiJiMyMjU7IiAtLSBzbWFsbCBhLCBhY3V0ZSBhY2NlbnQgLS0+Ci08IUVOVElUWSBhY2lyYyAgQ0RBVEEgIiYjMjI2OyIgLS0gc21hbGwgYSwgY2lyY3VtZmxleCBhY2NlbnQgLS0+Ci08IUVOVElUWSBhdGlsZGUgQ0RBVEEgIiYjMjI3OyIgLS0gc21hbGwgYSwgdGlsZGUgLS0+Ci08IUVOVElUWSBhdW1sICAgQ0RBVEEgIiYjMjI4OyIgLS0gc21hbGwgYSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+Ci08IUVOVElUWSBhcmluZyAgQ0RBVEEgIiYjMjI5OyIgLS0gc21hbGwgYSwgcmluZyAtLT4KLTwhRU5USVRZIGFlbGlnICBDREFUQSAiJiMyMzA7IiAtLSBzbWFsbCBhZSBkaXBodGhvbmcgKGxpZ2F0dXJlKSAtLT4KLTwhRU5USVRZIGNjZWRpbCBDREFUQSAiJiMyMzE7IiAtLSBzbWFsbCBjLCBjZWRpbGxhIC0tPgotPCFFTlRJVFkgZWdyYXZlIENEQVRBICImIzIzMjsiIC0tIHNtYWxsIGUsIGdyYXZlIGFjY2VudCAtLT4KLTwhRU5USVRZIGVhY3V0ZSBDREFUQSAiJiMyMzM7IiAtLSBzbWFsbCBlLCBhY3V0ZSBhY2NlbnQgLS0+Ci08IUVOVElUWSBlY2lyYyAgQ0RBVEEgIiYjMjM0OyIgLS0gc21hbGwgZSwgY2lyY3VtZmxleCBhY2NlbnQgLS0+Ci08IUVOVElUWSBldW1sICAgQ0RBVEEgIiYjMjM1OyIgLS0gc21hbGwgZSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+Ci08IUVOVElUWSBpZ3JhdmUgQ0RBVEEgIiYjMjM2OyIgLS0gc21hbGwgaSwgZ3JhdmUgYWNjZW50IC0tPgotPCFFTlRJVFkgaWFjdXRlIENEQVRBICImIzIzNzsiIC0tIHNtYWxsIGksIGFjdXRlIGFjY2VudCAtLT4KLTwhRU5USVRZIGljaXJjICBDREFUQSAiJiMyMzg7IiAtLSBzbWFsbCBpLCBjaXJjdW1mbGV4IGFjY2VudCAtLT4KLTwhRU5USVRZIGl1bWwgICBDREFUQSAiJiMyMzk7IiAtLSBzbWFsbCBpLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyayAtLT4KLTwhRU5USVRZIGV0aCAgICBDREFUQSAiJiMyNDA7IiAtLSBzbWFsbCBldGgsIEljZWxhbmRpYyAtLT4KLTwhRU5USVRZIG50aWxkZSBDREFUQSAiJiMyNDE7IiAtLSBzbWFsbCBuLCB0aWxkZSAtLT4KLTwhRU5USVRZIG9ncmF2ZSBDREFUQSAiJiMyNDI7IiAtLSBzbWFsbCBvLCBncmF2ZSBhY2NlbnQgLS0+Ci08IUVOVElUWSBvYWN1dGUgQ0RBVEEgIiYjMjQzOyIgLS0gc21hbGwgbywgYWN1dGUgYWNjZW50IC0tPgotPCFFTlRJVFkgb2NpcmMgIENEQVRBICImIzI0NDsiIC0tIHNtYWxsIG8sIGNpcmN1bWZsZXggYWNjZW50IC0tPgotPCFFTlRJVFkgb3RpbGRlIENEQVRBICImIzI0NTsiIC0tIHNtYWxsIG8sIHRpbGRlIC0tPgotPCFFTlRJVFkgb3VtbCAgIENEQVRBICImIzI0NjsiIC0tIHNtYWxsIG8sIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrIC0tPgotPCFFTlRJVFkgZGl2aWRlIENEQVRBICImIzI0NzsiIC0tIGRpdmlkZSBzaWduIC0tPgotPCFFTlRJVFkgb3NsYXNoIENEQVRBICImIzI0ODsiIC0tIHNtYWxsIG8sIHNsYXNoIC0tPgotPCFFTlRJVFkgdWdyYXZlIENEQVRBICImIzI0OTsiIC0tIHNtYWxsIHUsIGdyYXZlIGFjY2VudCAtLT4KLTwhRU5USVRZIHVhY3V0ZSBDREFUQSAiJiMyNTA7IiAtLSBzbWFsbCB1LCBhY3V0ZSBhY2NlbnQgLS0+Ci08IUVOVElUWSB1Y2lyYyAgQ0RBVEEgIiYjMjUxOyIgLS0gc21hbGwgdSwgY2lyY3VtZmxleCBhY2NlbnQgLS0+Ci08IUVOVElUWSB1dW1sICAgQ0RBVEEgIiYjMjUyOyIgLS0gc21hbGwgdSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+Ci08IUVOVElUWSB5YWN1dGUgQ0RBVEEgIiYjMjUzOyIgLS0gc21hbGwgeSwgYWN1dGUgYWNjZW50IC0tPgotPCFFTlRJVFkgdGhvcm4gIENEQVRBICImIzI1NDsiIC0tIHNtYWxsIHRob3JuLCBJY2VsYW5kaWMgLS0+Ci08IUVOVElUWSB5dW1sICAgQ0RBVEEgIiYjMjU1OyIgLS0gc21hbGwgeSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL0lTT2xhdDEuc2dtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSVNPbGF0MS5zZ21sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjczODI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvSVNPbGF0MS5zZ21sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCEtLSAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2DQotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgNCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbg0KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuDQotLS0+DQotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOg0KLSAgICAgPCFFTlRJVFkgJSBJU09sYXQxIFBVQkxJQw0KLSAgICAgICAiSVNPIDg4NzktMTk4Ni8vRU5USVRJRVMgQWRkZWQgTGF0aW4gMS8vRU4vL0hUTUwiPg0KLSAgICAgJUlTT2xhdDE7DQotLS0+DQotPCEtLSAgICBNb2RpZmllZCBmb3IgdXNlIGluIEhUTUwgICAgICAgIA0KLSRJZDogSVNPbGF0MS5zZ21sLHYgMS4yIDE5OTQvMTEvMzAgMjM6NDU6MTIgY29ubm9sbHkgRXhwICQgLS0+DQotPCFFTlRJVFkgQUVsaWcgIENEQVRBICImIzE5ODsiIC0tIGNhcGl0YWwgQUUgZGlwaHRob25nIChsaWdhdHVyZSkgLS0+DQotPCFFTlRJVFkgQWFjdXRlIENEQVRBICImIzE5MzsiIC0tIGNhcGl0YWwgQSwgYWN1dGUgYWNjZW50IC0tPg0KLTwhRU5USVRZIEFjaXJjICBDREFUQSAiJiMxOTQ7IiAtLSBjYXBpdGFsIEEsIGNpcmN1bWZsZXggYWNjZW50IC0tPg0KLTwhRU5USVRZIEFncmF2ZSBDREFUQSAiJiMxOTI7IiAtLSBjYXBpdGFsIEEsIGdyYXZlIGFjY2VudCAtLT4NCi08IUVOVElUWSBBcmluZyAgQ0RBVEEgIiYjMTk3OyIgLS0gY2FwaXRhbCBBLCByaW5nIC0tPg0KLTwhRU5USVRZIEF0aWxkZSBDREFUQSAiJiMxOTU7IiAtLSBjYXBpdGFsIEEsIHRpbGRlIC0tPg0KLTwhRU5USVRZIEF1bWwgICBDREFUQSAiJiMxOTY7IiAtLSBjYXBpdGFsIEEsIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrIC0tPg0KLTwhRU5USVRZIENjZWRpbCBDREFUQSAiJiMxOTk7IiAtLSBjYXBpdGFsIEMsIGNlZGlsbGEgLS0+DQotPCFFTlRJVFkgRVRIICAgIENEQVRBICImIzIwODsiIC0tIGNhcGl0YWwgRXRoLCBJY2VsYW5kaWMgLS0+DQotPCFFTlRJVFkgRWFjdXRlIENEQVRBICImIzIwMTsiIC0tIGNhcGl0YWwgRSwgYWN1dGUgYWNjZW50IC0tPg0KLTwhRU5USVRZIEVjaXJjICBDREFUQSAiJiMyMDI7IiAtLSBjYXBpdGFsIEUsIGNpcmN1bWZsZXggYWNjZW50IC0tPg0KLTwhRU5USVRZIEVncmF2ZSBDREFUQSAiJiMyMDA7IiAtLSBjYXBpdGFsIEUsIGdyYXZlIGFjY2VudCAtLT4NCi08IUVOVElUWSBFdW1sICAgQ0RBVEEgIiYjMjAzOyIgLS0gY2FwaXRhbCBFLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyayAtLT4NCi08IUVOVElUWSBJYWN1dGUgQ0RBVEEgIiYjMjA1OyIgLS0gY2FwaXRhbCBJLCBhY3V0ZSBhY2NlbnQgLS0+DQotPCFFTlRJVFkgSWNpcmMgIENEQVRBICImIzIwNjsiIC0tIGNhcGl0YWwgSSwgY2lyY3VtZmxleCBhY2NlbnQgLS0+DQotPCFFTlRJVFkgSWdyYXZlIENEQVRBICImIzIwNDsiIC0tIGNhcGl0YWwgSSwgZ3JhdmUgYWNjZW50IC0tPg0KLTwhRU5USVRZIEl1bWwgICBDREFUQSAiJiMyMDc7IiAtLSBjYXBpdGFsIEksIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrIC0tPg0KLTwhRU5USVRZIE50aWxkZSBDREFUQSAiJiMyMDk7IiAtLSBjYXBpdGFsIE4sIHRpbGRlIC0tPg0KLTwhRU5USVRZIE9hY3V0ZSBDREFUQSAiJiMyMTE7IiAtLSBjYXBpdGFsIE8sIGFjdXRlIGFjY2VudCAtLT4NCi08IUVOVElUWSBPY2lyYyAgQ0RBVEEgIiYjMjEyOyIgLS0gY2FwaXRhbCBPLCBjaXJjdW1mbGV4IGFjY2VudCAtLT4NCi08IUVOVElUWSBPZ3JhdmUgQ0RBVEEgIiYjMjEwOyIgLS0gY2FwaXRhbCBPLCBncmF2ZSBhY2NlbnQgLS0+DQotPCFFTlRJVFkgT3NsYXNoIENEQVRBICImIzIxNjsiIC0tIGNhcGl0YWwgTywgc2xhc2ggLS0+DQotPCFFTlRJVFkgT3RpbGRlIENEQVRBICImIzIxMzsiIC0tIGNhcGl0YWwgTywgdGlsZGUgLS0+DQotPCFFTlRJVFkgT3VtbCAgIENEQVRBICImIzIxNDsiIC0tIGNhcGl0YWwgTywgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+DQotPCFFTlRJVFkgVEhPUk4gIENEQVRBICImIzIyMjsiIC0tIGNhcGl0YWwgVEhPUk4sIEljZWxhbmRpYyAtLT4NCi08IUVOVElUWSBVYWN1dGUgQ0RBVEEgIiYjMjE4OyIgLS0gY2FwaXRhbCBVLCBhY3V0ZSBhY2NlbnQgLS0+DQotPCFFTlRJVFkgVWNpcmMgIENEQVRBICImIzIxOTsiIC0tIGNhcGl0YWwgVSwgY2lyY3VtZmxleCBhY2NlbnQgLS0+DQotPCFFTlRJVFkgVWdyYXZlIENEQVRBICImIzIxNzsiIC0tIGNhcGl0YWwgVSwgZ3JhdmUgYWNjZW50IC0tPg0KLTwhRU5USVRZIFV1bWwgICBDREFUQSAiJiMyMjA7IiAtLSBjYXBpdGFsIFUsIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrIC0tPg0KLTwhRU5USVRZIFlhY3V0ZSBDREFUQSAiJiMyMjE7IiAtLSBjYXBpdGFsIFksIGFjdXRlIGFjY2VudCAtLT4NCi08IUVOVElUWSBhYWN1dGUgQ0RBVEEgIiYjMjI1OyIgLS0gc21hbGwgYSwgYWN1dGUgYWNjZW50IC0tPg0KLTwhRU5USVRZIGFjaXJjICBDREFUQSAiJiMyMjY7IiAtLSBzbWFsbCBhLCBjaXJjdW1mbGV4IGFjY2VudCAtLT4NCi08IUVOVElUWSBhZWxpZyAgQ0RBVEEgIiYjMjMwOyIgLS0gc21hbGwgYWUgZGlwaHRob25nIChsaWdhdHVyZSkgLS0+DQotPCFFTlRJVFkgYWdyYXZlIENEQVRBICImIzIyNDsiIC0tIHNtYWxsIGEsIGdyYXZlIGFjY2VudCAtLT4NCi08IUVOVElUWSBhcmluZyAgQ0RBVEEgIiYjMjI5OyIgLS0gc21hbGwgYSwgcmluZyAtLT4NCi08IUVOVElUWSBhdGlsZGUgQ0RBVEEgIiYjMjI3OyIgLS0gc21hbGwgYSwgdGlsZGUgLS0+DQotPCFFTlRJVFkgYXVtbCAgIENEQVRBICImIzIyODsiIC0tIHNtYWxsIGEsIGRpZXJlc2lzIG9yIHVtbGF1dCBtYXJrIC0tPg0KLTwhRU5USVRZIGNjZWRpbCBDREFUQSAiJiMyMzE7IiAtLSBzbWFsbCBjLCBjZWRpbGxhIC0tPg0KLTwhRU5USVRZIGVhY3V0ZSBDREFUQSAiJiMyMzM7IiAtLSBzbWFsbCBlLCBhY3V0ZSBhY2NlbnQgLS0+DQotPCFFTlRJVFkgZWNpcmMgIENEQVRBICImIzIzNDsiIC0tIHNtYWxsIGUsIGNpcmN1bWZsZXggYWNjZW50IC0tPg0KLTwhRU5USVRZIGVncmF2ZSBDREFUQSAiJiMyMzI7IiAtLSBzbWFsbCBlLCBncmF2ZSBhY2NlbnQgLS0+DQotPCFFTlRJVFkgZXRoICAgIENEQVRBICImIzI0MDsiIC0tIHNtYWxsIGV0aCwgSWNlbGFuZGljIC0tPg0KLTwhRU5USVRZIGV1bWwgICBDREFUQSAiJiMyMzU7IiAtLSBzbWFsbCBlLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyayAtLT4NCi08IUVOVElUWSBpYWN1dGUgQ0RBVEEgIiYjMjM3OyIgLS0gc21hbGwgaSwgYWN1dGUgYWNjZW50IC0tPg0KLTwhRU5USVRZIGljaXJjICBDREFUQSAiJiMyMzg7IiAtLSBzbWFsbCBpLCBjaXJjdW1mbGV4IGFjY2VudCAtLT4NCi08IUVOVElUWSBpZ3JhdmUgQ0RBVEEgIiYjMjM2OyIgLS0gc21hbGwgaSwgZ3JhdmUgYWNjZW50IC0tPg0KLTwhRU5USVRZIGl1bWwgICBDREFUQSAiJiMyMzk7IiAtLSBzbWFsbCBpLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyayAtLT4NCi08IUVOVElUWSBudGlsZGUgQ0RBVEEgIiYjMjQxOyIgLS0gc21hbGwgbiwgdGlsZGUgLS0+DQotPCFFTlRJVFkgb2FjdXRlIENEQVRBICImIzI0MzsiIC0tIHNtYWxsIG8sIGFjdXRlIGFjY2VudCAtLT4NCi08IUVOVElUWSBvY2lyYyAgQ0RBVEEgIiYjMjQ0OyIgLS0gc21hbGwgbywgY2lyY3VtZmxleCBhY2NlbnQgLS0+DQotPCFFTlRJVFkgb2dyYXZlIENEQVRBICImIzI0MjsiIC0tIHNtYWxsIG8sIGdyYXZlIGFjY2VudCAtLT4NCi08IUVOVElUWSBvc2xhc2ggQ0RBVEEgIiYjMjQ4OyIgLS0gc21hbGwgbywgc2xhc2ggLS0+DQotPCFFTlRJVFkgb3RpbGRlIENEQVRBICImIzI0NTsiIC0tIHNtYWxsIG8sIHRpbGRlIC0tPg0KLTwhRU5USVRZIG91bWwgICBDREFUQSAiJiMyNDY7IiAtLSBzbWFsbCBvLCBkaWVyZXNpcyBvciB1bWxhdXQgbWFyayAtLT4NCi08IUVOVElUWSBzemxpZyAgQ0RBVEEgIiYjMjIzOyIgLS0gc21hbGwgc2hhcnAgcywgR2VybWFuIChzeiBsaWdhdHVyZSkgLS0+DQotPCFFTlRJVFkgdGhvcm4gIENEQVRBICImIzI1NDsiIC0tIHNtYWxsIHRob3JuLCBJY2VsYW5kaWMgLS0+DQotPCFFTlRJVFkgdWFjdXRlIENEQVRBICImIzI1MDsiIC0tIHNtYWxsIHUsIGFjdXRlIGFjY2VudCAtLT4NCi08IUVOVElUWSB1Y2lyYyAgQ0RBVEEgIiYjMjUxOyIgLS0gc21hbGwgdSwgY2lyY3VtZmxleCBhY2NlbnQgLS0+DQotPCFFTlRJVFkgdWdyYXZlIENEQVRBICImIzI0OTsiIC0tIHNtYWxsIHUsIGdyYXZlIGFjY2VudCAtLT4NCi08IUVOVElUWSB1dW1sICAgQ0RBVEEgIiYjMjUyOyIgLS0gc21hbGwgdSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+DQotPCFFTlRJVFkgeWFjdXRlIENEQVRBICImIzI1MzsiIC0tIHNtYWxsIHksIGFjdXRlIGFjY2VudCAtLT4NCi08IUVOVElUWSB5dW1sICAgQ0RBVEEgIiYjMjU1OyIgLS0gc21hbGwgeSwgZGllcmVzaXMgb3IgdW1sYXV0IG1hcmsgLS0+DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9jb21wYWN0LmR0ZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvY29tcGFjdC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MmI1MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9jb21wYWN0LmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi08IS0tIENvbXBhY3QgSFRNTCBEb2N1bWVudCBUeXBlIERlZmluaXRpb24gLS0+Ci0KLTwhLS0KLSAgICAgICAgRGF0ZTogVHVlc2RheSBOb3ZlbWJlciAyNXRoIDE5OTcKLSAgICAgICAgQXV0aG9yOiBUb21paGlzYSBLYW1hZGEgPHRvbXlAYWNjZXNzLmNvLmpwPgotLS0+Ci0KLTwhRU5USVRZICUgSFRNTC5WZXJzaW9uCi0gICAgICAgICItLy9XM0MvL0RURCBDb21wYWN0IEhUTUwgMS4wIERyYWZ0Ly9FTiIKLSAgICAgICAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IERlcHJlY2F0ZWQgRmVhdHVyZXMgU3dpdGNoID09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBIVE1MLkRlcHJlY2F0ZWQgIklOQ0xVREUiPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEltcG9ydGVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBDb250ZW50LVR5cGUgIkNEQVRBIj4KLQotPCFFTlRJVFkgJSBIVFRQLU1ldGhvZCAiR0VUIHwgUE9TVCI+Ci0KLTwhRU5USVRZICUgVVJMICJDREFUQSI+Ci0KLTwhLS0gUGFyYW1ldGVyIEVudGl0aWVzIC0tPgotCi08IUVOVElUWSAlIGhlYWRpbmcgIkgxfEgyfEgzfEg0fEg1fEg2Ij4KLQotPCFFTlRJVFkgJSBsaXN0ICJVTCB8IE9MIHwgIERJUiB8IE1FTlUiPgotCi08IUVOVElUWSAlIHByZWZvcm1hdHRlZCAiUFJFIj4KLQotPCEtLT09PT09PT09PT09PT09PT0gQ2hhcmFjdGVyIG1uZW1vbmljIGVudGl0aWVzID09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgSVNPbGF0MSBQVUJMSUMKLSAgICAgICAiSVNPIDg4NzktMTk4Ni8vRU5USVRJRVMgQWRkZWQgTGF0aW4gMS8vRU4vL0hUTUwiPgotCi0lSVNPbGF0MTsKLQotPCEtLT09PT09PT09PT09PT09PT0gRW50aXRpZXMgZm9yIHNwZWNpYWwgc3ltYm9scyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZIGFtcCAgICBDREFUQSAiJiIgIC0tIGFtcGVyc2FuZCAgICAtLT4KLTwhRU5USVRZIGd0ICAgICBDREFUQSAiPiIgIC0tIGdyZWF0ZXIgdGhhbiAtLT4KLTwhRU5USVRZIGx0ICAgICBDREFUQSAiPCIgIC0tIGxlc3MgdGhhbiAgICAtLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gVGV4dCBNYXJrdXAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgcGhyYXNlICJERk4iPgotCi08IUVOVElUWSAlIHNwZWNpYWwgIkEgfCBJTUcgfCBCUiAiPgotCi08IUVOVElUWSAlIGZvcm0gIklOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEiPgotCi08IUVOVElUWSAlIHRleHQgIiNQQ0RBVEEgfCAlcGhyYXNlIHwgJXNwZWNpYWwgfCAlZm9ybSI+Ci0KLTwhRUxFTUVOVCAoJXBocmFzZSkgLSAtICgldGV4dCkqPgotCi08IUVMRU1FTlQgQlIgICAgLSBPIEVNUFRZPgotPCFBVFRMSVNUIEJSCi0gICAgICAgIGNsZWFyIChsZWZ0fGFsbHxyaWdodHxub25lKSBub25lIAotICAgICAgICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSFRNTCBjb250ZW50IG1vZGVscyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGJsb2NrCi0gICAgICJQIHwgJWxpc3QgfCAlcHJlZm9ybWF0dGVkIHwgREwgfCBESVYgfCBDRU5URVIgfAotICAgICAgQkxPQ0tRVU9URSB8IEZPUk0gfCBIUiAiPgotCi08IUVOVElUWSAlIGZsb3cgIigldGV4dCB8ICVibG9jaykqIj4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgYm9keS5jb250ZW50ICIoJWhlYWRpbmcgfCAldGV4dCB8ICVibG9jayApKiI+Ci0KLTwhRUxFTUVOVCBCT0RZIE8gTyAlYm9keS5jb250ZW50PgotCi08IUVMRU1FTlQgRElWIC0gLSAlYm9keS5jb250ZW50PgotPCFBVFRMSVNUIERJVgotICAgICAgICBhbGlnbiAgIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQKLSAgICAgICAgPgotCi08IUVMRU1FTlQgY2VudGVyIC0gLSAlYm9keS5jb250ZW50PgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBBbmNob3IgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEEgLSAtICgldGV4dCkqIC0oQSk+Ci08IUFUVExJU1QgQQotICAgICAgICBuYW1lICAgIENEQVRBICAgI0lNUExJRUQKLSAgICAgICAgaHJlZiAgICAlVVJMICAgICNJTVBMSUVECi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW1hZ2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgTGVuZ3RoICJDREFUQSI+Ci08IUVOVElUWSAlIFBpeGVscyAiTlVNQkVSIj4KLQotPCFFTlRJVFkgJSBJQWxpZ24gIih0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhRUxFTUVOVCBJTUcgICAgLSBPIEVNUFRZPgotPCFBVFRMSVNUIElNRwotICAgICAgICBzcmMgICAgICVVUkwgICAgICNSRVFVSVJFRAotICAgICAgICBhbGlnbiAgICVJQWxpZ24gICNJTVBMSUVECi0gICAgICAgIHdpZHRoICAgJVBpeGVscyAgI0lNUExJRUQKLSAgICAgICAgaGVpZ2h0ICAlUGl4ZWxzICAjSU1QTElFRAotICAgICAgICBoc3BhY2UgICVQaXhlbHMgICNJTVBMSUVECi0gICAgICAgIHZzcGFjZSAgJVBpeGVscyAgI0lNUExJRUQKLSAgICAgICAgYWx0ICAgICBDREFUQSAgICAjSU1QTElFRAotICAgICAgICBib3JkZXIgICVQaXhlbHMgICNJTVBMSUVECi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBIUiAgICAtIE8gRU1QVFk+Ci08IUFUVExJU1QgSFIKLSAgICAgICAgYWxpZ24gKGxlZnR8cmlnaHR8Y2VudGVyKSAjSU1QTElFRAotICAgICAgICBzaXplICAlUGl4ZWxzICNJTVBMSUVECi0gICAgICAgIHdpZHRoICVMZW5ndGggI0lNUExJRUQKLSAgICAgICAgbm9zaGFkZSAobm9zaGFkZSkgI0lNUExJRUQKLSAgICAgICAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQYXJhZ3JhcGhzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIFAgICAgIC0gTyAoJXRleHQpKj4KLTwhQVRUTElTVCBQCi0gICAgICAgIGFsaWduICAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVECi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSGVhZGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCAoICVoZWFkaW5nICkgIC0gLSAgKCV0ZXh0OykqPgotPCFBVFRMSVNUICggJWhlYWRpbmcgKQotICAgICAgICBhbGlnbiAgKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRAotICAgICAgICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIHByZS5leGNsdXNpb24gIklNRyI+Ci0KLTwhRUxFTUVOVCBQUkUgLSAtICgldGV4dCkqIC0oJXByZS5leGNsdXNpb24pPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBCbG9jay1saWtlIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEJMT0NLUVVPVEUgLSAtICVib2R5LmNvbnRlbnQ+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IExpc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgREwgLSAtICAoRFR8REQpKz4KLTwhRUxFTUVOVCBEVCAtIE8gICgldGV4dCkqPgotPCFFTEVNRU5UIEREIC0gTyAgJWZsb3c7PgotCi08IUVMRU1FTlQgKE9MfFVMKSAtIC0gIChMSSkrPgotCi08IUVMRU1FTlQgKERJUnxNRU5VKSAtIC0gIChMSSkrIC0oJWJsb2NrKT4KLQotPCFFTEVNRU5UIExJIC0gTyAlZmxvdz4KLQotPCEtLT09PT09PT09PT09PT09PT0gRm9ybXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEZPUk0gLSAtICVib2R5LmNvbnRlbnQgLShGT1JNKT4KLTwhQVRUTElTVCBGT1JNCi0gICAgICAgIGFjdGlvbiAlVVJMICNJTVBMSUVECi0gICAgICAgIG1ldGhvZCAoJUhUVFAtTWV0aG9kKSBHRVQKLSAgICAgICAgZW5jdHlwZSAlQ29udGVudC1UeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICAgICAgICA+Ci0KLTwhRU5USVRZICUgSW5wdXRUeXBlCi0gICAgICAgICIoVEVYVCB8IFBBU1NXT1JEIHwgQ0hFQ0tCT1ggfCBSQURJTyB8IEhJRERFTiAKLSAgICAgICAgIHwgSU1BR0UgfCBTVUJNSVQgfCBSRVNFVCApIj4KLQotPCFFTEVNRU5UIElOUFVUIC0gTyBFTVBUWT4KLTwhQVRUTElTVCBJTlBVVAotICAgICAgICB0eXBlICVJbnB1dFR5cGUgVEVYVAotICAgICAgICBuYW1lICBDREFUQSAgICNJTVBMSUVECi0gICAgICAgIHZhbHVlIENEQVRBICAgI0lNUExJRUQKLSAgICAgICAgY2hlY2tlZCAoY2hlY2tlZCkgI0lNUExJRUQKLSAgICAgICAgc2l6ZSBDREFUQSAgICAjSU1QTElFRAotICAgICAgICBtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVECi0gICAgICAgIHNyYyAgICVVUkwgICAgI0lNUExJRUQKLSAgICAgICAgYWxpZ24gJUlBbGlnbiAjSU1QTElFRAotICAgICAgICA+Ci0KLTwhRUxFTUVOVCBTRUxFQ1QgLSAtIChPUFRJT04rKT4KLTwhQVRUTElTVCBTRUxFQ1QKLSAgICAgICAgbmFtZSBDREFUQSAjUkVRVUlSRUQKLSAgICAgICAgc2l6ZSBOVU1CRVIgI0lNUExJRUQKLSAgICAgICAgbXVsdGlwbGUgKG11bHRpcGxlKSAjSU1QTElFRAotICAgICAgICA+Ci0KLTwhRUxFTUVOVCBPUFRJT04gLSBPICgjUENEQVRBKSo+Ci08IUFUVExJU1QgT1BUSU9OCi0gICAgICAgIHNlbGVjdGVkIChzZWxlY3RlZCkgI0lNUExJRUQKLSAgICAgICAgdmFsdWUgIENEQVRBICAjSU1QTElFRAotICAgICAgICA+Ci0KLTwhRUxFTUVOVCBURVhUQVJFQSAtIC0gKCNQQ0RBVEEpKj4KLTwhQVRUTElTVCBURVhUQVJFQQotICAgICAgICBuYW1lIENEQVRBICNSRVFVSVJFRAotICAgICAgICByb3dzIE5VTUJFUiAjUkVRVUlSRUQKLSAgICAgICAgY29scyBOVU1CRVIgI1JFUVVJUkVECi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgSGVhZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgaGVhZC5jb250ZW50ICJUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8iPgotCi08IUVMRU1FTlQgSEVBRCBPIE8gICglaGVhZC5jb250ZW50KT4KLQotPCFFTEVNRU5UIFRJVExFIC0gLSAgKCNQQ0RBVEEpKj4KLQotPCFFTEVNRU5UIEJBU0UgLSBPIEVNUFRZPgotPCFBVFRMSVNUIEJBU0UKLSAgICAgICAgaHJlZiAlVVJMICAjUkVRVUlSRUQKLSAgICAgICAgPgotCi08IUVMRU1FTlQgTUVUQSAtIE8gRU1QVFk+Ci08IUFUVExJU1QgTUVUQQotICAgICAgICBodHRwLWVxdWl2ICBOQU1FICAgICNJTVBMSUVECi0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgU3RydWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgdmVyc2lvbi5hdHRyICJWRVJTSU9OIENEQVRBICNGSVhFRCAnJUhUTUwuVmVyc2lvbjsnIj4KLQotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEJPRFkiPgotCi08IUVMRU1FTlQgSFRNTCBPIE8gICglaHRtbC5jb250ZW50KT4KLTwhQVRUTElTVCBIVE1MCi0gICAgICAgICV2ZXJzaW9uLmF0dHI7Ci0gICAgICAgID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRW5kIG9mIERURCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2ZyYW1lc2V0LmR0ZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvZnJhbWVzZXQuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmQzMTQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvZnJhbWVzZXQuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCEtLQotICAgIFRoaXMgaXMgdGhlIEhUTUwgNC4wMSBGcmFtZXNldCBEVEQsIHdoaWNoIHNob3VsZCBiZQotICAgIHVzZWQgZm9yIGRvY3VtZW50cyB3aXRoIGZyYW1lcy4gVGhpcyBEVEQgaXMgaWRlbnRpY2FsCi0gICAgdG8gdGhlIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwgRFREIGV4Y2VwdCBmb3IgdGhlCi0gICAgY29udGVudCBtb2RlbCBvZiB0aGUgIkhUTUwiIGVsZW1lbnQ6IGluIGZyYW1lc2V0IAotICAgIGRvY3VtZW50cywgdGhlICJGUkFNRVNFVCIgZWxlbWVudCByZXBsYWNlcyB0aGUgIkJPRFkiIAotICAgIGVsZW1lbnQuCi0KLSAgICAgICAgICBEcmFmdDogJERhdGU6IDE5OTkvMTIvMjQgMjM6MjA6MDggJAotCi0gICAgICAgICAgQXV0aG9yczoKLSAgICAgICAgICAgICAgRGF2ZSBSYWdnZXR0IDxkc3JAdzMub3JnPgotICAgICAgICAgICAgICBBcm5hdWQgTGUgSG9ycyA8bGVob3JzQHczLm9yZz4KLSAgICAgICAgICAgICAgSWFuIEphY29icyA8aWpAdzMub3JnPgotCi0gICAgRnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBIVE1MIDQuMDEgaXMgYXZhaWxhYmxlIGF0OgotCi0gICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC4KLS0tPgotPCFFTlRJVFkgJSBIVE1MLlZlcnNpb24gIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iCi0gIC0tIFR5cGljYWwgdXNhZ2U6Ci0KLSAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvZnJhbWVzZXQuZHRkIj4KLSAgICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAuLi4KLSAgICA8L2hlYWQ+Ci0gICAgPGZyYW1lc2V0PgotICAgIC4uLgotICAgIDwvZnJhbWVzZXQ+Ci0gICAgPC9odG1sPgotLS0+Ci0KLTwhRU5USVRZICUgSFRNTC5GcmFtZXNldCAiSU5DTFVERSI+Ci08IUVOVElUWSAlIEhUTUw0LmR0ZCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLSVIVE1MNC5kdGQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9mcmFtZXNldDQwMC5kdGQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2ZyYW1lc2V0NDAwLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2ZDk2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2ZyYW1lc2V0NDAwLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwhLS0KLSAgICBUaGlzIGlzIHRoZSBIVE1MIDQuMCBGcmFtZXNldCBEVEQsIHdoaWNoIHNob3VsZCBiZQotICAgIHVzZWQgZm9yIGRvY3VtZW50cyB3aXRoIGZyYW1lcy4gVGhpcyBEVEQgaXMgaWRlbnRpY2FsCi0gICAgdG8gdGhlIEhUTUwgNC4wIFRyYW5zaXRpb25hbCBEVEQgZXhjZXB0IGZvciB0aGUKLSAgICBjb250ZW50IG1vZGVsIG9mIHRoZSAiSFRNTCIgZWxlbWVudDogaW4gZnJhbWVzZXQgCi0gICAgZG9jdW1lbnRzLCB0aGUgIkZSQU1FU0VUIiBlbGVtZW50IHJlcGxhY2VzIHRoZSAiQk9EWSIgCi0gICAgZWxlbWVudC4KLQotICAgICAgICAgIERyYWZ0OiAkRGF0ZTogMTk5Ny8xMi8xMSAxNTozMToxMSAkCi0KLSAgICAgICAgICBBdXRob3JzOgotICAgICAgICAgICAgICBEYXZlIFJhZ2dldHQgPGRzckB3My5vcmc+Ci0gICAgICAgICAgICAgIEFybmF1ZCBMZSBIb3JzIDxsZWhvcnNAdzMub3JnPgotICAgICAgICAgICAgICBJYW4gSmFjb2JzIDxpakB3My5vcmc+Ci0KLSAgICBGdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IEhUTUwgNC4wIGlzIGF2YWlsYWJsZSBhdDoKLQotICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAuCi0tLT4KLTwhRU5USVRZICUgSFRNTC5WZXJzaW9uICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iCi0gIC0tIFR5cGljYWwgdXNhZ2U6Ci0KLSAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2ZyYW1lc2V0LmR0ZCI+Ci0gICAgPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgLi4uCi0gICAgPC9oZWFkPgotICAgIDxmcmFtZXNldD4KLSAgICAuLi4KLSAgICA8L2ZyYW1lc2V0PgotICAgIDwvaHRtbD4KLS0tPgotCi08IUVOVElUWSAlIEhUTUwuRnJhbWVzZXQgIklOQ0xVREUiPgotPCFFTlRJVFkgJSBIVE1MNC5kdGQgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLSVIVE1MNC5kdGQ7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9odG1sLTEuZHRkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9odG1sLTEuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjVlYTRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvaHRtbC0xLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhLS0gICAgaHRtbC0xLmR0ZA0KLSAgICAgICAgRG9jdW1lbnQgVHlwZSBEZWZpbml0aW9uIGZvciB0aGUgSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZSAgICAgICAgDQotd2l0aCBMZXZlbCAxIEV4dGVuc2lvbnMgICAgICAgIChIVE1MIExldmVsIDEgRFREKS4gICAgICAgIA0KLSRJZDogaHRtbC0xLmR0ZCx2IDEuMiAxOTk1LzAzLzI5IDE4OjUzOjEwIGNvbm5vbGx5IEV4cCAkICAgICAgICANCi1BdXRob3I6IERhbmllbCBXLiBDb25ub2xseSA8Y29ubm9sbHlAdzMub3JnPiAgICAgICAgDQotU2VlIEFsc286IGh0dHA6Ly9pbmZvLmNlcm4uY2gvaHlwZXJ0ZXh0L1dXVy9NYXJrVXAvTWFya1VwLmh0bWwNCi0tLT4NCi08IUVOVElUWSAlIEhUTUwuVmVyc2lvbiAgICAgICAgDQotIi0vL0lFVEYvL0RURCBIVE1MIDIuMCBMZXZlbCAxLy9FTiINCi0gICAgICAgIC0tIFR5cGljYWwgdXNhZ2U6DQotICAgICAgICAgICAgPCFET0NUWVBFIEhUTUwgUFVCTElDICAgICAgICAgICAgICAgDQotIi0vL0lFVEYvL0RURCBIVE1MIExldmVsIDEvL0VOIj4gICAgICAgIA0KLSAgICA8aHRtbD4gICAgICAgIA0KLSAgICAuLi4gICAgICAgIA0KLSAgICA8L2h0bWw+ICAgICAgICANCi0tLSAgICAgICAgDQotPg0KLTwhLS0gRmVhdHVyZSBUZXN0IEVudGl0aWVzIC0tPg0KLTwhRU5USVRZICUgSFRNTC5Gb3JtcyAiSUdOT1JFIj4NCi08IUVOVElUWSAlIGh0bWwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIj4NCi0laHRtbDsNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2h0bWwtMXMuZHRkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9odG1sLTFzLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlNTNhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2h0bWwtMXMuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPCEtLSAgICBodG1sLTFzLmR0ZA0KLSAgICAgICAgRG9jdW1lbnQgVHlwZSBEZWZpbml0aW9uIGZvciB0aGUgSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZSAgICAgICAgDQotU3RydWN0IExldmVsIDEgICAgICAgIA0KLSRJZDogaHRtbC0xcy5kdGQsdiAxLjMgMTk5NS8wNi8wMiAxODo1NTo0MyBjb25ub2xseSBFeHAgJCAgICAgICAgDQotQXV0aG9yOiBEYW5pZWwgVy4gQ29ubm9sbHkgPGNvbm5vbGx5QHczLm9yZz4gICAgICAgIA0KLVNlZSBBbHNvOiBodHRwOi8vd3d3LnczLm9yZy9oeXBlcnRleHQvV1dXL01hcmtVcC9NYXJrVXAuaHRtbA0KLS0tPg0KLTwhRU5USVRZICUgSFRNTC5WZXJzaW9uICAgICAgICANCi0iLS8vSUVURi8vRFREIEhUTUwgMi4wIFN0cmljdCBMZXZlbCAxLy9FTiINCi0gICAgICAgIC0tIFR5cGljYWwgdXNhZ2U6DQotICAgICAgICAgICAgPCFET0NUWVBFIEhUTUwgUFVCTElDICAgICAgICAgICAgICAgDQotIi0vL0lFVEYvL0RURCBIVE1MIFN0cmljdCBMZXZlbCAxLy9FTiI+ICAgICAgICANCi0gICAgPGh0bWw+ICAgICAgICANCi0gICAgLi4uICAgICAgICANCi0gICAgPC9odG1sPiAgICAgICAgDQotLS0gICAgICAgIA0KLT4NCi08IS0tIEZlYXR1cmUgVGVzdCBFbnRpdGllcyAtLT4NCi08IUVOVElUWSAlIEhUTUwuUmVjb21tZW5kZWQgIklOQ0xVREUiPg0KLTwhRU5USVRZICUgaHRtbC0xIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wIExldmVsIDEvL0VOIj4NCi0laHRtbC0xOw0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvaHRtbC1zLmR0ZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvaHRtbC1zLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxNDU0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2h0bWwtcy5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08IS0tICAgIGh0bWwtcy5kdGQNCi0gICAgICAgIERvY3VtZW50IFR5cGUgRGVmaW5pdGlvbiBmb3IgdGhlIEh5cGVyVGV4dCBNYXJrdXAgTGFuZ3VhZ2UgICAgICAgIA0KLXdpdGggc3RyaWN0IHZhbGlkYXRpb24gKEhUTUwgU3RyaWN0IERURCkuICAgICAgICANCi0kSWQ6IGh0bWwtcy5kdGQsdiAxLjMgMTk5NS8wNi8wMiAxODo1NTo0NiBjb25ub2xseSBFeHAgJCAgICAgICAgDQotQXV0aG9yOiBEYW5pZWwgVy4gQ29ubm9sbHkgPGNvbm5vbGx5QHczLm9yZz4gICAgICAgIA0KLVNlZSBBbHNvOiBodHRwOi8vd3d3LnczLm9yZy9oeXBlcnRleHQvV1dXL01hcmtVcC9NYXJrVXAuaHRtbA0KLS0tPg0KLTwhRU5USVRZICUgSFRNTC5WZXJzaW9uICAgICAgICANCi0iLS8vSUVURi8vRFREIEhUTUwgMi4wIFN0cmljdC8vRU4iDQotICAgICAgICAtLSBUeXBpY2FsIHVzYWdlOg0KLSAgICAgICAgICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAgICAgICAgICAgICAgIA0KLSItLy9JRVRGLy9EVEQgSFRNTCBTdHJpY3QvL0VOIj4gICAgICAgIA0KLSAgICA8aHRtbD4gICAgICAgIA0KLSAgICAuLi4gICAgICAgIA0KLSAgICA8L2h0bWw+ICAgICAgICANCi0tLSAgICAgICAgDQotPg0KLTwhLS0gRmVhdHVyZSBUZXN0IEVudGl0aWVzIC0tPg0KLTwhRU5USVRZICUgSFRNTC5SZWNvbW1lbmRlZCAiSU5DTFVERSI+DQotPCFFTlRJVFkgJSBodG1sIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwgMi4wLy9FTiI+DQotJWh0bWw7DQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9odG1sLmR0ZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvaHRtbC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjN2Y3ZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9odG1sLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NCArMCwwIEBACi08IS0tICAgIGh0bWwuZHRkDQotICAgICAgICBEb2N1bWVudCBUeXBlIERlZmluaXRpb24gZm9yIHRoZSBIeXBlclRleHQgTWFya3VwIExhbmd1YWdlICAgICAgICAgICAgICAgDQotIChIVE1MIERURCkgICAgICAgIA0KLSRJZDogaHRtbC5kdGQsdiAxLjMwIDE5OTUvMDkvMjEgMjM6MzA6MTkgY29ubm9sbHkgRXhwICQgICAgICAgIA0KLUF1dGhvcjogRGFuaWVsIFcuIENvbm5vbGx5IDxjb25ub2xseUB3My5vcmc+ICAgICAgICANCi1TZWUgQWxzbzogaHRtbC5kZWNsLCBodG1sLTEuZHRkICAgICAgICANCi0gIGh0dHA6Ly93d3cudzMub3JnL2h5cGVydGV4dC9XV1cvTWFya1VwL01hcmtVcC5odG1sDQotLS0+DQotPCFFTlRJVFkgJSBIVE1MLlZlcnNpb24NCi0gICAgICAgICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIg0KLSAgICAgICAgLS0gVHlwaWNhbCB1c2FnZToNCi0gICAgICAgICAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MLy9FTiI+DQotICAgICAgICAgICAgPGh0bWw+DQotICAgICAgICAgICAgLi4uDQotICAgICAgICAgICAgPC9odG1sPg0KLSAgICAgICAgLS0NCi0gICAgICAgID4NCi08IS0tPT09PT09PT09PT09IEZlYXR1cmUgVGVzdCBFbnRpdGllcyA9PT09PT09PT09PT09PT09PT09PT09PT0tLT4NCi08IUVOVElUWSAlIEhUTUwuUmVjb21tZW5kZWQgIklHTk9SRSIgICAgICAgIA0KLS0tIENlcnRhaW4gZmVhdHVyZXMgb2YgdGhlIGxhbmd1YWdlIGFyZSBuZWNlc3NhcnkgZm9yICAgICAgICANCi0gICBjb21wYXRpYmlsaXR5IHdpdGggd2lkZXNwcmVhZCB1c2FnZSwgYnV0IHRoZXkgbWF5ICAgICAgICANCi0gICBjb21wcm9taXNlIHRoZSBzdHJ1Y3R1cmFsIGludGVncml0eSBvZiBhIGRvY3VtZW50LiAgICAgICAgDQotICAgVGhpcyBmZWF0dXJlIHRlc3QgZW50aXR5IGVuYWJsZXMgYSBtb3JlIHByZXNjcmlwdGl2ZSAgICAgICAgDQotICAgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIHRoYXQgZWxpbWluYXRlcyAgICAgICAgDQotICAgdGhvc2UgZmVhdHVyZXMuICAgICAgICANCi0tLT4NCi08IVsgJUhUTUwuUmVjb21tZW5kZWQgWw0KLSAgICAgICAgPCFFTlRJVFkgJSBIVE1MLkRlcHJlY2F0ZWQgIklHTk9SRSI+DQotXV0+DQotPCFFTlRJVFkgJSBIVE1MLkRlcHJlY2F0ZWQgIklOQ0xVREUiICAgICAgICANCi0tLSBDZXJ0YWluIGZlYXR1cmVzIG9mIHRoZSBsYW5ndWFnZSBhcmUgbmVjZXNzYXJ5IGZvciAgICAgICAgDQotICAgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIHNwZWNpZmljYXRpb24sICAgICAgICANCi0gICBidXQgdGhleSB0ZW5kIHRvIGJlIHVzZWQgYW5kIGltcGxlbWVudGVkIGluY29uc2lzdGVudGx5LCAgICAgICAgDQotICAgYW5kIHRoZWlyIHVzZSBpcyBkZXByZWNhdGVkLiBUaGlzIGZlYXR1cmUgdGVzdCBlbnRpdHkgICAgICAgIA0KLSAgIGVuYWJsZXMgYSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gdGhhdCBlbGltaW5hdGVzICAgICAgICANCi0gICB0aGVzZSBmZWF0dXJlcy4gICAgICAgIA0KLS0tPg0KLTwhRU5USVRZICUgSFRNTC5IaWdobGlnaHRpbmcgIklOQ0xVREUiICAgICAgICANCi0tLSBVc2UgdGhpcyBmZWF0dXJlIHRlc3QgZW50aXR5IHRvIHZhbGlkYXRlIHRoYXQgYSAgICAgICAgDQotICAgZG9jdW1lbnQgdXNlcyBubyBoaWdobGlnaHRpbmcgdGFncywgd2hpY2ggbWF5IGJlICAgICAgICANCi0gICBpZ25vcmVkIG9uIG1pbmltYWwgaW1wbGVtZW50YXRpb25zLiAgICAgICAgDQotLS0+DQotPCFFTlRJVFkgJSBIVE1MLkZvcm1zICJJTkNMVURFIg0KLSAgICAgICAgLS0gVXNlIHRoaXMgZmVhdHVyZSB0ZXN0IGVudGl0eSB0byB2YWxpZGF0ZSB0aGF0IGEgZG9jdW1lbnQNCi0gICAgICAgICAgIGNvbnRhaW5zIG5vIGZvcm1zLCB3aGljaCBtYXkgbm90IGJlIHN1cHBvcnRlZCBpbiBtaW5pbWFsDQotICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMNCi0gICAgICAgIC0tPg0KLTwhLS09PT09PT09PT09PT09PSBJbXBvcnRlZCBOYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4NCi08IUVOVElUWSAlIENvbnRlbnQtVHlwZSAiQ0RBVEEiDQotICAgICAgICAtLSBtZWFuaW5nIGFuIGludGVybmV0IG1lZGlhIHR5cGUNCi0gICAgICAgICAgIChha2EgTUlNRSBjb250ZW50IHR5cGUsIGFzIHBlciBSRkMxNTIxKQ0KLSAgICAgICAgLS0+DQotPCFFTlRJVFkgJSBIVFRQLU1ldGhvZCAiR0VUIHwgUE9TVCINCi0gICAgICAgIC0tIGFzIHBlciBIVFRQIHNwZWNpZmljYXRpb24sIGluIHByb2dyZXNzDQotICAgICAgICAtLT4NCi08IS0tPT09PT09PT09IERURCAiTWFjcm9zIiA9PT09PT09PT09PT09PT09PT09PT0tLT4NCi08IUVOVElUWSAlIGhlYWRpbmcgIkgxfEgyfEgzfEg0fEg1fEg2Ij4NCi08IUVOVElUWSAlIGxpc3QgIiBVTCB8IE9MIHwgRElSIHwgTUVOVSAiID4NCi08IS0tPT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT0tLT4NCi08IUVOVElUWSAlIElTT2xhdDEgUFVCTElDDQotICAiSVNPIDg4NzktMTk4Ni8vRU5USVRJRVMgQWRkZWQgTGF0aW4gMS8vRU4vL0hUTUwiPg0KLSVJU09sYXQxOw0KLTwhRU5USVRZIGFtcCBDREFUQSAiJiMzODsiICAgICAtLSBhbXBlcnNhbmQgICAgICAgICAgLS0+DQotPCFFTlRJVFkgZ3QgQ0RBVEEgIiYjNjI7IiAgICAgIC0tIGdyZWF0ZXIgdGhhbiAgICAgICAtLT4NCi08IUVOVElUWSBsdCBDREFUQSAiJiM2MDsiICAgICAgLS0gbGVzcyB0aGFuICAgICAgICAgIC0tPg0KLTwhRU5USVRZIHF1b3QgQ0RBVEEgIiYjMzQ7IiAgICAtLSBkb3VibGUgcXVvdGUgICAgICAgLS0+DQotPCEtLT09PT09PT09PSBTR01MIERvY3VtZW50IEFjY2VzcyAoU0RBKSBQYXJhbWV0ZXIgRW50aXRpZXMgPT09PT0tLT4NCi08IS0tIEhUTUwgMi4wIGNvbnRhaW5zIFNHTUwgRG9jdW1lbnQgQWNjZXNzIChTREEpIGZpeGVkIGF0dHJpYnV0ZXMNCi1pbiBzdXBwb3J0IG9mIGVhc3kgdHJhbnNmb3JtYXRpb24gdG8gdGhlIEludGVybmF0aW9uYWwgQ29tbWl0dGVlDQotZm9yIEFjY2Vzc2libGUgRG9jdW1lbnQgRGVzaWduIChJQ0FERCkgRFREICAgICAgICANCi0gIi0vL0VDLVVTQS1DREEvSUNBREQvL0RURCBJQ0FERDIyLy9FTiIuDQotSUNBREQgYXBwbGljYXRpb25zIGFyZSBkZXNpZ25lZCB0byBzdXBwb3J0IHVzYWJsZSBhY2Nlc3MgdG8NCi1zdHJ1Y3R1cmVkIGluZm9ybWF0aW9uIGJ5IHByaW50LWltcGFpcmVkIGluZGl2aWR1YWxzIHRocm91Z2gNCi1CcmFpbGxlLCBsYXJnZSBwcmludCBhbmQgdm9pY2Ugc3ludGhlc2lzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24NCi1TREEgJiBJQ0FERDogIA0KLSAgICAgICAgLSBJU08gMTIwODM6MTk5MywgQW5uZXggQS44LCBGYWNpbGl0aWVzIGZvciBCcmFpbGxlLCAgICAgICAgDQotICBsYXJnZSBwcmludCBhbmQgY29tcHV0ZXIgdm9pY2UNCi0gICAgICAgIC0gSUNBREQgTGlzdFNlcnYgICAgICAgIA0KLSAgPElDQUREJUFTVUFDQUQuQklUTkVUQEFSSVpWTTEuY2NpdC5hcml6b25hLmVkdT4NCi0gICAgICAgIC0gVXNlbmV0IG5ld3MgZ3JvdXAgYml0Lmxpc3RzZXJ2LmVhc2kNCi0gICAgICAgIC0gUmVjb3JkaW5nIGZvciB0aGUgQmxpbmQsICsxIDgwMCAyMjEgNDc5Mg0KLS0tPg0KLTwhRU5USVRZICUgU0RBRk9STSAgIlNEQUZPUk0gIENEQVRBICAjRklYRUQiICAgICAgICANCi0gIC0tIG9uZSB0byBvbmUgbWFwcGluZyAgICAgICAgLS0+DQotPCFFTlRJVFkgJSBTREFSVUxFICAiU0RBUlVMRSAgQ0RBVEEgICNGSVhFRCIgICAgICAgIA0KLSAgLS0gY29udGV4dC1zZW5zaXRpdmUgbWFwcGluZyAtLT4NCi08IUVOVElUWSAlIFNEQVBSRUYgICJTREFQUkVGICBDREFUQSAgI0ZJWEVEIiAgICAgICAgDQotICAtLSBnZW5lcmF0ZWQgdGV4dCBwcmVmaXggICAgIC0tPg0KLTwhRU5USVRZICUgU0RBU1VGRiAgIlNEQVNVRkYgIENEQVRBICAjRklYRUQiICAgICAgICANCi0gIC0tIGdlbmVyYXRlZCB0ZXh0IHN1ZmZpeCAgICAgLS0+DQotPCFFTlRJVFkgJSBTREFTVVNQICAiU0RBU1VTUCAgTkFNRSAgICNGSVhFRCIgICAgICAgIA0KLSAgLS0gc3VzcGVuZCB0cmFuc2Zvcm0gcHJvY2VzcyAtLT4NCi08IS0tPT09PT09PT09PSBUZXh0IE1hcmt1cCA9PT09PT09PT09PT09PT09PT09PT0tLT4NCi08IVsgJUhUTUwuSGlnaGxpZ2h0aW5nIFsNCi08IUVOVElUWSAlIGZvbnQgIiBUVCB8IEIgfCBJICI+DQotPCFFTlRJVFkgJSBwaHJhc2UgIkVNIHwgU1RST05HIHwgQ09ERSB8IFNBTVAgfCBLQkQgfCBWQVIgfCBDSVRFICI+DQotPCFFTlRJVFkgJSB0ZXh0ICIjUENEQVRBIHwgQSB8IElNRyB8IEJSIHwgJXBocmFzZSB8ICVmb250Ij4NCi08IUVMRU1FTlQgKCVmb250O3wlcGhyYXNlKSAtIC0gKCV0ZXh0KSo+DQotPCFBVFRMSVNUICggVFQgfCBDT0RFIHwgU0FNUCB8IEtCRCB8IFZBUiApDQotICAgICAgICAlU0RBRk9STTsgIkxpdCINCi0gICAgICAgID4NCi08IUFUVExJU1QgKCBCIHwgU1RST05HICkNCi0gICAgICAgICVTREFGT1JNOyAiQiINCi0gICAgICAgID4NCi08IUFUVExJU1QgKCBJIHwgRU0gfCBDSVRFICkNCi0gICAgICAgICVTREFGT1JNOyAiSXQiDQotICAgICAgICA+DQotPCEtLSA8VFQ+ICAgICAgIFR5cGV3cml0ZXIgdGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi08IS0tIDxCPiAgICAgICAgQm9sZCB0ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLTwhLS0gPEk+ICAgICAgICBJdGFsaWMgdGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8RU0+ICAgICAgIEVtcGhhc2l6ZWQgcGhyYXNlICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi08IS0tIDxTVFJPTkc+ICAgU3Ryb25nIGVtcGhhc2lzICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLTwhLS0gPENPREU+ICAgICBTb3VyY2UgY29kZSBwaHJhc2UgICAgICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8U0FNUD4gICAgIFNhbXBsZSB0ZXh0IG9yIGNoYXJhY3RlcnMgICAgICAgICAgICAgICAtLT4NCi08IS0tIDxLQkQ+ICAgICAgS2V5Ym9hcmQgcGhyYXNlLCBlLmcuIHVzZXIgaW5wdXQgICAgICAgIC0tPg0KLTwhLS0gPFZBUj4gICAgICBWYXJpYWJsZSBwaHJhc2Ugb3Igc3Vic3RpdHV0YWJsZSAgICAgICAgLS0+DQotPCEtLSA8Q0lURT4gICAgIE5hbWUgb3IgdGl0bGUgb2YgY2l0ZWQgd29yayAgICAgICAgICAgICAtLT4NCi08IUVOVElUWSAlIHByZS5jb250ZW50ICIjUENEQVRBIHwgQSB8IEhSIHwgQlIgfCAlZm9udCB8ICVwaHJhc2UiPg0KLV1dPg0KLTwhRU5USVRZICUgdGV4dCAiI1BDREFUQSB8IEEgfCBJTUcgfCBCUiI+DQotPCFFTEVNRU5UIEJSICAgIC0gTyBFTVBUWT4NCi08IUFUVExJU1QgQlINCi0gICAgICAgICVTREFQUkVGOyAiJiNSRTsiDQotICAgICAgICA+DQotPCEtLSA8QlI+ICAgICAgIExpbmUgYnJlYWsgICAgICAtLT4NCi08IS0tPT09PT09PT09IExpbmsgTWFya3VwID09PT09PT09PT09PT09PT09PT09PT0tLT4NCi08IUVOVElUWSAlIGxpbmtUeXBlICJOQU1FUyI+DQotPCFFTlRJVFkgJSBsaW5rRXh0cmFBdHRyaWJ1dGVzDQotICAgICAgICAiUkVMICVsaW5rVHlwZSAjSU1QTElFRA0KLSAgICAgICAgUkVWICVsaW5rVHlwZSAjSU1QTElFRA0KLSAgICAgICAgVVJOIENEQVRBICNJTVBMSUVEDQotICAgICAgICBUSVRMRSBDREFUQSAjSU1QTElFRA0KLSAgICAgICAgTUVUSE9EUyBOQU1FUyAjSU1QTElFRA0KLSAgICAgICAgIj4NCi08IVsgJUhUTUwuUmVjb21tZW5kZWQgWw0KLSAgICAgICAgPCFFTlRJVFkgJSBBLmNvbnRlbnQgICAiKCV0ZXh0KSoiDQotICAgICAgICAtLSA8SDE+PGEgbmFtZT0ieHh4Ij5IZWFkaW5nPC9hPjwvSDE+DQotICAgICAgICAgICAgICAgIGlzIHByZWZlcnJlZCB0bw0KLSAgICAgICAgICAgPGEgbmFtZT0ieHh4Ij48SDE+SGVhZGluZzwvSDE+PC9hPg0KLSAgICAgICAgLS0+DQotXV0+DQotPCFFTlRJVFkgJSBBLmNvbnRlbnQgICAiKCVoZWFkaW5nfCV0ZXh0KSoiPg0KLTwhRUxFTUVOVCBBICAgICAtIC0gJUEuY29udGVudCAtKEEpPg0KLTwhQVRUTElTVCBBDQotICAgICAgICBIUkVGIENEQVRBICNJTVBMSUVEDQotICAgICAgICBOQU1FIENEQVRBICNJTVBMSUVEDQotICAgICAgICAlbGlua0V4dHJhQXR0cmlidXRlczsNCi0gICAgICAgICVTREFQUkVGOyAiPEFuY2hvcjogI0F0dExpc3Q+Ig0KLSAgICAgICAgPg0KLTwhLS0gPEE+ICAgICAgICAgICAgICAgQW5jaG9yOyBzb3VyY2UvZGVzdGluYXRpb24gb2YgbGluayAgICAtLT4NCi08IS0tIDxBIE5BTUU9Ii4uLiI+ICAgICBOYW1lIG9mIHRoaXMgYW5jaG9yICAgICAgICAgICAgICAgIC0tPg0KLTwhLS0gPEEgSFJFRj0iLi4uIj4gICAgIEFkZHJlc3Mgb2YgbGluayBkZXN0aW5hdGlvbiAgICAgICAgIC0tPg0KLTwhLS0gPEEgVVJOPSIuLi4iPiAgICAgIFBlcm1hbmVudCBhZGRyZXNzIG9mIGRlc3RpbmF0aW9uICAgICAtLT4NCi08IS0tIDxBIFJFTD0uLi4+ICAgICAgICBSZWxhdGlvbnNoaXAgdG8gZGVzdGluYXRpb24gICAgICAgLS0+DQotPCEtLSA8QSBSRVY9Li4uPiAgICAgICAgUmVsYXRpb25zaGlwIG9mIGRlc3RpbmF0aW9uIHRvIHRoaXMgICAgLS0+DQotPCEtLSA8QSBUSVRMRT0iLi4uIj4gICAgVGl0bGUgb2YgZGVzdGluYXRpb24gKGFkdmlzb3J5KSAgICAgICAtLT4NCi08IS0tIDxBIE1FVEhPRFM9Ii4uLiI+ICBPcGVyYXRpb25zIG9uIGRlc3RpbmF0aW9uIChhZHZpc29yeSkgICAgIC0tPg0KLTwhLS09PT09PT09PT09IEltYWdlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PS0tPg0KLTwhRUxFTUVOVCBJTUcgICAgLSBPIEVNUFRZPg0KLTwhQVRUTElTVCBJTUcNCi0gICAgICAgIFNSQyBDREFUQSAgI1JFUVVJUkVEDQotICAgICAgICBBTFQgQ0RBVEEgI0lNUExJRUQNCi0gICAgICAgIEFMSUdOICh0b3B8bWlkZGxlfGJvdHRvbSkgI0lNUExJRUQNCi0gICAgICAgIElTTUFQIChJU01BUCkgI0lNUExJRUQNCi0gICAgICAgICVTREFQUkVGOyAiPEZpZz48P1NEQVRyYW5zIEltZzogI0F0dExpc3Q+I0F0dFZhbChBbHQpPC9GaWc+Ig0KLSAgICAgICAgPg0KLTwhLS0gPElNRz4gICAgICAgICAgICAgIEltYWdlOyBpY29uLCBnbHlwaCBvciBpbGx1c3RyYXRpb24gICAgICAtLT4NCi08IS0tIDxJTUcgU1JDPSIuLi4iPiAgICBBZGRyZXNzIG9mIGltYWdlIG9iamVjdCAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8SU1HIEFMVD0iLi4uIj4gICAgVGV4dHVhbCBhbHRlcm5hdGl2ZSAgICAgICAgICAgICAgICAgICAgIC0tPg0KLTwhLS0gPElNRyBBTElHTj0uLi4+ICAgIFBvc2l0aW9uIHJlbGF0aXZlIHRvIHRleHQgICAgICAgICAgICAgICAtLT4NCi08IS0tIDxJTUcgSVNNQVA+ICAgICAgICBFYWNoIHBpeGVsIGNhbiBiZSBhIGxpbmsgICAgICAgICAgICAgICAgLS0+DQotPCEtLT09PT09PT09PT0gUGFyYWdyYXBocz09PT09PT09PT09PT09PT09PT09PT09LS0+DQotPCFFTEVNRU5UIFAgICAgIC0gTyAoJXRleHQpKj4NCi08IUFUVExJU1QgUA0KLSAgICAgICAgJVNEQUZPUk07ICJQYXJhIg0KLSAgICAgICAgPg0KLTwhLS0gPFA+ICAgICAgICBQYXJhZ3JhcGggICAgICAgLS0+DQotPCEtLT09PT09PT09PT0gSGVhZGluZ3MsIFRpdGxlcywgU2VjdGlvbnMgPT09PT09PT09PT09PT09LS0+DQotPCFFTEVNRU5UIEhSICAgIC0gTyBFTVBUWT4NCi08IUFUVExJU1QgSFINCi0gICAgICAgICVTREFQUkVGOyAiJiNSRTsmI1JFOyINCi0gICAgICAgID4NCi08IS0tIDxIUj4gICAgICAgSG9yaXpvbnRhbCBydWxlIC0tPg0KLTwhRUxFTUVOVCAoICVoZWFkaW5nICkgIC0gLSAgKCV0ZXh0OykqPg0KLTwhQVRUTElTVCBIMQ0KLSAgICAgICAgJVNEQUZPUk07ICJIMSINCi0gICAgICAgID4NCi08IUFUVExJU1QgSDINCi0gICAgICAgICVTREFGT1JNOyAiSDIiDQotICAgICAgICA+DQotPCFBVFRMSVNUIEgzDQotICAgICAgICAlU0RBRk9STTsgIkgzIg0KLSAgICAgICAgPg0KLTwhQVRUTElTVCBINA0KLSAgICAgICAgJVNEQUZPUk07ICJINCINCi0gICAgICAgID4NCi08IUFUVExJU1QgSDUNCi0gICAgICAgICVTREFGT1JNOyAiSDUiDQotICAgICAgICA+DQotPCFBVFRMSVNUIEg2DQotICAgICAgICAlU0RBRk9STTsgIkg2Ig0KLSAgICAgICAgPg0KLTwhLS0gPEgxPiAgICAgICBIZWFkaW5nLCBsZXZlbCAxIC0tPg0KLTwhLS0gPEgyPiAgICAgICBIZWFkaW5nLCBsZXZlbCAyIC0tPg0KLTwhLS0gPEgzPiAgICAgICBIZWFkaW5nLCBsZXZlbCAzIC0tPg0KLTwhLS0gPEg0PiAgICAgICBIZWFkaW5nLCBsZXZlbCA0IC0tPg0KLTwhLS0gPEg1PiAgICAgICBIZWFkaW5nLCBsZXZlbCA1IC0tPg0KLTwhLS0gPEg2PiAgICAgICBIZWFkaW5nLCBsZXZlbCA2IC0tPg0KLTwhLS09PT09PT09PT09IFRleHQgRmxvd3MgPT09PT09PT09PT09PT09PT09PT09PS0tPg0KLTwhWyAlSFRNTC5Gb3JtcyBbDQotICAgICAgICA8IUVOVElUWSAlIGJsb2NrLmZvcm1zICJCTE9DS1FVT1RFIHwgRk9STSB8IElTSU5ERVgiPg0KLV1dPg0KLTwhRU5USVRZICUgYmxvY2suZm9ybXMgIkJMT0NLUVVPVEUiPg0KLTwhWyAlSFRNTC5EZXByZWNhdGVkIFsNCi0gICAgICAgIDwhRU5USVRZICUgcHJlZm9ybWF0dGVkICJQUkUgfCBYTVAgfCBMSVNUSU5HIj4NCi1dXT4NCi08IUVOVElUWSAlIHByZWZvcm1hdHRlZCAiUFJFIj4NCi08IUVOVElUWSAlIGJsb2NrICJQIHwgJWxpc3QgfCBETA0KLSAgICAgICAgfCAlcHJlZm9ybWF0dGVkDQotICAgICAgICB8ICVibG9jay5mb3JtcyI+DQotPCFFTlRJVFkgJSBmbG93ICIoJXRleHR8JWJsb2NrKSoiPg0KLTwhRU5USVRZICUgcHJlLmNvbnRlbnQgIiNQQ0RBVEEgfCBBIHwgSFIgfCBCUiI+DQotPCFFTEVNRU5UIFBSRSAtIC0gKCVwcmUuY29udGVudCkqPg0KLTwhQVRUTElTVCBQUkUNCi0gICAgICAgIFdJRFRIIE5VTUJFUiAjaW1wbGllZA0KLSAgICAgICAgJVNEQUZPUk07ICJMaXQiDQotICAgICAgICA+DQotPCEtLSA8UFJFPiAgICAgICAgICAgICAgUHJlZm9ybWF0dGVkIHRleHQgICAgICAgICAgICAgICAtLT4NCi08IS0tIDxQUkUgV0lEVEg9Li4uPiAgICBNYXhpbXVtIGNoYXJhY3RlcnMgcGVyIGxpbmUgICAgIC0tPg0KLTwhWyAlSFRNTC5EZXByZWNhdGVkIFsNCi08IUVOVElUWSAlIGxpdGVyYWwgIkNEQVRBIg0KLSAgICAgICAgLS0gaGlzdG9yaWNhbCwgbm9uLWNvbmZvcm1pbmcgcGFyc2luZyBtb2RlIHdoZXJlDQotICAgICAgICAgICB0aGUgb25seSBtYXJrdXAgc2lnbmFsIGlzIHRoZSBlbmQgdGFnDQotICAgICAgICAgICBpbiBmdWxsDQotICAgICAgICAtLT4NCi08IUVMRU1FTlQgKFhNUHxMSVNUSU5HKSAtIC0gICVsaXRlcmFsPg0KLTwhQVRUTElTVCBYTVANCi0gICAgICAgICVTREFGT1JNOyAiTGl0Ig0KLSAgICAgICAgJVNEQVBSRUY7ICJFeGFtcGxlOiYjUkU7Ig0KLSAgICAgICAgPg0KLTwhQVRUTElTVCBMSVNUSU5HDQotICAgICAgICAlU0RBRk9STTsgIkxpdCINCi0gICAgICAgICVTREFQUkVGOyAiTGlzdGluZzomI1JFOyINCi0gICAgICAgID4NCi08IS0tIDxYTVA+ICAgICAgICAgICAgICBFeGFtcGxlIHNlY3Rpb24gICAgICAgICAtLT4NCi08IS0tIDxMSVNUSU5HPiAgICAgICAgICBDb21wdXRlciBsaXN0aW5nICAgICAgICAtLT4NCi08IUVMRU1FTlQgUExBSU5URVhUIC0gTyAlbGl0ZXJhbD4NCi08IS0tIDxQTEFJTlRFWFQ+ICAgICAgICBQbGFpbiB0ZXh0IHBhc3NhZ2UgICAgICAtLT4NCi08IUFUVExJU1QgUExBSU5URVhUDQotICAgICAgICAlU0RBRk9STTsgIkxpdCINCi0gICAgICAgID4NCi1dXT4NCi08IS0tPT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT0tLT4NCi08IUVMRU1FTlQgREwgICAgLSAtICAoRFQgfCBERCkrPg0KLTwhQVRUTElTVCBETA0KLSAgICAgICAgQ09NUEFDVCAoQ09NUEFDVCkgI0lNUExJRUQNCi0gICAgICAgICVTREFGT1JNOyAiTGlzdCINCi0gICAgICAgICVTREFQUkVGOyAiRGVmaW5pdGlvbiBMaXN0OiINCi0gICAgICAgID4NCi08IUVMRU1FTlQgRFQgICAgLSBPICgldGV4dCkqPg0KLTwhQVRUTElTVCBEVA0KLSAgICAgICAgJVNEQUZPUk07ICJUZXJtIg0KLSAgICAgICAgPg0KLTwhRUxFTUVOVCBERCAgICAtIE8gJWZsb3c+DQotPCFBVFRMSVNUIEREDQotICAgICAgICAlU0RBRk9STTsgIkxJdGVtIg0KLSAgICAgICAgPg0KLTwhLS0gPERMPiAgICAgICAgICAgICAgIERlZmluaXRpb24gbGlzdCwgb3IgZ2xvc3NhcnkgICAgLS0+DQotPCEtLSA8REwgQ09NUEFDVD4gICAgICAgQ29tcGFjdCBzdHlsZSBsaXN0ICAgICAgICAgICAgICAtLT4NCi08IS0tIDxEVD4gICAgICAgICAgICAgICBUZXJtIGluIGRlZmluaXRpb24gbGlzdCAgICAgICAgIC0tPg0KLTwhLS0gPEREPiAgICAgICAgICAgICAgIERlZmluaXRpb24gb2YgdGVybSAgICAgICAgICAgICAgLS0+DQotPCFFTEVNRU5UIChPTHxVTCkgLSAtICAoTEkpKz4NCi08IUFUVExJU1QgT0wNCi0gICAgICAgIENPTVBBQ1QgKENPTVBBQ1QpICNJTVBMSUVEDQotICAgICAgICAlU0RBRk9STTsgIkxpc3QiDQotICAgICAgICA+DQotPCFBVFRMSVNUIFVMDQotICAgICAgICBDT01QQUNUIChDT01QQUNUKSAjSU1QTElFRA0KLSAgICAgICAgJVNEQUZPUk07ICJMaXN0Ig0KLSAgICAgICAgPg0KLTwhLS0gPFVMPiAgICAgICAgICAgICAgIFVub3JkZXJlZCBsaXN0ICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8VUwgQ09NUEFDVD4gICAgICAgQ29tcGFjdCBsaXN0IHN0eWxlICAgICAgICAgICAgICAtLT4NCi08IS0tIDxPTD4gICAgICAgICAgICAgICBPcmRlcmVkLCBvciBudW1iZXJlZCBsaXN0ICAgICAgIC0tPg0KLTwhLS0gPE9MIENPTVBBQ1Q+ICAgICAgIENvbXBhY3QgbGlzdCBzdHlsZSAgICAgICAgICAgICAgLS0+DQotPCFFTEVNRU5UIChESVJ8TUVOVSkgLSAtICAoTEkpKyAtKCVibG9jayk+DQotPCFBVFRMSVNUIERJUg0KLSAgICAgICAgQ09NUEFDVCAoQ09NUEFDVCkgI0lNUExJRUQNCi0gICAgICAgICVTREFGT1JNOyAiTGlzdCINCi0gICAgICAgICVTREFQUkVGOyAiPExIZWFkPkRpcmVjdG9yeTwvTEhlYWQ+Ig0KLSAgICAgICAgPg0KLTwhQVRUTElTVCBNRU5VDQotICAgICAgICBDT01QQUNUIChDT01QQUNUKSAjSU1QTElFRA0KLSAgICAgICAgJVNEQUZPUk07ICJMaXN0Ig0KLSAgICAgICAgJVNEQVBSRUY7ICI8TEhlYWQ+TWVudTwvTEhlYWQ+Ig0KLSAgICAgICAgPg0KLTwhLS0gPERJUj4gICAgICAgICAgICAgIERpcmVjdG9yeSBsaXN0ICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8RElSIENPTVBBQ1Q+ICAgICAgQ29tcGFjdCBsaXN0IHN0eWxlICAgICAgICAgICAgICAtLT4NCi08IS0tIDxNRU5VPiAgICAgICAgICAgICBNZW51IGxpc3QgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLTwhLS0gPE1FTlUgQ09NUEFDVD4gICAgIENvbXBhY3QgbGlzdCBzdHlsZSAgICAgICAgICAgICAgLS0+DQotPCFFTEVNRU5UIExJICAgIC0gTyAlZmxvdz4NCi08IUFUVExJU1QgTEkNCi0gICAgICAgICVTREFGT1JNOyAiTEl0ZW0iDQotICAgICAgICA+DQotPCEtLSA8TEk+ICAgICAgICAgICAgICAgTGlzdCBpdGVtICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi08IS0tPT09PT09PT09PSBEb2N1bWVudCBCb2R5ID09PT09PT09PT09PT09PT09PT0tLT4NCi08IVsgJUhUTUwuUmVjb21tZW5kZWQgWyAgICAgICAgDQotPCFFTlRJVFkgJSBib2R5LmNvbnRlbnQgIiglaGVhZGluZ3wlYmxvY2t8SFJ8QUREUkVTU3xJTUcpKiIgICAgICAgIA0KLS0tIDxoMT5IZWFkaW5nPC9oMT4gICAgICAgIA0KLSAgIDxwPlRleHQgLi4uICAgICAgICAgICAgICAgDQotaXMgcHJlZmVycmVkIHRvICAgICAgICANCi0gICA8aDE+SGVhZGluZzwvaDE+ICAgICAgICANCi0gICBUZXh0IC4uLiAgICAgICAgDQotLS0+DQotXV0+DQotPCFFTlRJVFkgJSBib2R5LmNvbnRlbnQgIiglaGVhZGluZyB8ICV0ZXh0IHwgJWJsb2NrIHwgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSBIUiB8IEFERFJFU1MpKiI+DQotPCFFTEVNRU5UIEJPRFkgTyBPICAlYm9keS5jb250ZW50Pg0KLTwhLS0gPEJPRFk+ICAgICBEb2N1bWVudCBib2R5ICAgLS0+DQotPCFFTEVNRU5UIEJMT0NLUVVPVEUgLSAtICVib2R5LmNvbnRlbnQ+DQotPCFBVFRMSVNUIEJMT0NLUVVPVEUNCi0gICAgICAgICVTREFGT1JNOyAiQlEiDQotICAgICAgICA+DQotPCEtLSA8QkxPQ0tRVU9URT4gICAgICAgUXVvdGVkIHBhc3NhZ2UgIC0tPg0KLTwhRUxFTUVOVCBBRERSRVNTIC0gLSAoJXRleHR8UCkqPg0KLTwhQVRUTElTVCAgQUREUkVTUw0KLSAgICAgICAgJVNEQUZPUk07ICJMaXQiDQotICAgICAgICAlU0RBUFJFRjsgIkFkZHJlc3M6JiNSRTsiDQotICAgICAgICA+DQotPCEtLSA8QUREUkVTUz4gIEFkZHJlc3MsIHNpZ25hdHVyZSwgb3IgYnlsaW5lICAgIC0tPg0KLTwhLS09PT09PT09IEZvcm1zID09PT09PT09PT09PT09PT09PT09LS0+DQotPCFbICVIVE1MLkZvcm1zIFsNCi08IUVMRU1FTlQgRk9STSAtIC0gJWJvZHkuY29udGVudCAtKEZPUk0pICsoSU5QVVR8U0VMRUNUfFRFWFRBUkVBKT4NCi08IUFUVExJU1QgRk9STQ0KLSAgICAgICAgQUNUSU9OIENEQVRBICNJTVBMSUVEDQotICAgICAgICBNRVRIT0QgKCVIVFRQLU1ldGhvZCkgR0VUDQotICAgICAgICBFTkNUWVBFICVDb250ZW50LVR5cGU7ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiDQotICAgICAgICAlU0RBUFJFRjsgIjxQYXJhPkZvcm06PC9QYXJhPiINCi0gICAgICAgICVTREFTVUZGOyAiPFBhcmE+Rm9ybSBFbmQuPC9QYXJhPiINCi0gICAgICAgID4NCi08IS0tIDxGT1JNPiAgICAgICAgICAgICAgICAgICAgIEZpbGwtb3V0IG9yIGRhdGEtZW50cnkgZm9ybSAgICAgLS0+DQotPCEtLSA8Rk9STSBBQ1RJT049Ii4uLiI+ICAgICAgICBBZGRyZXNzIGZvciBjb21wbGV0ZWQgZm9ybSAgICAgIC0tPg0KLTwhLS0gPEZPUk0gTUVUSE9EPS4uLj4gICAgICAgICAgTWV0aG9kIG9mIHN1Ym1pdHRpbmcgZm9ybSAgICAgICAtLT4NCi08IS0tIDxGT1JNIEVOQ1RZUEU9Ii4uLiI+ICAgICAgIFJlcHJlc2VudGF0aW9uIG9mIGZvcm0gZGF0YSAgICAgLS0+DQotPCFFTlRJVFkgJSBJbnB1dFR5cGUgIihURVhUIHwgUEFTU1dPUkQgfCBDSEVDS0JPWCB8DQotICAgICAgICAgICAgICAgICAgICAgICAgUkFESU8gfCBTVUJNSVQgfCBSRVNFVCB8DQotICAgICAgICAgICAgICAgICAgICAgICAgSU1BR0UgfCBISURERU4gKSI+DQotPCFFTEVNRU5UIElOUFVUIC0gTyBFTVBUWT4NCi08IUFUVExJU1QgSU5QVVQgICAgICAgIA0KLVRZUEUgJUlucHV0VHlwZSBURVhUICAgICAgICANCi1OQU1FIENEQVRBICNJTVBMSUVEICAgICAgICANCi1WQUxVRSBDREFUQSAjSU1QTElFRCAgICAgICAgDQotU1JDIENEQVRBICNJTVBMSUVEICAgICAgICANCi1DSEVDS0VEIChDSEVDS0VEKSAjSU1QTElFRCAgICAgICAgDQotU0laRSBDREFUQSAjSU1QTElFRCAgICAgICAgDQotTUFYTEVOR1RIIE5VTUJFUiAjSU1QTElFRCAgICAgICAgDQotQUxJR04gKHRvcHxtaWRkbGV8Ym90dG9tKSAjSU1QTElFRA0KLSAgICAgICAgJVNEQVBSRUY7ICJJbnB1dDogIiAgICAgICAgDQotPg0KLTwhLS0gPElOUFVUPiAgICAgICAgIEZvcm0gaW5wdXQgZGF0dW0gICAgICAgICAtLT4NCi08IS0tIDxJTlBVVCBUWVBFPS4uLj4gICAgIFR5cGUgb2YgaW5wdXQgaW50ZXJhY3Rpb24gICAgICAgIC0tPg0KLTwhLS0gPElOUFVUIE5BTUU9Li4uPiAgICAgTmFtZSBvZiBmb3JtIGRhdHVtICAgICAgICAgICAgIC0tPg0KLTwhLS0gPElOUFVUIFZBTFVFPSIuLi4iPiAgICAgICAgRGVmYXVsdC9pbml0aWFsL3NlbGVjdGVkIHZhbHVlIC0tPg0KLTwhLS0gPElOUFVUIFNSQz0iLi4uIj4gICBBZGRyZXNzIG9mIGltYWdlICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8SU5QVVQgQ0hFQ0tFRD4gICAgICAgSW5pdGlhbCBzdGF0ZSBpcyAib24iICAgICAgICAgLS0+DQotPCEtLSA8SU5QVVQgU0laRT0uLi4+ICAgICBGaWVsZCBzaXplIGhpbnQgICAgICAgICAgIC0tPg0KLTwhLS0gPElOUFVUIE1BWExFTkdUSD0uLi4+ICAgICAgRGF0YSBsZW5ndGggbWF4aW11bSAgIC0tPg0KLTwhLS0gPElOUFVUIEFMSUdOPS4uLj4gICBJbWFnZSBhbGlnbm1lbnQgICAgICAgICAgICAgICAgLS0+DQotPCFFTEVNRU5UIFNFTEVDVCAtIC0gKE9QVElPTispIC0oSU5QVVR8U0VMRUNUfFRFWFRBUkVBKT4NCi08IUFUVExJU1QgU0VMRUNUDQotICAgICAgICBOQU1FIENEQVRBICNSRVFVSVJFRA0KLSAgICAgICAgU0laRSBOVU1CRVIgI0lNUExJRUQNCi0gICAgICAgIE1VTFRJUExFIChNVUxUSVBMRSkgI0lNUExJRUQNCi0gICAgICAgICVTREFGT1JNOyAiTGlzdCINCi0gICAgICAgICVTREFQUkVGOw0KLSAgICAgICAgIjxMSGVhZD5TZWxlY3QgI0F0dFZhbChNdWx0aXBsZSk8L0xIZWFkPiIgICAgICAgIA0KLT4NCi08IS0tIDxTRUxFQ1Q+ICAgICAgU2VsZWN0aW9uIG9mIG9wdGlvbihzKSAgIC0tPg0KLTwhLS0gPFNFTEVDVCBOQU1FPS4uLj4gICBOYW1lIG9mIGZvcm0gZGF0dW0gICAgICAgICAgIC0tPg0KLTwhLS0gPFNFTEVDVCBTSVpFPS4uLj4gICBPcHRpb25zIGRpc3BsYXllZCBhdCBhIHRpbWUgICAgIC0tPg0KLTwhLS0gPFNFTEVDVCBNVUxUSVBMRT4gICBNdWx0aXBsZSBzZWxlY3Rpb25zIGFsbG93ZWQgICAgIC0tPg0KLTwhRUxFTUVOVCBPUFRJT04gLSBPICgjUENEQVRBKSo+DQotPCFBVFRMSVNUIE9QVElPTg0KLSAgICAgICAgU0VMRUNURUQgKFNFTEVDVEVEKSAjSU1QTElFRA0KLSAgICAgICAgVkFMVUUgQ0RBVEEgI0lNUExJRUQNCi0gICAgICAgICVTREFGT1JNOyAiTEl0ZW0iDQotICAgICAgICAlU0RBUFJFRjsNCi0gICAgICAgICJPcHRpb246ICNBdHRWYWwoVmFsdWUpICNBdHRWYWwoU2VsZWN0ZWQpIiAgICAgICAgDQotPg0KLTwhLS0gPE9QVElPTj4gICAgICBBIHNlbGVjdGlvbiBvcHRpb24gICAgICAgICAgIC0tPg0KLTwhLS0gPE9QVElPTiBTRUxFQ1RFRD4gICBJbml0aWFsIHN0YXRlICAgICAgLS0+DQotPCEtLSA8T1BUSU9OIFZBTFVFPSIuLi4iPiAgICAgICBGb3JtIGRhdHVtIHZhbHVlIGZvciB0aGlzIG9wdGlvbi0tPg0KLTwhRUxFTUVOVCBURVhUQVJFQSAtIC0gKCNQQ0RBVEEpKiAtKElOUFVUfFNFTEVDVHxURVhUQVJFQSk+DQotPCFBVFRMSVNUIFRFWFRBUkVBDQotICAgICAgICBOQU1FIENEQVRBICNSRVFVSVJFRA0KLSAgICAgICAgUk9XUyBOVU1CRVIgI1JFUVVJUkVEDQotICAgICAgICBDT0xTIE5VTUJFUiAjUkVRVUlSRUQNCi0gICAgICAgICVTREFGT1JNOyAiUGFyYSINCi0gICAgICAgICVTREFQUkVGOyAiSW5wdXQgVGV4dCAtLSAjQXR0VmFsKE5hbWUpOiAiDQotICAgICAgICA+DQotPCEtLSA8VEVYVEFSRUE+ICAgICAgICAgICAgICAgIEFuIGFyZWEgZm9yIHRleHQgaW5wdXQgICAgICAgICAgICAgICAtLT4NCi08IS0tIDxURVhUQVJFQSBOQU1FPS4uLj4gICAgICAgIE5hbWUgb2YgZm9ybSBkYXR1bSAgICAgICAgIC0tPg0KLTwhLS0gPFRFWFRBUkVBIFJPV1M9Li4uPiAgICAgICAgSGVpZ2h0IG9mIGFyZWEgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8VEVYVEFSRUEgQ09MUz0uLi4+ICAgICAgICBXaWR0aCBvZiBhcmVhICAgICAgICAgICAtLT4NCi1dXT4NCi08IS0tPT09PT09PSBEb2N1bWVudCBIZWFkID09PT09PT09PT09PT09PT09PT09PT0tLT4NCi08IVsgJUhUTUwuUmVjb21tZW5kZWQgWyAgICAgICAgDQotPCFFTlRJVFkgJSBoZWFkLmV4dHJhICIiPg0KLV1dPg0KLTwhRU5USVRZICUgaGVhZC5leHRyYSAiJiBORVhUSUQ/Ij4NCi08IUVOVElUWSAlIGhlYWQuY29udGVudCAiVElUTEUgJiBJU0lOREVYPyAmIEJBU0U/ICVoZWFkLmV4dHJhIj4NCi08IUVMRU1FTlQgSEVBRCBPIE8gICglaGVhZC5jb250ZW50KSArKE1FVEF8TElOSyk+DQotPCEtLSA8SEVBRD4gICAgIERvY3VtZW50IGhlYWQgICAtLT4NCi08IUVMRU1FTlQgVElUTEUgLSAtICAoI1BDREFUQSkqICAtKE1FVEF8TElOSyk+DQotPCFBVFRMSVNUIFRJVExFDQotICAgICAgICAlU0RBRk9STTsgIlRpIiAgICA+DQotPCEtLSA8VElUTEU+ICAgIFRpdGxlIG9mIGRvY3VtZW50IC0tPg0KLTwhRUxFTUVOVCBMSU5LIC0gTyBFTVBUWT4NCi08IUFUVExJU1QgTElOSw0KLSAgICAgICAgSFJFRiBDREFUQSAjUkVRVUlSRUQNCi0gICAgICAgICVsaW5rRXh0cmFBdHRyaWJ1dGVzOw0KLSAgICAgICAgJVNEQVBSRUY7ICJMaW5rZWQgdG8gOiAjQXR0VmFsIChUSVRMRSkgKFVSTikgKEhSRUYpPiIgICAgPg0KLTwhLS0gPExJTks+ICAgICAgICAgTGluayBmcm9tIHRoaXMgZG9jdW1lbnQgICAgICAgICAtLT4NCi08IS0tIDxMSU5LIEhSRUY9Ii4uLiI+ICBBZGRyZXNzIG9mIGxpbmsgZGVzdGluYXRpb24gICAgICAgICAgIC0tPg0KLTwhLS0gPExJTksgVVJOPSIuLi4iPiAgIExhc3RpbmcgbmFtZSBvZiBkZXN0aW5hdGlvbiAgICAgICAgICAgICAtLT4NCi08IS0tIDxMSU5LIFJFTD0uLi4+ICAgICBSZWxhdGlvbnNoaXAgdG8gZGVzdGluYXRpb24gICAgICAgICAtLT4NCi08IS0tIDxMSU5LIFJFVj0uLi4+ICAgICBSZWxhdGlvbnNoaXAgb2YgZGVzdGluYXRpb24gdG8gdGhpcyAgICAgICAgIC0tPg0KLTwhLS0gPExJTksgVElUTEU9Ii4uLiI+IFRpdGxlIG9mIGRlc3RpbmF0aW9uIChhZHZpc29yeSkgICAgICAgICAtLT4NCi08IS0tIDxMSU5LIE1FVEhPRFM9Ii4uLiI+IE9wZXJhdGlvbnMgYWxsb3dlZCAoYWR2aXNvcnkpICAgICAgICAgLS0+DQotPCFFTEVNRU5UIElTSU5ERVggLSBPIEVNUFRZPg0KLTwhQVRUTElTVCBJU0lOREVYDQotICAgICAgICAlU0RBUFJFRjsNCi0gICAiPFBhcmE+W0RvY3VtZW50IGlzIGluZGV4ZWQvc2VhcmNoYWJsZS5dPC9QYXJhPiI+DQotPCEtLSA8SVNJTkRFWD4gICAgICAgICAgRG9jdW1lbnQgaXMgYSBzZWFyY2hhYmxlIGluZGV4ICAgICAgICAgIC0tPg0KLTwhRUxFTUVOVCBCQVNFIC0gTyBFTVBUWT4NCi08IUFUVExJU1QgQkFTRQ0KLSAgICAgICAgSFJFRiBDREFUQSAjUkVRVUlSRUQgICAgID4NCi08IS0tIDxCQVNFPiAgICAgICAgICAgICBCYXNlIGNvbnRleHQgZG9jdW1lbnQgICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA8QkFTRSBIUkVGPSIuLi4iPiAgQWRkcmVzcyBmb3IgdGhpcyBkb2N1bWVudCAgICAgICAgICAgICAgIC0tPg0KLTwhRUxFTUVOVCBORVhUSUQgLSBPIEVNUFRZPg0KLTwhQVRUTElTVCBORVhUSUQNCi0gICAgICAgIE4gQ0RBVEEgI1JFUVVJUkVEICAgICA+DQotPCEtLSA8TkVYVElEPiAgICAgTmV4dCBJRCB0byB1c2UgZm9yIGxpbmsgbmFtZSAgICAgICAgIC0tPg0KLTwhLS0gPE5FWFRJRCBOPS4uLj4gICAgIE5leHQgSUQgdG8gdXNlIGZvciBsaW5rIG5hbWUgICAgICAgICAgICAgICAtLT4NCi08IUVMRU1FTlQgTUVUQSAtIE8gRU1QVFk+DQotPCFBVFRMSVNUIE1FVEENCi0gICAgICAgIEhUVFAtRVFVSVYgIE5BTUUgICAgI0lNUExJRUQNCi0gICAgICAgIE5BTUUgICAgICAgIE5BTUUgICAgI0lNUExJRUQNCi0gICAgICAgIENPTlRFTlQgICAgIENEQVRBICAgI1JFUVVJUkVEICAgID4NCi08IS0tIDxNRVRBPiAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWMgTWV0YS1pbmZvcm1hdGlvbiAgICAgICAgLS0+DQotPCEtLSA8TUVUQSBIVFRQLUVRVUlWPS4uLj4gICAgICBIVFRQIHJlc3BvbnNlIGhlYWRlciBuYW1lICAgICAgIC0tPg0KLTwhLS0gPE1FVEEgTkFNRT0uLi4+ICAgICAgICAgICAgTWV0YS1pbmZvcm1hdGlvbiBuYW1lICAgICAgICAgICAtLT4NCi08IS0tIDxNRVRBIENPTlRFTlQ9Ii4uLiI+ICAgICAgIEFzc29jaWF0ZWQgaW5mb3JtYXRpb24gICAgICAgICAgLS0+DQotPCEtLT09PT09PT0gRG9jdW1lbnQgU3RydWN0dXJlID09PT09PT09PT09PT09PT09LS0+DQotPCFbICVIVE1MLkRlcHJlY2F0ZWQgWw0KLSAgICAgICAgPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEJPRFksIFBMQUlOVEVYVD8iPg0KLV1dPg0KLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICJIRUFELCBCT0RZIj4NCi08IUVMRU1FTlQgSFRNTCBPIE8gICglaHRtbC5jb250ZW50KT4NCi08IUVOVElUWSAlIHZlcnNpb24uYXR0ciAiVkVSU0lPTiBDREFUQSAjRklYRUQgJyVIVE1MLlZlcnNpb247JyI+DQotPCFBVFRMSVNUIEhUTUwNCi0gICAgICAgICV2ZXJzaW9uLmF0dHI7DQotICAgICAgICAlU0RBRk9STTsgIkJvb2siDQotICAgICAgICA+DQotPCEtLSA8SFRNTD4gICAgICAgICAgICBIVE1MIERvY3VtZW50ICAgICAtLT4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2xvb3NlLmR0ZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvbG9vc2UuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDM5YmJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvbG9vc2UuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5MyArMCwwIEBACi08IS0tCi0gICAgVGhpcyBpcyB0aGUgSFRNTCA0LjAxIFRyYW5zaXRpb25hbCBEVEQsIHdoaWNoIGluY2x1ZGVzCi0gICAgcHJlc2VudGF0aW9uIGF0dHJpYnV0ZXMgYW5kIGVsZW1lbnRzIHRoYXQgVzNDIGV4cGVjdHMgdG8gcGhhc2Ugb3V0Ci0gICAgYXMgc3VwcG9ydCBmb3Igc3R5bGUgc2hlZXRzIG1hdHVyZXMuIEF1dGhvcnMgc2hvdWxkIHVzZSB0aGUgU3RyaWN0Ci0gICAgRFREIHdoZW4gcG9zc2libGUsIGJ1dCBtYXkgdXNlIHRoZSBUcmFuc2l0aW9uYWwgRFREIHdoZW4gc3VwcG9ydAotICAgIGZvciBwcmVzZW50YXRpb24gYXR0cmlidXRlIGFuZCBlbGVtZW50cyBpcyByZXF1aXJlZC4KLQotICAgIEhUTUwgNCBpbmNsdWRlcyBtZWNoYW5pc21zIGZvciBzdHlsZSBzaGVldHMsIHNjcmlwdGluZywKLSAgICBlbWJlZGRpbmcgb2JqZWN0cywgaW1wcm92ZWQgc3VwcG9ydCBmb3IgcmlnaHQgdG8gbGVmdCBhbmQgbWl4ZWQKLSAgICBkaXJlY3Rpb24gdGV4dCwgYW5kIGVuaGFuY2VtZW50cyB0byBmb3JtcyBmb3IgaW1wcm92ZWQKLSAgICBhY2Nlc3NpYmlsaXR5IGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMuCi0KLSAgICAgICAgICBEcmFmdDogJERhdGU6IDE5OTkvMTIvMjQgMjI6NDA6MzUgJAotCi0gICAgICAgICAgQXV0aG9yczoKLSAgICAgICAgICAgICAgRGF2ZSBSYWdnZXR0IDxkc3JAdzMub3JnPgotICAgICAgICAgICAgICBBcm5hdWQgTGUgSG9ycyA8bGVob3JzQHczLm9yZz4KLSAgICAgICAgICAgICAgSWFuIEphY29icyA8aWpAdzMub3JnPgotCi0gICAgRnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBIVE1MIDQuMDEgaXMgYXZhaWxhYmxlIGF0OgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQKLQotCi0gICAgVGhlIEhUTUwgNC4wMSBzcGVjaWZpY2F0aW9uIGluY2x1ZGVzIGFkZGl0aW9uYWwKLSAgICBzeW50YWN0aWMgY29uc3RyYWludHMgdGhhdCBjYW5ub3QgYmUgZXhwcmVzc2VkIHdpdGhpbgotICAgIHRoZSBEVERzLgotCi0tLT4KLTwhRU5USVRZICUgSFRNTC5WZXJzaW9uICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSAgLS0gVHlwaWNhbCB1c2FnZToKLQotICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLSAgICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAuLi4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgLi4uCi0gICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLQotICAgIFRoZSBVUkkgdXNlZCBhcyBhIHN5c3RlbSBpZGVudGlmaWVyIHdpdGggdGhlIHB1YmxpYyBpZGVudGlmaWVyIGFsbG93cwotICAgIHRoZSB1c2VyIGFnZW50IHRvIGRvd25sb2FkIHRoZSBEVEQgYW5kIGVudGl0eSBzZXRzIGFzIG5lZWRlZC4KLQotICAgIFRoZSBGUEkgZm9yIHRoZSBTdHJpY3QgSFRNTCA0LjAxIERURCBpczoKLQotICAgICAgICAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKLQotICAgIFRoaXMgdmVyc2lvbiBvZiB0aGUgc3RyaWN0IERURCBpczoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L3N0cmljdC5kdGQKLQotICAgIEF1dGhvcnMgc2hvdWxkIHVzZSB0aGUgU3RyaWN0IERURCB1bmxlc3MgdGhleSBuZWVkIHRoZQotICAgIHByZXNlbnRhdGlvbiBjb250cm9sIGZvciB1c2VyIGFnZW50cyB0aGF0IGRvbid0IChhZGVxdWF0ZWx5KQotICAgIHN1cHBvcnQgc3R5bGUgc2hlZXRzLgotCi0gICAgSWYgeW91IGFyZSB3cml0aW5nIGEgZG9jdW1lbnQgdGhhdCBpbmNsdWRlcyBmcmFtZXMsIHVzZSAKLSAgICB0aGUgZm9sbG93aW5nIEZQSToKLQotICAgICAgICAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiIKLQotICAgIFRoaXMgdmVyc2lvbiBvZiB0aGUgZnJhbWVzZXQgRFREIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvZnJhbWVzZXQuZHRkCi0KLSAgICBVc2UgdGhlIGZvbGxvd2luZyAocmVsYXRpdmUpIFVSSXMgdG8gcmVmZXIgdG8gCi0gICAgdGhlIERURHMgYW5kIGVudGl0eSBkZWZpbml0aW9ucyBvZiB0aGlzIHNwZWNpZmljYXRpb246Ci0KLSAgICAic3RyaWN0LmR0ZCIKLSAgICAibG9vc2UuZHRkIgotICAgICJmcmFtZXNldC5kdGQiCi0gICAgIkhUTUxsYXQxLmVudCIKLSAgICAiSFRNTHN5bWJvbC5lbnQiCi0gICAgIkhUTUxzcGVjaWFsLmVudCIKLQotLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSW1wb3J0ZWQgTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEZlYXR1cmUgU3dpdGNoIGZvciBmcmFtZXNldCBkb2N1bWVudHMgLS0+Ci08IUVOVElUWSAlIEhUTUwuRnJhbWVzZXQgIklHTk9SRSI+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGUgIkNEQVRBIgotICAgIC0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDb250ZW50VHlwZXMgIkNEQVRBIgotICAgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldCAiQ0RBVEEiCi0gICAgLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0cyAiQ0RBVEEiCi0gICAgLS0gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTGFuZ3VhZ2VDb2RlICJOQU1FIgotICAgIC0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMxNzY2XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJhY3RlciAiQ0RBVEEiCi0gICAgLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBMaW5rVHlwZXMgIkNEQVRBIgotICAgIC0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBNZWRpYURlc2MgIkNEQVRBIgotICAgIC0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycwotICAgIC0tPgotCi08IUVOVElUWSAlIFVSSSAiQ0RBVEEiCi0gICAgLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsCi0gICAgICAgc2VlIFtVUkldCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgRGF0ZXRpbWUgIkNEQVRBIiAtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci0KLQotPCFFTlRJVFkgJSBTY3JpcHQgIkNEQVRBIiAtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLQotPCFFTlRJVFkgJSBTdHlsZVNoZWV0ICJDREFUQSIgLS0gc3R5bGUgc2hlZXQgZGF0YSAtLT4KLQotPCFFTlRJVFkgJSBGcmFtZVRhcmdldCAiQ0RBVEEiIC0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tPgotCi0KLTwhRU5USVRZICUgVGV4dCAiQ0RBVEEiPgotCi0KLTwhLS0gUGFyYW1ldGVyIEVudGl0aWVzIC0tPgotCi08IUVOVElUWSAlIGhlYWQubWlzYyAiU0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1QiIC0tIHJlcGVhdGFibGUgaGVhZCBlbGVtZW50cyAtLT4KLQotPCFFTlRJVFkgJSBoZWFkaW5nICJIMXxIMnxIM3xINHxINXxINiI+Ci0KLTwhRU5USVRZICUgbGlzdCAiVUwgfCBPTCB8ICBESVIgfCBNRU5VIj4KLQotPCFFTlRJVFkgJSBwcmVmb3JtYXR0ZWQgIlBSRSI+Ci0KLTwhRU5USVRZICUgQ29sb3IgIkNEQVRBIiAtLSBhIGNvbG9yIHVzaW5nIHNSR0I6ICNSUkdHQkIgYXMgSGV4IHZhbHVlcyAtLT4KLQotPCEtLSBUaGVyZSBhcmUgYWxzbyAxNiB3aWRlbHkga25vd24gY29sb3IgbmFtZXMgd2l0aCB0aGVpciBzUkdCIHZhbHVlczoKLQotICAgIEJsYWNrICA9ICMwMDAwMDAgICAgR3JlZW4gID0gIzAwODAwMAotICAgIFNpbHZlciA9ICNDMEMwQzAgICAgTGltZSAgID0gIzAwRkYwMAotICAgIEdyYXkgICA9ICM4MDgwODAgICAgT2xpdmUgID0gIzgwODAwMAotICAgIFdoaXRlICA9ICNGRkZGRkYgICAgWWVsbG93ID0gI0ZGRkYwMAotICAgIE1hcm9vbiA9ICM4MDAwMDAgICAgTmF2eSAgID0gIzAwMDA4MAotICAgIFJlZCAgICA9ICNGRjAwMDAgICAgQmx1ZSAgID0gIzAwMDBGRgotICAgIFB1cnBsZSA9ICM4MDAwODAgICAgVGVhbCAgID0gIzAwODA4MAotICAgIEZ1Y2hzaWE9ICNGRjAwRkYgICAgQXF1YSAgID0gIzAwRkZGRgotIC0tPgotCi08IUVOVElUWSAlIGJvZHljb2xvcnMgIgotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQgYmFja2dyb3VuZCBjb2xvciAtLQotICB0ZXh0ICAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQgdGV4dCBjb2xvciAtLQotICBsaW5rICAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gY29sb3Igb2YgbGlua3MgLS0KLSAgdmxpbmsgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGNvbG9yIG9mIHZpc2l0ZWQgbGlua3MgLS0KLSAgYWxpbmsgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGNvbG9yIG9mIHNlbGVjdGVkIGxpbmtzIC0tCi0gICI+Ci0KLTwhLS09PT09PT09PT09PT09PT09IENoYXJhY3RlciBtbmVtb25pYyBlbnRpdGllcyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbjEvL0VOLy9IVE1MIgotICAgIkhUTUxsYXQxLmVudCI+Ci0lSFRNTGxhdDE7Ci0KLTwhRU5USVRZICUgSFRNTHN5bWJvbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMvL0VOLy9IVE1MIgotICAgIkhUTUxzeW1ib2wuZW50Ij4KLSVIVE1Mc3ltYm9sOwotCi08IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbC8vRU4vL0hUTUwiCi0gICAiSFRNTHNwZWNpYWwuZW50Ij4KLSVIVE1Mc3BlY2lhbDsKLTwhLS09PT09PT09PT09PT09PT09PT09IEdlbmVyaWMgQXR0cmlidXRlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgY29yZWF0dHJzCi0gImlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcyAtLQotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRCAgLS0gYXNzb2NpYXRlZCBzdHlsZSBpbmZvIC0tCi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBhZHZpc29yeSB0aXRsZSAtLSIKLSAgPgotCi08IUVOVElUWSAlIGkxOG4KLSAibGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI0lNUExJRUQgIC0tIGRpcmVjdGlvbiBmb3Igd2Vhay9uZXV0cmFsIHRleHQgLS0iCi0gID4KLQotPCFFTlRJVFkgJSBldmVudHMKLSAib25jbGljayAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGNsaWNrZWQgLS0KLSAgb25kYmxjbGljayAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGRvdWJsZSBjbGlja2VkLS0KLSAgb25tb3VzZWRvd24gJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIHByZXNzZWQgZG93biAtLQotICBvbm1vdXNldXAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIGJ1dHRvbiB3YXMgcmVsZWFzZWQgLS0KLSAgb25tb3VzZW92ZXIgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgb250byAtLQotICBvbm1vdXNlbW92ZSAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIHdhcyBtb3ZlZCB3aXRoaW4gLS0KLSAgb25tb3VzZW91dCAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgYXdheSAtLQotICBvbmtleXByZXNzICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHByZXNzZWQgYW5kIHJlbGVhc2VkIC0tCi0gIG9ua2V5ZG93biAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcHJlc3NlZCBkb3duIC0tCi0gIG9ua2V5dXAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcmVsZWFzZWQgLS0iCi0gID4KLQotPCEtLSBSZXNlcnZlZCBGZWF0dXJlIFN3aXRjaCAtLT4KLTwhRU5USVRZICUgSFRNTC5SZXNlcnZlZCAiSUdOT1JFIj4KLQotPCEtLSBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tPgotPCFbICVIVE1MLlJlc2VydmVkOyBbCi08IUVOVElUWSAlIHJlc2VydmVkCi0gImRhdGFzcmMgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBhIHNpbmdsZSBvciB0YWJ1bGFyIERhdGEgU291cmNlIC0tCi0gIGRhdGFmbGQgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSB0aGUgcHJvcGVydHkgb3IgY29sdW1uIG5hbWUgLS0KLSAgZGF0YWZvcm1hdGFzIChwbGFpbnRleHR8aHRtbCkgcGxhaW50ZXh0IC0tIHRleHQgb3IgaHRtbCAtLSIKLSAgPgotXV0+Ci0KLTwhRU5USVRZICUgcmVzZXJ2ZWQgIiI+Ci0KLTwhRU5USVRZICUgYXR0cnMgIiVjb3JlYXR0cnM7ICVpMThuOyAlZXZlbnRzOyI+Ci0KLTwhRU5USVRZICUgYWxpZ24gImFsaWduIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5KSAgI0lNUExJRUQiCi0gICAgICAgICAgICAgICAgICAgLS0gZGVmYXVsdCBpcyBsZWZ0IGZvciBsdHIgcGFyYWdyYXBocywgcmlnaHQgZm9yIHJ0bCAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgTWFya3VwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgZm9udHN0eWxlCi0gIlRUIHwgSSB8IEIgfCBVIHwgUyB8IFNUUklLRSB8IEJJRyB8IFNNQUxMIj4KLQotPCFFTlRJVFkgJSBwaHJhc2UgIkVNIHwgU1RST05HIHwgREZOIHwgQ09ERSB8Ci0gICAgICAgICAgICAgICAgICAgU0FNUCB8IEtCRCB8IFZBUiB8IENJVEUgfCBBQkJSIHwgQUNST05ZTSIgPgotCi08IUVOVElUWSAlIHNwZWNpYWwKLSAgICJBIHwgSU1HIHwgQVBQTEVUIHwgT0JKRUNUIHwgRk9OVCB8IEJBU0VGT05UIHwgQlIgfCBTQ1JJUFQgfAotICAgIE1BUCB8IFEgfCBTVUIgfCBTVVAgfCBTUEFOIHwgQkRPIHwgSUZSQU1FIj4KLQotPCFFTlRJVFkgJSBmb3JtY3RybCAiSU5QVVQgfCBTRUxFQ1QgfCBURVhUQVJFQSB8IExBQkVMIHwgQlVUVE9OIj4KLQotPCEtLSAlaW5saW5lOyBjb3ZlcnMgaW5saW5lIG9yICJ0ZXh0LWxldmVsIiBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgaW5saW5lICIjUENEQVRBIHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVzcGVjaWFsOyB8ICVmb3JtY3RybDsiPgotCi08IUVMRU1FTlQgKCVmb250c3R5bGU7fCVwaHJhc2U7KSAtIC0gKCVpbmxpbmU7KSo+Ci08IUFUVExJU1QgKCVmb250c3R5bGU7fCVwaHJhc2U7KQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgKFNVQnxTVVApIC0gLSAoJWlubGluZTspKiAgICAtLSBzdWJzY3JpcHQsIHN1cGVyc2NyaXB0IC0tPgotPCFBVFRMSVNUIChTVUJ8U1VQKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgU1BBTiAtIC0gKCVpbmxpbmU7KSogICAgICAgICAtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBTUEFOCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlcmVzZXJ2ZWQ7CQkJICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIEJETyAtIC0gKCVpbmxpbmU7KSogICAgICAgICAgLS0gSTE4TiBCaURpIG92ZXItcmlkZSAtLT4KLTwhQVRUTElTVCBCRE8KLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNSRVFVSVJFRCAtLSBkaXJlY3Rpb25hbGl0eSAtLQotICA+Ci0KLTwhRUxFTUVOVCBCQVNFRk9OVCAtIE8gRU1QVFkgICAgICAgICAgIC0tIGJhc2UgZm9udCBzaXplIC0tPgotPCFBVFRMSVNUIEJBU0VGT05UCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gYmFzZSBmb250IHNpemUgZm9yIEZPTlQgZWxlbWVudHMgLS0KLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIHRleHQgY29sb3IgLS0KLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZvbnQgbmFtZXMgLS0KLSAgPgotCi08IUVMRU1FTlQgRk9OVCAtIC0gKCVpbmxpbmU7KSogICAgICAgICAtLSBsb2NhbCBjaGFuZ2UgdG8gZm9udCAtLT4KLTwhQVRUTElTVCBGT05UCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICAlaTE4bjsJCSAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gWyt8LV1ubiBlLmcuIHNpemU9IisxIiwgc2l6ZT0iNCIgLS0KLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIHRleHQgY29sb3IgLS0KLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZvbnQgbmFtZXMgLS0KLSAgPgotCi08IUVMRU1FTlQgQlIgLSBPIEVNUFRZICAgICAgICAgICAgICAgICAtLSBmb3JjZWQgbGluZSBicmVhayAtLT4KLTwhQVRUTElTVCBCUgotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgY2xlYXIgICAgICAgKGxlZnR8YWxsfHJpZ2h0fG5vbmUpIG5vbmUgLS0gY29udHJvbCBvZiB0ZXh0IGZsb3cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEhUTUwgY29udGVudCBtb2RlbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gICAgSFRNTCBoYXMgdHdvIGJhc2ljIGNvbnRlbnQgbW9kZWxzOgotCi0gICAgICAgICVpbmxpbmU7ICAgICBjaGFyYWN0ZXIgbGV2ZWwgZWxlbWVudHMgYW5kIHRleHQgc3RyaW5ncwotICAgICAgICAlYmxvY2s7ICAgICAgYmxvY2stbGlrZSBlbGVtZW50cyBlLmcuIHBhcmFncmFwaHMgYW5kIGxpc3RzCi0tLT4KLQotPCFFTlRJVFkgJSBibG9jawotICAgICAiUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBDRU5URVIgfAotICAgICAgTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLSAgICAgIFRBQkxFIHwgRklFTERTRVQgfCBBRERSRVNTIj4KLQotPCFFTlRJVFkgJSBmbG93ICIlYmxvY2s7IHwgJWlubGluZTsiPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBEb2N1bWVudCBCb2R5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQk9EWSBPIE8gKCVmbG93OykqICsoSU5TfERFTCkgLS0gZG9jdW1lbnQgYm9keSAtLT4KLTwhQVRUTElTVCBCT0RZCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBvbmxvYWQgICAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIGxvYWRlZCAtLQotICBvbnVubG9hZCAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIHJlbW92ZWQgLS0KLSAgYmFja2dyb3VuZCAgICAgICVVUkk7ICAgICAgI0lNUExJRUQgIC0tIHRleHR1cmUgdGlsZSBmb3IgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgLS0KLSAgJWJvZHljb2xvcnM7ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGJnY29sb3IsIHRleHQsIGxpbmssIHZsaW5rLCBhbGluayAtLQotICA+Ci0KLTwhRUxFTUVOVCBBRERSRVNTIC0gLSAoKCVpbmxpbmU7KXxQKSogIC0tIGluZm9ybWF0aW9uIG9uIGF1dGhvciAtLT4KLTwhQVRUTElTVCBBRERSRVNTCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBESVYgLSAtICglZmxvdzspKiAgICAgICAgICAgIC0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIERJVgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFsaWduLCB0ZXh0IGFsaWdubWVudCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgQ0VOVEVSIC0gLSAoJWZsb3c7KSogICAgICAgICAtLSBzaG9ydGhhbmQgZm9yIERJViBhbGlnbj1jZW50ZXIgLS0+Ci08IUFUVExJU1QgQ0VOVEVSCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgU2hhcGUgIihyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpIj4KLTwhRU5USVRZICUgQ29vcmRzICJDREFUQSIgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLT4KLQotPCFFTEVNRU5UIEEgLSAtICglaW5saW5lOykqIC0oQSkgICAgICAgLS0gYW5jaG9yIC0tPgotPCFBVFRMSVNUIEEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgY29udGVudCB0eXBlIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lZCBsaW5rIGVuZCAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQgIC0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tCi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSBmb3J3YXJkIGxpbmsgdHlwZXMgLS0KLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIHJldmVyc2UgbGluayB0eXBlcyAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBmb3IgdXNlIHdpdGggY2xpZW50LXNpZGUgaW1hZ2UgbWFwcyAtLQotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRCAgLS0gZm9yIHVzZSB3aXRoIGNsaWVudC1zaWRlIGltYWdlIG1hcHMgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDbGllbnQtc2lkZSBpbWFnZSBtYXBzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBUaGVzZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRvY3VtZW50IG9yIGdyb3VwZWQgaW4gYQotICAgICBzZXBhcmF0ZSBkb2N1bWVudCBhbHRob3VnaCB0aGlzIGlzbid0IHlldCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IUVMRU1FTlQgTUFQIC0gLSAoKCVibG9jazspIHwgQVJFQSkrIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLT4KLTwhQVRUTElTVCBNQVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBmb3IgcmVmZXJlbmNlIGJ5IHVzZW1hcCAtLQotICA+Ci0KLTwhRUxFTUVOVCBBUkVBIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCBhcmVhIC0tPgotPCFBVFRMSVNUIEFSRUEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBjb250cm9scyBpbnRlcnByZXRhdGlvbiBvZiBjb29yZHMgLS0KLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVEICAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLQotICBub2hyZWYgICAgICAobm9ocmVmKSAgICAgICAjSU1QTElFRCAgLS0gdGhpcyByZWdpb24gaGFzIG5vIGFjdGlvbiAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBMSU5LIEVsZW1lbnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFJlbGF0aW9uc2hpcCB2YWx1ZXMgY2FuIGJlIHVzZWQgaW4gcHJpbmNpcGxlOgotCi0gICBhKSBmb3IgZG9jdW1lbnQgc3BlY2lmaWMgdG9vbGJhcnMvbWVudXMgd2hlbiB1c2VkCi0gICAgICB3aXRoIHRoZSBMSU5LIGVsZW1lbnQgaW4gZG9jdW1lbnQgaGVhZCBlLmcuCi0gICAgICAgIHN0YXJ0LCBjb250ZW50cywgcHJldmlvdXMsIG5leHQsIGluZGV4LCBlbmQsIGhlbHAKLSAgIGIpIHRvIGxpbmsgdG8gYSBzZXBhcmF0ZSBzdHlsZSBzaGVldCAocmVsPXN0eWxlc2hlZXQpCi0gICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPXNjcmlwdCkKLSAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mCi0gICAgICBodG1sIG5vZGVzIGFyZSByZW5kZXJlZCBpbnRvIHByaW50ZWQgZG9jdW1lbnRzCi0gICBlKSB0byBtYWtlIGEgbGluayB0byBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIGUuZy4gYSBwb3N0c2NyaXB0IG9yIHBkZiB2ZXJzaW9uIChyZWw9YWx0ZXJuYXRlIG1lZGlhPXByaW50KQotLS0+Ci0KLTwhRUxFTUVOVCBMSU5LIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGEgbWVkaWEtaW5kZXBlbmRlbnQgbGluayAtLT4KLTwhQVRUTElTVCBMSU5LCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRCAgLS0gY2hhciBlbmNvZGluZyBvZiBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIGhyZWZsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBhZHZpc29yeSBjb250ZW50IHR5cGUgLS0KLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIGZvcndhcmQgbGluayB0eXBlcyAtLQotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gcmV2ZXJzZSBsaW5rIHR5cGVzIC0tCi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVEICAtLSBmb3IgcmVuZGVyaW5nIG9uIHRoZXNlIG1lZGlhIC0tCi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVEICAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEltYWdlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gTGVuZ3RoIGRlZmluZWQgaW4gc3RyaWN0IERURCBmb3IgY2VsbHBhZGRpbmcvY2VsbHNwYWNpbmcgLS0+Ci08IUVOVElUWSAlIExlbmd0aCAiQ0RBVEEiIC0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhRU5USVRZICUgTXVsdGlMZW5ndGggIkNEQVRBIiAtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci0KLTwhWyAlSFRNTC5GcmFtZXNldDsgWwotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aHMgIkNEQVRBIiAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBNdWx0aUxlbmd0aCAtLT4KLV1dPgotCi08IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiIC0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci0KLTwhRU5USVRZICUgSUFsaWduICIodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkiIC0tIGNlbnRlcj8gLS0+Ci0KLTwhLS0gVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0ZXh0LW9ubHkgVUFzIGFzIHdlbGwgYXMgCi0gICB0byBtYWtlIGltYWdlIGNvbnRlbnQgdW5kZXJzdGFuZGFibGUgYW5kIG5hdmlnYWJsZSAKLSAgIHRvIHVzZXJzIG9mIG5vbi12aXN1YWwgVUFzLCB5b3UgbmVlZCB0byBwcm92aWRlCi0gICBhIGRlc2NyaXB0aW9uIHdpdGggQUxULCBhbmQgYXZvaWQgc2VydmVyLXNpZGUgaW1hZ2UgbWFwcyAtLT4KLTwhRUxFTUVOVCBJTUcgLSBPIEVNUFRZICAgICAgICAgICAgICAgIC0tIEVtYmVkZGVkIGltYWdlIC0tPgotPCFBVFRMSVNUIElNRwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIFVSSSBvZiBpbWFnZSB0byBlbWJlZCAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGxpbmsgdG8gbG9uZyBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZW1lbnRzIGFsdCkgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgaW1hZ2UgZm9yIHNjcmlwdGluZyAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgaGVpZ2h0IC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSB3aWR0aCAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRCAgLS0gdXNlIHNlcnZlci1zaWRlIGltYWdlIG1hcCAtLQotICBhbGlnbiAgICAgICAlSUFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGxpbmsgYm9yZGVyIHdpZHRoIC0tCi0gIGhzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBob3Jpem9udGFsIGd1dHRlciAtLQotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgZ3V0dGVyIC0tCi0gID4KLQotPCEtLSBVU0VNQVAgcG9pbnRzIHRvIGEgTUFQIGVsZW1lbnQgd2hpY2ggbWF5IGJlIGluIHRoaXMgZG9jdW1lbnQKLSAgb3IgYW4gZXh0ZXJuYWwgZG9jdW1lbnQsIGFsdGhvdWdoIHRoZSBsYXR0ZXIgaXMgbm90IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PSBPQkpFQ1QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0KLSAgT0JKRUNUIGlzIHVzZWQgdG8gZW1iZWQgb2JqZWN0cyBhcyBwYXJ0IG9mIEhUTUwgcGFnZXMgCi0gIFBBUkFNIGVsZW1lbnRzIHNob3VsZCBwcmVjZWRlIG90aGVyIGNvbnRlbnQuIFNHTUwgbWl4ZWQgY29udGVudAotICBtb2RlbCB0ZWNobmljYWxpdHkgcHJlY2x1ZGVzIHNwZWNpZnlpbmcgdGhpcyBmb3JtYWxseSAuLi4KLS0tPgotCi08IUVMRU1FTlQgT0JKRUNUIC0gLSAoUEFSQU0gfCAlZmxvdzspKgotIC0tIGdlbmVyaWMgZW1iZWRkZWQgb2JqZWN0IC0tPgotPCFBVFRMSVNUIE9CSkVDVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgZGVjbGFyZSAgICAgKGRlY2xhcmUpICAgICAgI0lNUExJRUQgIC0tIGRlY2xhcmUgYnV0IGRvbid0IGluc3RhbnRpYXRlIGZsYWcgLS0KLSAgY2xhc3NpZCAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGlkZW50aWZpZXMgYW4gaW1wbGVtZW50YXRpb24gLS0KLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGJhc2UgVVJJIGZvciBjbGFzc2lkLCBkYXRhLCBhcmNoaXZlLS0KLSAgZGF0YSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHJlZmVyZW5jZSB0byBvYmplY3QncyBkYXRhIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIGRhdGEgLS0KLSAgY29kZXR5cGUgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGNvbnRlbnQgdHlwZSBmb3IgY29kZSAtLQotICBhcmNoaXZlICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgVVJJcyAtLQotICBzdGFuZGJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gbWVzc2FnZSB0byBzaG93IHdoaWxlIGxvYWRpbmcgLS0KLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIGhlaWdodCAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgd2lkdGggLS0KLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHN1Ym1pdCBhcyBwYXJ0IG9mIGZvcm0gLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWxpZ24gICAgICAgJUlBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBsaW5rIGJvcmRlciB3aWR0aCAtLQotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gaG9yaXpvbnRhbCBndXR0ZXIgLS0KLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIGd1dHRlciAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgUEFSQU0gLSBPIEVNUFRZICAgICAgICAgICAgICAtLSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZSAtLT4KLTwhQVRUTElTVCBQQVJBTQotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVEIC0tIHByb3BlcnR5IG5hbWUgLS0KLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHByb3BlcnR5IHZhbHVlIC0tCi0gIHZhbHVldHlwZSAgIChEQVRBfFJFRnxPQkpFQ1QpIERBVEEgICAtLSBIb3cgdG8gaW50ZXJwcmV0IHZhbHVlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHZhbHVldHlwZT1yZWYgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBKYXZhIEFQUExFVCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIE9uZSBvZiBjb2RlIG9yIG9iamVjdCBhdHRyaWJ1dGVzIG11c3QgYmUgcHJlc2VudC4KLSAgUGxhY2UgUEFSQU0gZWxlbWVudHMgYmVmb3JlIG90aGVyIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBBUFBMRVQgLSAtIChQQVJBTSB8ICVmbG93OykqIC0tIEphdmEgYXBwbGV0IC0tPgotPCFBVFRMSVNUIEFQUExFVAotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIG9wdGlvbmFsIGJhc2UgVVJJIGZvciBhcHBsZXQgLS0KLSAgYXJjaGl2ZSAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBhcmNoaXZlIGxpc3QgLS0KLSAgY29kZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGFwcGxldCBjbGFzcyBmaWxlIC0tCi0gIG9iamVjdCAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzZXJpYWxpemVkIGFwcGxldCBmaWxlIC0tCi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gYWxsb3dzIGFwcGxldHMgdG8gZmluZCBlYWNoIG90aGVyIC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNSRVFVSVJFRCAtLSBpbml0aWFsIHdpZHRoIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNSRVFVSVJFRCAtLSBpbml0aWFsIGhlaWdodCAtLQotICBhbGlnbiAgICAgICAlSUFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGhvcml6b250YWwgZ3V0dGVyIC0tCi0gIHZzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBndXR0ZXIgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIb3Jpem9udGFsIFJ1bGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgSFIgLSBPIEVNUFRZIC0tIGhvcml6b250YWwgcnVsZSAtLT4KLTwhQVRUTElTVCBIUgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWxpZ24gICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRAotICBub3NoYWRlICAgICAobm9zaGFkZSkgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFBhcmFncmFwaHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBQIC0gTyAoJWlubGluZTspKiAgICAgICAgICAgIC0tIHBhcmFncmFwaCAtLT4KLTwhQVRUTElTVCBQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gYWxpZ24sIHRleHQgYWxpZ25tZW50IC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSGVhZGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBUaGVyZSBhcmUgc2l4IGxldmVscyBvZiBoZWFkaW5ncyBmcm9tIEgxICh0aGUgbW9zdCBpbXBvcnRhbnQpCi0gIHRvIEg2ICh0aGUgbGVhc3QgaW1wb3J0YW50KS4KLS0tPgotCi08IUVMRU1FTlQgKCVoZWFkaW5nOykgIC0gLSAoJWlubGluZTspKiAtLSBoZWFkaW5nIC0tPgotPCFBVFRMSVNUICglaGVhZGluZzspCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gYWxpZ24sIHRleHQgYWxpZ25tZW50IC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUHJlZm9ybWF0dGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBleGNsdWRlcyBtYXJrdXAgZm9yIGltYWdlcyBhbmQgY2hhbmdlcyBpbiBmb250IHNpemUgLS0+Ci08IUVOVElUWSAlIHByZS5leGNsdXNpb24gIklNR3xPQkpFQ1R8QVBQTEVUfEJJR3xTTUFMTHxTVUJ8U1VQfEZPTlR8QkFTRUZPTlQiPgotCi08IUVMRU1FTlQgUFJFIC0gLSAoJWlubGluZTspKiAtKCVwcmUuZXhjbHVzaW9uOykgLS0gcHJlZm9ybWF0dGVkIHRleHQgLS0+Ci08IUFUVExJU1QgUFJFCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICB3aWR0aCAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT0gSW5saW5lIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBRIC0gLSAoJWlubGluZTspKiAgICAgICAgICAgIC0tIHNob3J0IGlubGluZSBxdW90YXRpb24gLS0+Ci08IUFUVExJU1QgUQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3Igc291cmNlIGRvY3VtZW50IG9yIG1zZyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEJsb2NrLWxpa2UgUXVvdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBCTE9DS1FVT1RFIC0gLSAoJWZsb3c7KSogICAgIC0tIGxvbmcgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIEJMT0NLUVVPVEUKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIHNvdXJjZSBkb2N1bWVudCBvciBtc2cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbnNlcnRlZC9EZWxldGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0KLTwhLS0gSU5TL0RFTCBhcmUgaGFuZGxlZCBieSBpbmNsdXNpb24gb24gQk9EWSAtLT4KLTwhRUxFTUVOVCAoSU5TfERFTCkgLSAtICglZmxvdzspKiAgICAgIC0tIGluc2VydGVkIHRleHQsIGRlbGV0ZWQgdGV4dCAtLT4KLTwhQVRUTElTVCAoSU5TfERFTCkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBpbmZvIG9uIHJlYXNvbiBmb3IgY2hhbmdlIC0tCi0gIGRhdGV0aW1lICAgICVEYXRldGltZTsgICAgICNJTVBMSUVEICAtLSBkYXRlIGFuZCB0aW1lIG9mIGNoYW5nZSAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IExpc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZGVmaW5pdGlvbiBsaXN0cyAtIERUIGZvciB0ZXJtLCBERCBmb3IgaXRzIGRlZmluaXRpb24gLS0+Ci0KLTwhRUxFTUVOVCBETCAtIC0gKERUfEREKSsgICAgICAgICAgICAgIC0tIGRlZmluaXRpb24gbGlzdCAtLT4KLTwhQVRUTElTVCBETAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQgIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgPgotCi08IUVMRU1FTlQgRFQgLSBPICglaW5saW5lOykqICAgICAgICAgICAtLSBkZWZpbml0aW9uIHRlcm0gLS0+Ci08IUVMRU1FTlQgREQgLSBPICglZmxvdzspKiAgICAgICAgICAgICAtLSBkZWZpbml0aW9uIGRlc2NyaXB0aW9uIC0tPgotPCFBVFRMSVNUIChEVHxERCkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLSBPcmRlcmVkIGxpc3RzIChPTCkgTnVtYmVyaW5nIHN0eWxlCi0KLSAgICAxICAgYXJhYmxpYyBudW1iZXJzICAgICAxLCAyLCAzLCAuLi4KLSAgICBhICAgbG93ZXIgYWxwaGEgICAgICAgICBhLCBiLCBjLCAuLi4KLSAgICBBICAgdXBwZXIgYWxwaGEgICAgICAgICBBLCBCLCBDLCAuLi4KLSAgICBpICAgbG93ZXIgcm9tYW4gICAgICAgICBpLCBpaSwgaWlpLCAuLi4KLSAgICBJICAgdXBwZXIgcm9tYW4gICAgICAgICBJLCBJSSwgSUlJLCAuLi4KLQotICAgIFRoZSBzdHlsZSBpcyBhcHBsaWVkIHRvIHRoZSBzZXF1ZW5jZSBudW1iZXIgd2hpY2ggYnkgZGVmYXVsdAotICAgIGlzIHJlc2V0IHRvIDEgZm9yIHRoZSBmaXJzdCBsaXN0IGl0ZW0gaW4gYW4gb3JkZXJlZCBsaXN0LgotCi0gICAgVGhpcyBjYW4ndCBiZSBleHByZXNzZWQgZGlyZWN0bHkgaW4gU0dNTCBkdWUgdG8gY2FzZSBmb2xkaW5nLgotLS0+Ci0KLTwhRU5USVRZICUgT0xTdHlsZSAiQ0RBVEEiICAgICAgLS0gY29uc3RyYWluZWQgdG86ICIoMXxhfEF8aXxJKSIgLS0+Ci0KLTwhRUxFTUVOVCBPTCAtIC0gKExJKSsgICAgICAgICAgICAgICAgIC0tIG9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBPTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJU9MU3R5bGU7ICAgICAgI0lNUExJRUQgIC0tIG51bWJlcmluZyBzdHlsZSAtLQotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRCAgLS0gcmVkdWNlZCBpbnRlcml0ZW0gc3BhY2luZyAtLQotICBzdGFydCAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIC0tCi0gID4KLQotPCEtLSBVbm9yZGVyZWQgTGlzdHMgKFVMKSBidWxsZXQgc3R5bGVzIC0tPgotPCFFTlRJVFkgJSBVTFN0eWxlICIoZGlzY3xzcXVhcmV8Y2lyY2xlKSI+Ci0KLTwhRUxFTUVOVCBVTCAtIC0gKExJKSsgICAgICAgICAgICAgICAgIC0tIHVub3JkZXJlZCBsaXN0IC0tPgotPCFBVFRMSVNUIFVMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICB0eXBlICAgICAgICAlVUxTdHlsZTsgICAgICAjSU1QTElFRCAgLS0gYnVsbGV0IHN0eWxlIC0tCi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVEICAtLSByZWR1Y2VkIGludGVyaXRlbSBzcGFjaW5nIC0tCi0gID4KLQotPCFFTEVNRU5UIChESVJ8TUVOVSkgLSAtIChMSSkrIC0oJWJsb2NrOykgLS0gZGlyZWN0b3J5IGxpc3QsIG1lbnUgbGlzdCAtLT4KLTwhQVRUTElTVCBESVIKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVEIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgPgotPCFBVFRMSVNUIE1FTlUKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVEIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgPgotCi08IUVOVElUWSAlIExJU3R5bGUgIkNEQVRBIiAtLSBjb25zdHJhaW5lZCB0bzogIiglVUxTdHlsZTt8JU9MU3R5bGU7KSIgLS0+Ci0KLTwhRUxFTUVOVCBMSSAtIE8gKCVmbG93OykqICAgICAgICAgICAgIC0tIGxpc3QgaXRlbSAtLT4KLTwhQVRUTElTVCBMSQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUxJU3R5bGU7ICAgICAgI0lNUExJRUQgIC0tIGxpc3QgaXRlbSBzdHlsZSAtLQotICB2YWx1ZSAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXQgc2VxdWVuY2UgbnVtYmVyIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRm9ybXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhRUxFTUVOVCBGT1JNIC0gLSAoJWZsb3c7KSogLShGT1JNKSAgIC0tIGludGVyYWN0aXZlIGZvcm0gLS0+Ci08IUFUVExJU1QgRk9STQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWN0aW9uICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIHNlcnZlci1zaWRlIGZvcm0gaGFuZGxlciAtLQotICBtZXRob2QgICAgICAoR0VUfFBPU1QpICAgICBHRVQgICAgICAgLS0gSFRUUCBtZXRob2QgdXNlZCB0byBzdWJtaXQgdGhlIGZvcm0tLQotICBlbmN0eXBlICAgICAlQ29udGVudFR5cGU7ICAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRCAgLS0gbGlzdCBvZiBNSU1FIHR5cGVzIGZvciBmaWxlIHVwbG9hZCAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZSBvZiBmb3JtIGZvciBzY3JpcHRpbmcgLS0KLSAgb25zdWJtaXQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBmb3JtIHdhcyBzdWJtaXR0ZWQgLS0KLSAgb25yZXNldCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBmb3JtIHdhcyByZXNldCAtLQotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRCAgLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0KLSAgYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAgI0lNUExJRUQgIC0tIGxpc3Qgb2Ygc3VwcG9ydGVkIGNoYXJzZXRzIC0tCi0gID4KLQotPCEtLSBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZCAtLT4KLTwhRUxFTUVOVCBMQUJFTCAtIC0gKCVpbmxpbmU7KSogLShMQUJFTCkgLS0gZm9ybSBmaWVsZCBsYWJlbCB0ZXh0IC0tPgotPCFBVFRMSVNUIExBQkVMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBmb3IgICAgICAgICBJRFJFRiAgICAgICAgICAjSU1QTElFRCAgLS0gbWF0Y2hlcyBmaWVsZCBJRCB2YWx1ZSAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICA+Ci0KLTwhRU5USVRZICUgSW5wdXRUeXBlCi0gICIoVEVYVCB8IFBBU1NXT1JEIHwgQ0hFQ0tCT1ggfAotICAgIFJBRElPIHwgU1VCTUlUIHwgUkVTRVQgfAotICAgIEZJTEUgfCBISURERU4gfCBJTUFHRSB8IEJVVFRPTikiCi0gICA+Ci0KLTwhLS0gYXR0cmlidXRlIG5hbWUgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0IGFuZCByZXNldCAtLT4KLTwhRUxFTUVOVCBJTlBVVCAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBJTlBVVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUlucHV0VHlwZTsgICAgVEVYVCAgICAgIC0tIHdoYXQga2luZCBvZiB3aWRnZXQgaXMgbmVlZGVkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBTcGVjaWZ5IGZvciByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzIC0tCi0gIGNoZWNrZWQgICAgIChjaGVja2VkKSAgICAgICNJTVBMSUVEICAtLSBmb3IgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2sgYm94ZXMgLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRCAgLS0gZm9yIHRleHQgYW5kIHBhc3N3ZCAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3BlY2lmaWMgdG8gZWFjaCB0eXBlIG9mIGZpZWxkIC0tCi0gIG1heGxlbmd0aCAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBtYXggY2hhcnMgZm9yIHRleHQgZmllbGRzIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBmb3IgZmllbGRzIHdpdGggaW1hZ2VzIC0tCi0gIGFsdCAgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRCAgLS0gdXNlIHNlcnZlci1zaWRlIGltYWdlIG1hcCAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gc29tZSB0ZXh0IHdhcyBzZWxlY3RlZCAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgTUlNRSB0eXBlcyBmb3IgZmlsZSB1cGxvYWQgLS0KLSAgYWxpZ24gICAgICAgJUlBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBTRUxFQ1QgLSAtIChPUFRHUk9VUHxPUFRJT04pKyAtLSBvcHRpb24gc2VsZWN0b3IgLS0+Ci08IUFUVExJU1QgU0VMRUNUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gZmllbGQgbmFtZSAtLQotICBzaXplICAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcm93cyB2aXNpYmxlIC0tCi0gIG11bHRpcGxlICAgIChtdWx0aXBsZSkgICAgICNJTVBMSUVEICAtLSBkZWZhdWx0IGlzIHNpbmdsZSBzZWxlY3Rpb24gLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IHZhbHVlIHdhcyBjaGFuZ2VkIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBPUFRHUk9VUCAtIC0gKE9QVElPTikrIC0tIG9wdGlvbiBncm91cCAtLT4KLTwhQVRUTElTVCBPUFRHUk9VUAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gZm9yIHVzZSBpbiBoaWVyYXJjaGljYWwgbWVudXMgLS0KLSAgPgotCi08IUVMRU1FTlQgT1BUSU9OIC0gTyAoI1BDREFUQSkgICAgICAgICAtLSBzZWxlY3RhYmxlIGNob2ljZSAtLT4KLTwhQVRUTElTVCBPUFRJT04KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNlbGVjdGVkICAgIChzZWxlY3RlZCkgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGZvciB1c2UgaW4gaGllcmFyY2hpY2FsIG1lbnVzIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBkZWZhdWx0cyB0byBlbGVtZW50IGNvbnRlbnQgLS0KLSAgPgotCi08IUVMRU1FTlQgVEVYVEFSRUEgLSAtICgjUENEQVRBKSAgICAgICAtLSBtdWx0aS1saW5lIHRleHQgZmllbGQgLS0+Ci08IUFUVExJU1QgVEVYVEFSRUEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHJvd3MgICAgICAgIE5VTUJFUiAgICAgICAgICNSRVFVSVJFRAotICBjb2xzICAgICAgICBOVU1CRVIgICAgICAgICAjUkVRVUlSRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gc29tZSB0ZXh0IHdhcyBzZWxlY3RlZCAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCEtLQotICAjUENEQVRBIGlzIHRvIHNvbHZlIHRoZSBtaXhlZCBjb250ZW50IHByb2JsZW0sCi0gIHBlciBzcGVjaWZpY2F0aW9uIG9ubHkgd2hpdGVzcGFjZSBpcyBhbGxvd2VkIHRoZXJlIQotIC0tPgotPCFFTEVNRU5UIEZJRUxEU0VUIC0gLSAoI1BDREFUQSxMRUdFTkQsKCVmbG93OykqKSAtLSBmb3JtIGNvbnRyb2wgZ3JvdXAgLS0+Ci08IUFUVExJU1QgRklFTERTRVQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIExFR0VORCAtIC0gKCVpbmxpbmU7KSogICAgICAgLS0gZmllbGRzZXQgbGVnZW5kIC0tPgotPCFFTlRJVFkgJSBMQWxpZ24gIih0b3B8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCFBVFRMSVNUIExFR0VORAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBhbGlnbiAgICAgICAlTEFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gcmVsYXRpdmUgdG8gZmllbGRzZXQgLS0KLSAgPgotCi08IUVMRU1FTlQgQlVUVE9OIC0gLQotICAgICAoJWZsb3c7KSogLShBfCVmb3JtY3RybDt8Rk9STXxJU0lOREVYfEZJRUxEU0VUfElGUkFNRSkKLSAgICAgLS0gcHVzaCBidXR0b24gLS0+Ci08IUFUVExJU1QgQlVUVE9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VudCB0byBzZXJ2ZXIgd2hlbiBzdWJtaXR0ZWQgLS0KLSAgdHlwZSAgICAgICAgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpIHN1Ym1pdCAtLSBmb3IgdXNlIGFzIGZvcm0gYnV0dG9uIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09IFRhYmxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBJRVRGIEhUTUwgdGFibGUgc3RhbmRhcmQsIHNlZSBbUkZDMTk0Ml0gLS0+Ci0KLTwhLS0KLSBUaGUgQk9SREVSIGF0dHJpYnV0ZSBzZXRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGZyYW1lIGFyb3VuZCB0aGUKLSB0YWJsZS4gVGhlIGRlZmF1bHQgdW5pdHMgYXJlIHNjcmVlbiBwaXhlbHMuCi0KLSBUaGUgRlJBTUUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgZnJhbWUgYXJvdW5kCi0gdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gQ0FMUyB0byBhdm9pZCBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgVkFMSUdOIGF0dHJpYnV0ZS4KLQotIFRoZSB2YWx1ZSAiYm9yZGVyIiBpcyBpbmNsdWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAotIDxUQUJMRSBCT1JERVI+IHdoaWNoIHlpZWxkcyBmcmFtZT1ib3JkZXIgYW5kIGJvcmRlcj1pbXBsaWVkCi0gRm9yIDxUQUJMRSBCT1JERVI9MT4geW91IGdldCBib3JkZXI9MSBhbmQgZnJhbWU9aW1wbGllZC4gSW4gdGhpcwotIGNhc2UsIGl0IGlzIGFwcHJvcHJpYXRlIHRvIHRyZWF0IHRoaXMgYXMgZnJhbWU9Ym9yZGVyIGZvciBiYWNrd2FyZHMKLSBjb21wYXRpYmlsaXR5IHdpdGggZGVwbG95ZWQgYnJvd3NlcnMuCi0tLT4KLTwhRU5USVRZICUgVEZyYW1lICIodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikiPgotCi08IS0tCi0gVGhlIFJVTEVTIGF0dHJpYnV0ZSBkZWZpbmVzIHdoaWNoIHJ1bGVzIHRvIGRyYXcgYmV0d2VlbiBjZWxsczoKLQotIElmIFJVTEVTIGlzIGFic2VudCB0aGVuIGFzc3VtZToKLSAgICAgIm5vbmUiIGlmIEJPUkRFUiBpcyBhYnNlbnQgb3IgQk9SREVSPTAgb3RoZXJ3aXNlICJhbGwiCi0tLT4KLQotPCFFTlRJVFkgJSBUUnVsZXMgIihub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpIj4KLSAgCi08IS0tIGhvcml6b250YWwgcGxhY2VtZW50IG9mIHRhYmxlIHJlbGF0aXZlIHRvIGRvY3VtZW50IC0tPgotPCFFTlRJVFkgJSBUQWxpZ24gIihsZWZ0fGNlbnRlcnxyaWdodCkiPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGxoYWxpZ24KLSAgImFsaWduICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQKLSAgIGNoYXIgICAgICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFsaWdubWVudCBjaGFyLCBlLmcuIGNoYXI9JzonIC0tCi0gICBjaGFyb2ZmICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvZmZzZXQgZm9yIGFsaWdubWVudCBjaGFyIC0tIgotICA+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGx2YWxpZ24KLSAgInZhbGlnbiAgICAgKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCIKLSAgPgotCi08IUVMRU1FTlQgVEFCTEUgLSAtCi0gICAgIChDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKyk+Ci08IUVMRU1FTlQgQ0FQVElPTiAgLSAtICglaW5saW5lOykqICAgICAtLSB0YWJsZSBjYXB0aW9uIC0tPgotPCFFTEVNRU5UIFRIRUFEICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgaGVhZGVyIC0tPgotPCFFTEVNRU5UIFRGT09UICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgZm9vdGVyIC0tPgotPCFFTEVNRU5UIFRCT0RZICAgIE8gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgYm9keSAtLT4KLTwhRUxFTUVOVCBDT0xHUk9VUCAtIE8gKENPTCkqICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiBncm91cCAtLT4KLTwhRUxFTUVOVCBDT0wgICAgICAtIE8gRU1QVFkgICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiAtLT4KLTwhRUxFTUVOVCBUUiAgICAgICAtIE8gKFRIfFREKSsgICAgICAgIC0tIHRhYmxlIHJvdyAtLT4KLTwhRUxFTUVOVCAoVEh8VEQpICAtIE8gKCVmbG93OykqICAgICAgIC0tIHRhYmxlIGhlYWRlciBjZWxsLCB0YWJsZSBkYXRhIGNlbGwtLT4KLQotPCFBVFRMSVNUIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGFibGUgZWxlbWVudCAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3VtbWFyeSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIHB1cnBvc2Uvc3RydWN0dXJlIGZvciBzcGVlY2ggb3V0cHV0LS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHRhYmxlIHdpZHRoIC0tCi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBjb250cm9scyBmcmFtZSB3aWR0aCBhcm91bmQgdGFibGUgLS0KLSAgZnJhbWUgICAgICAgJVRGcmFtZTsgICAgICAgI0lNUExJRUQgIC0tIHdoaWNoIHBhcnRzIG9mIGZyYW1lIHRvIHJlbmRlciAtLQotICBydWxlcyAgICAgICAlVFJ1bGVzOyAgICAgICAjSU1QTElFRCAgLS0gcnVsaW5ncyBiZXR3ZWVuIHJvd3MgYW5kIGNvbHMgLS0KLSAgY2VsbHNwYWNpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHNwYWNpbmcgYmV0d2VlbiBjZWxscyAtLQotICBjZWxscGFkZGluZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gc3BhY2luZyB3aXRoaW4gY2VsbHMgLS0KLSAgYWxpZ24gICAgICAgJVRBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHRhYmxlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHdpbmRvdyAtLQotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gYmFja2dyb3VuZCBjb2xvciBmb3IgY2VsbHMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gIGRhdGFwYWdlc2l6ZSBDREFUQSAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRU5USVRZICUgQ0FsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBDQVBUSU9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBhbGlnbiAgICAgICAlQ0FsaWduOyAgICAgICAjSU1QTElFRCAgLS0gcmVsYXRpdmUgdG8gdGFibGUgLS0KLSAgPgotCi08IS0tCi1DT0xHUk9VUCBncm91cHMgYSBzZXQgb2YgQ09MIGVsZW1lbnRzLiBJdCBhbGxvd3MgeW91IHRvIGdyb3VwCi1zZXZlcmFsIHNlbWFudGljYWxseSByZWxhdGVkIGNvbHVtbnMgdG9nZXRoZXIuCi0tLT4KLTwhQVRUTElTVCBDT0xHUk9VUAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3BhbiAgICAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIGRlZmF1bHQgbnVtYmVyIG9mIGNvbHVtbnMgaW4gZ3JvdXAgLS0KLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQgIC0tIGRlZmF1bHQgd2lkdGggZm9yIGVuY2xvc2VkIENPTHMgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi08IS0tCi0gQ09MIGVsZW1lbnRzIGRlZmluZSB0aGUgYWxpZ25tZW50IHByb3BlcnRpZXMgZm9yIGNlbGxzIGluCi0gb25lIG9yIG1vcmUgY29sdW1ucy4KLQotIFRoZSBXSURUSCBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1ucywgZS5nLgotCi0gICAgIHdpZHRoPTY0ICAgICAgICB3aWR0aCBpbiBzY3JlZW4gcGl4ZWxzCi0gICAgIHdpZHRoPTAuNSogICAgICByZWxhdGl2ZSB3aWR0aCBvZiAwLjUKLQotIFRoZSBTUEFOIGF0dHJpYnV0ZSBjYXVzZXMgdGhlIGF0dHJpYnV0ZXMgb2Ygb25lCi0gQ09MIGVsZW1lbnQgdG8gYXBwbHkgdG8gbW9yZSB0aGFuIG9uZSBjb2x1bW4uCi0tLT4KLTwhQVRUTElTVCBDT0wgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGNvbHVtbiBncm91cHMgYW5kIHByb3BlcnRpZXMgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNwYW4gICAgICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBDT0wgYXR0cmlidXRlcyBhZmZlY3QgTiBjb2x1bW5zIC0tCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVEICAtLSBjb2x1bW4gd2lkdGggc3BlY2lmaWNhdGlvbiAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLTwhLS0KLSAgICBVc2UgVEhFQUQgdG8gZHVwbGljYXRlIGhlYWRlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgaGVhZGVycyB3aGVuCi0gICAgVEJPRFkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBURk9PVCB0byBkdXBsaWNhdGUgZm9vdGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBmb290ZXJzIHdoZW4KLSAgICBUQk9EWSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIG11bHRpcGxlIFRCT0RZIHNlY3Rpb25zIHdoZW4gcnVsZXMgYXJlIG5lZWRlZAotICAgIGJldHdlZW4gZ3JvdXBzIG9mIHRhYmxlIHJvd3MuCi0tLT4KLTwhQVRUTElTVCAoVEhFQUR8VEJPRFl8VEZPT1QpICAgICAgICAgIC0tIHRhYmxlIHNlY3Rpb24gLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotPCFBVFRMSVNUIFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGFibGUgcm93IC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRCAgLS0gYmFja2dyb3VuZCBjb2xvciBmb3Igcm93IC0tCi0gID4KLQotCi08IS0tIFNjb3BlIGlzIHNpbXBsZXIgdGhhbiBoZWFkZXJzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcyAtLT4KLTwhRU5USVRZICUgU2NvcGUgIihyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKSI+Ci0KLTwhLS0gVEggaXMgZm9yIGhlYWRlcnMsIFREIGZvciBkYXRhLCBidXQgZm9yIGNlbGxzIGFjdGluZyBhcyBib3RoIHVzZSBURCAtLT4KLTwhQVRUTElTVCAoVEh8VEQpICAgICAgICAgICAgICAgICAgICAgIC0tIGhlYWRlciBvciBkYXRhIGNlbGwgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBhYmJyZXZpYXRpb24gZm9yIGhlYWRlciBjZWxsIC0tCi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWxhdGVkIGhlYWRlcnMtLQotICBoZWFkZXJzICAgICBJRFJFRlMgICAgICAgICAjSU1QTElFRCAgLS0gbGlzdCBvZiBpZCdzIGZvciBoZWFkZXIgY2VsbHMgLS0KLSAgc2NvcGUgICAgICAgJVNjb3BlOyAgICAgICAgI0lNUExJRUQgIC0tIHNjb3BlIGNvdmVyZWQgYnkgaGVhZGVyIGNlbGxzIC0tCi0gIHJvd3NwYW4gICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBudW1iZXIgb2Ygcm93cyBzcGFubmVkIGJ5IGNlbGwgLS0KLSAgY29sc3BhbiAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIG51bWJlciBvZiBjb2xzIHNwYW5uZWQgYnkgY2VsbCAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICBub3dyYXAgICAgICAobm93cmFwKSAgICAgICAjSU1QTElFRCAgLS0gc3VwcHJlc3Mgd29yZCB3cmFwIC0tCi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBjZWxsIGJhY2tncm91bmQgY29sb3IgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHdpZHRoIGZvciBjZWxsIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBoZWlnaHQgZm9yIGNlbGwgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IERvY3VtZW50IEZyYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZSBjb250ZW50IG1vZGVsIGZvciBIVE1MIGRvY3VtZW50cyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIEhFQUQgaXMKLSAgZm9sbG93ZWQgYnkgYSBGUkFNRVNFVCBvciBCT0RZIGVsZW1lbnQuIFRoZSB3aWRlc3ByZWFkIG9taXNzaW9uIG9mCi0gIHRoZSBCT0RZIHN0YXJ0IHRhZyBtYWtlcyBpdCBpbXByYWN0aWNhbCB0byBkZWZpbmUgdGhlIGNvbnRlbnQgbW9kZWwKLSAgd2l0aG91dCB0aGUgdXNlIG9mIGEgbWFya2VkIHNlY3Rpb24uCi0tLT4KLQotPCFbICVIVE1MLkZyYW1lc2V0OyBbCi08IUVMRU1FTlQgRlJBTUVTRVQgLSAtICgoRlJBTUVTRVR8RlJBTUUpKyAmIE5PRlJBTUVTPykgLS0gd2luZG93IHN1YmRpdmlzaW9uLS0+Ci08IUFUVExJU1QgRlJBTUVTRVQKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIHJvd3MgICAgICAgICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVEICAtLSBsaXN0IG9mIGxlbmd0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAxMDAlICgxIHJvdykgLS0KLSAgY29scyAgICAgICAgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDEwMCUgKDEgY29sKSAtLQotICBvbmxvYWQgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYWxsIHRoZSBmcmFtZXMgaGF2ZSBiZWVuIGxvYWRlZCAgLS0gCi0gIG9udW5sb2FkICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhbGwgdGhlIGZyYW1lcyBoYXZlIGJlZW4gcmVtb3ZlZCAtLSAKLSAgPgotXV0+Ci0KLTwhWyAlSFRNTC5GcmFtZXNldDsgWwotPCEtLSByZXNlcnZlZCBmcmFtZSBuYW1lcyBzdGFydCB3aXRoICJfIiBvdGhlcndpc2Ugc3RhcnRzIHdpdGggbGV0dGVyIC0tPgotPCFFTEVNRU5UIEZSQU1FIC0gTyBFTVBUWSAgICAgICAgICAgICAgLS0gc3Vid2luZG93IC0tPgotPCFBVFRMSVNUIEZSQU1FCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gbGluayB0byBsb25nIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcGxlbWVudHMgdGl0bGUpIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lIG9mIGZyYW1lIGZvciB0YXJnZXR0aW5nIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBzb3VyY2Ugb2YgZnJhbWUgY29udGVudCAtLQotICBmcmFtZWJvcmRlciAoMXwwKSAgICAgICAgICAxICAgICAgICAgLS0gcmVxdWVzdCBmcmFtZSBib3JkZXJzPyAtLQotICBtYXJnaW53aWR0aCAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gbWFyZ2luIHdpZHRocyBpbiBwaXhlbHMgLS0KLSAgbWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICAgICAgI0lNUExJRUQgIC0tIG1hcmdpbiBoZWlnaHQgaW4gcGl4ZWxzIC0tCi0gIG5vcmVzaXplICAgIChub3Jlc2l6ZSkgICAgICNJTVBMSUVEICAtLSBhbGxvdyB1c2VycyB0byByZXNpemUgZnJhbWVzPyAtLQotICBzY3JvbGxpbmcgICAoeWVzfG5vfGF1dG8pICBhdXRvICAgICAgLS0gc2Nyb2xsYmFyIG9yIG5vbmUgLS0KLSAgPgotXV0+Ci0KLTwhRUxFTUVOVCBJRlJBTUUgLSAtICglZmxvdzspKiAgICAgICAgIC0tIGlubGluZSBzdWJ3aW5kb3cgLS0+Ci08IUFUVExJU1QgSUZSQU1FCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gbGluayB0byBsb25nIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcGxlbWVudHMgdGl0bGUpIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lIG9mIGZyYW1lIGZvciB0YXJnZXR0aW5nIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBzb3VyY2Ugb2YgZnJhbWUgY29udGVudCAtLQotICBmcmFtZWJvcmRlciAoMXwwKSAgICAgICAgICAxICAgICAgICAgLS0gcmVxdWVzdCBmcmFtZSBib3JkZXJzPyAtLQotICBtYXJnaW53aWR0aCAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gbWFyZ2luIHdpZHRocyBpbiBwaXhlbHMgLS0KLSAgbWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICAgICAgI0lNUExJRUQgIC0tIG1hcmdpbiBoZWlnaHQgaW4gcGl4ZWxzIC0tCi0gIHNjcm9sbGluZyAgICh5ZXN8bm98YXV0bykgIGF1dG8gICAgICAtLSBzY3JvbGxiYXIgb3Igbm9uZSAtLQotICBhbGlnbiAgICAgICAlSUFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIGZyYW1lIGhlaWdodCAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gZnJhbWUgd2lkdGggLS0KLSAgPgotCi08IVsgJUhUTUwuRnJhbWVzZXQ7IFsKLTwhRU5USVRZICUgbm9mcmFtZXMuY29udGVudCAiKEJPRFkpIC0oTk9GUkFNRVMpIj4KLV1dPgotCi08IUVOVElUWSAlIG5vZnJhbWVzLmNvbnRlbnQgIiglZmxvdzspKiI+Ci0KLTwhRUxFTUVOVCBOT0ZSQU1FUyAtIC0gJW5vZnJhbWVzLmNvbnRlbnQ7Ci0gLS0gYWx0ZXJuYXRlIGNvbnRlbnQgY29udGFpbmVyIGZvciBub24gZnJhbWUtYmFzZWQgcmVuZGVyaW5nIC0tPgotPCFBVFRMSVNUIE5PRlJBTUVTCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IEhlYWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tICVoZWFkLm1pc2M7IGRlZmluZWQgZWFybGllciBvbiBhcyAiU0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1QiIC0tPgotPCFFTlRJVFkgJSBoZWFkLmNvbnRlbnQgIlRJVExFICYgSVNJTkRFWD8gJiBCQVNFPyI+Ci0KLTwhRUxFTUVOVCBIRUFEIE8gTyAoJWhlYWQuY29udGVudDspICsoJWhlYWQubWlzYzspIC0tIGRvY3VtZW50IGhlYWQgLS0+Ci08IUFUVExJU1QgSEVBRAotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyIC0tCi0gIHByb2ZpbGUgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lZCBkaWN0aW9uYXJ5IG9mIG1ldGEgaW5mbyAtLQotICA+Ci0KLTwhLS0gVGhlIFRJVExFIGVsZW1lbnQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgZmxvdyBvZiB0ZXh0LgotICAgICAgIEl0IHNob3VsZCBiZSBkaXNwbGF5ZWQsIGZvciBleGFtcGxlIGFzIHRoZSBwYWdlIGhlYWRlciBvcgotICAgICAgIHdpbmRvdyB0aXRsZS4gRXhhY3RseSBvbmUgdGl0bGUgaXMgcmVxdWlyZWQgcGVyIGRvY3VtZW50LgotICAgIC0tPgotPCFFTEVNRU5UIFRJVExFIC0gLSAoI1BDREFUQSkgLSglaGVhZC5taXNjOykgLS0gZG9jdW1lbnQgdGl0bGUgLS0+Ci08IUFUVExJU1QgVElUTEUgJWkxOG4+Ci0KLTwhRUxFTUVOVCBJU0lOREVYIC0gTyBFTVBUWSAgICAgICAgICAgIC0tIHNpbmdsZSBsaW5lIHByb21wdCAtLT4KLTwhQVRUTElTVCBJU0lOREVYCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyIC0tCi0gIHByb21wdCAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBwcm9tcHQgbWVzc2FnZSAtLT4KLQotPCFFTEVNRU5UIEJBU0UgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gZG9jdW1lbnQgYmFzZSBVUkkgLS0+Ci08IUFUVExJU1QgQkFTRQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIHRoYXQgYWN0cyBhcyBiYXNlIFVSSSAtLQotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRCAgLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0KLSAgPgotCi08IUVMRU1FTlQgTUVUQSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBnZW5lcmljIG1ldGFpbmZvcm1hdGlvbiAtLT4KLTwhQVRUTElTVCBNRVRBCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIsIGZvciB1c2Ugd2l0aCBjb250ZW50IC0tCi0gIGh0dHAtZXF1aXYgIE5BTUUgICAgICAgICAgICNJTVBMSUVEICAtLSBIVFRQIHJlc3BvbnNlIGhlYWRlciBuYW1lICAtLQotICBuYW1lICAgICAgICBOQU1FICAgICAgICAgICAjSU1QTElFRCAgLS0gbWV0YWluZm9ybWF0aW9uIG5hbWUgLS0KLSAgY29udGVudCAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVEIC0tIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gLS0KLSAgc2NoZW1lICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNlbGVjdCBmb3JtIG9mIGNvbnRlbnQgLS0KLSAgPgotCi08IUVMRU1FTlQgU1RZTEUgLSAtICVTdHlsZVNoZWV0ICAgICAgICAtLSBzdHlsZSBpbmZvIC0tPgotPCFBVFRMSVNUIFNUWUxFCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIsIGZvciB1c2Ugd2l0aCB0aXRsZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQgLS0gY29udGVudCB0eXBlIG9mIHN0eWxlIGxhbmd1YWdlIC0tCi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVEICAtLSBkZXNpZ25lZCBmb3IgdXNlIHdpdGggdGhlc2UgbWVkaWEgLS0KLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IHRpdGxlIC0tCi0gID4KLQotPCFFTEVNRU5UIFNDUklQVCAtIC0gJVNjcmlwdDsgICAgICAgICAgLS0gc2NyaXB0IHN0YXRlbWVudHMgLS0+Ci08IUFUVExJU1QgU0NSSVBUCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQgLS0gY29udGVudCB0eXBlIG9mIHNjcmlwdCBsYW5ndWFnZSAtLQotICBsYW5ndWFnZSAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gcHJlZGVmaW5lZCBzY3JpcHQgbGFuZ3VhZ2UgbmFtZSAtLQotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBhbiBleHRlcm5hbCBzY3JpcHQgLS0KLSAgZGVmZXIgICAgICAgKGRlZmVyKSAgICAgICAgI0lNUExJRUQgIC0tIFVBIG1heSBkZWZlciBleGVjdXRpb24gb2Ygc2NyaXB0IC0tCi0gIGV2ZW50ICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICBmb3IgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgTk9TQ1JJUFQgLSAtICglZmxvdzspKgotICAtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBzY3JpcHQtYmFzZWQgcmVuZGVyaW5nIC0tPgotPCFBVFRMSVNUIE5PU0NSSVBUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IFN0cnVjdHVyZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IUVOVElUWSAlIHZlcnNpb24gInZlcnNpb24gQ0RBVEEgI0ZJWEVEICclSFRNTC5WZXJzaW9uOyciPgotCi08IVsgJUhUTUwuRnJhbWVzZXQ7IFsKLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICJIRUFELCBGUkFNRVNFVCI+Ci1dXT4KLQotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEJPRFkiPgotCi08IUVMRU1FTlQgSFRNTCBPIE8gKCVodG1sLmNvbnRlbnQ7KSAgICAtLSBkb2N1bWVudCByb290IGVsZW1lbnQgLS0+Ci08IUFUVExJU1QgSFRNTAotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyIC0tCi0gICV2ZXJzaW9uOwotICA+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL2xvb3NlNDAwLmR0ZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvbG9vc2U0MDAuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTZkODQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvbG9vc2U0MDAuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5MiArMCwwIEBACi08IS0tCi0gICAgVGhpcyBpcyB0aGUgSFRNTCA0LjAgVHJhbnNpdGlvbmFsIERURCwgd2hpY2ggaW5jbHVkZXMKLSAgICBwcmVzZW50YXRpb24gYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgdGhhdCBXM0MgZXhwZWN0cyB0byBwaGFzZSBvdXQKLSAgICBhcyBzdXBwb3J0IGZvciBzdHlsZSBzaGVldHMgbWF0dXJlcy4gQXV0aG9ycyBzaG91bGQgdXNlIHRoZSBTdHJpY3QKLSAgICBEVEQgd2hlbiBwb3NzaWJsZSwgYnV0IG1heSB1c2UgdGhlIFRyYW5zaXRpb25hbCBEVEQgd2hlbiBzdXBwb3J0Ci0gICAgZm9yIHByZXNlbnRhdGlvbiBhdHRyaWJ1dGUgYW5kIGVsZW1lbnRzIGlzIHJlcXVpcmVkLgotCi0gICAgSFRNTCA0LjAgaW5jbHVkZXMgbWVjaGFuaXNtcyBmb3Igc3R5bGUgc2hlZXRzLCBzY3JpcHRpbmcsCi0gICAgZW1iZWRkaW5nIG9iamVjdHMsIGltcHJvdmVkIHN1cHBvcnQgZm9yIHJpZ2h0IHRvIGxlZnQgYW5kIG1peGVkCi0gICAgZGlyZWN0aW9uIHRleHQsIGFuZCBlbmhhbmNlbWVudHMgdG8gZm9ybXMgZm9yIGltcHJvdmVkCi0gICAgYWNjZXNzaWJpbGl0eSBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzLgotCi0gICAgICAgICAgRHJhZnQ6ICREYXRlOiAxOTk4LzA0LzAyIDAwOjE3OjAwICQKLQotICAgICAgICAgIEF1dGhvcnM6Ci0gICAgICAgICAgICAgIERhdmUgUmFnZ2V0dCA8ZHNyQHczLm9yZz4KLSAgICAgICAgICAgICAgQXJuYXVkIExlIEhvcnMgPGxlaG9yc0B3My5vcmc+Ci0gICAgICAgICAgICAgIElhbiBKYWNvYnMgPGlqQHczLm9yZz4KLQotICAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgSFRNTCA0LjAgaXMgYXZhaWxhYmxlIGF0OgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAKLS0tPgotPCFFTlRJVFkgJSBIVE1MLlZlcnNpb24gIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iCi0gIC0tIFR5cGljYWwgdXNhZ2U6Ci0KLSAgICA8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9sb29zZS5kdGQiPgotICAgIDxodG1sPgotICAgIDxoZWFkPgotICAgIC4uLgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAuLi4KLSAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotCi0gICAgVGhlIFVSSSB1c2VkIGFzIGEgc3lzdGVtIGlkZW50aWZpZXIgd2l0aCB0aGUgcHVibGljIGlkZW50aWZpZXIgYWxsb3dzCi0gICAgdGhlIHVzZXIgYWdlbnQgdG8gZG93bmxvYWQgdGhlIERURCBhbmQgZW50aXR5IHNldHMgYXMgbmVlZGVkLgotCi0gICAgVGhlIEZQSSBmb3IgdGhlIFN0cmljdCBIVE1MIDQuMCBEVEQgaXM6Ci0KLSAgICAgICAgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiIKLQotICAgIGFuZCBpdHMgVVJJIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvc3RyaWN0LmR0ZAotCi0gICAgQXV0aG9ycyBzaG91bGQgdXNlIHRoZSBTdHJpY3QgRFREIHVubGVzcyB0aGV5IG5lZWQgdGhlCi0gICAgcHJlc2VudGF0aW9uIGNvbnRyb2wgZm9yIHVzZXIgYWdlbnRzIHRoYXQgZG9uJ3QgKGFkZXF1YXRlbHkpCi0gICAgc3VwcG9ydCBzdHlsZSBzaGVldHMuCi0KLSAgICBJZiB5b3UgYXJlIHdyaXRpbmcgYSBkb2N1bWVudCB0aGF0IGluY2x1ZGVzIGZyYW1lcywgdXNlIAotICAgIHRoZSBmb2xsb3dpbmcgRlBJOgotCi0gICAgICAgICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iCi0KLSAgICB3aXRoIHRoZSBVUkk6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9mcmFtZXNldC5kdGQKLQotICAgIFRoZSBmb2xsb3dpbmcgVVJJcyBhcmUgc3VwcG9ydGVkIGluIHJlbGF0aW9uIHRvIEhUTUwgNC4wCi0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9zdHJpY3QuZHRkIiAoU3RyaWN0IERURCkKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9sb29zZS5kdGQiIChMb29zZSBEVEQpCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvZnJhbWVzZXQuZHRkIiAoRnJhbWVzZXQgRFREKQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL0hUTUxsYXQxLmVudCIgKExhdGluLTEgZW50aXRpZXMpCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvSFRNTHN5bWJvbC5lbnQiIChTeW1ib2wgZW50aXRpZXMpCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvSFRNTHNwZWNpYWwuZW50IiAoU3BlY2lhbCBlbnRpdGllcykKLQotICAgIFRoZXNlIFVSSXMgcG9pbnQgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggZmlsZS4gVG8gcmVmZXJlbmNlCi0gICAgdGhpcyBzcGVjaWZpYyByZXZpc2lvbiB1c2UgdGhlIGZvbGxvd2luZyBVUklzOgotCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLWh0bWw0MC0xOTk4MDQyNC9zdHJpY3QuZHRkIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvbG9vc2UuZHRkIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvZnJhbWVzZXQuZHRkIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvSFRNTGxhdDEuZW50IgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvSFRNTHN5bWJvbC5lbnQiCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLWh0bWw0MC0xOTk4MDQyNC9IVE1Mc3BlY2lhbC5lbnQiCi0KLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEltcG9ydGVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlICJDREFUQSIKLSAgICAtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGVzICJDREFUQSIKLSAgICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXQgIkNEQVRBIgotICAgIC0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldHMgIkNEQVRBIgotICAgIC0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIExhbmd1YWdlQ29kZSAiTkFNRSIKLSAgICAtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyYWN0ZXIgIkNEQVRBIgotICAgIC0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTGlua1R5cGVzICJDREFUQSIKLSAgICAtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTWVkaWFEZXNjICJDREFUQSIKLSAgICAtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBVUkkgIkNEQVRBIgotICAgIC0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLAotICAgICAgIHNlZSBbVVJJXQotICAgIC0tPgotCi08IUVOVElUWSAlIERhdGV0aW1lICJDREFUQSIgLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotCi0KLTwhRU5USVRZICUgU2NyaXB0ICJDREFUQSIgLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci0KLTwhRU5USVRZICUgU3R5bGVTaGVldCAiQ0RBVEEiIC0tIHN0eWxlIHNoZWV0IGRhdGEgLS0+Ci0KLTwhRU5USVRZICUgRnJhbWVUYXJnZXQgIkNEQVRBIiAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLT4KLQotCi08IUVOVElUWSAlIFRleHQgIkNEQVRBIj4KLQotCi08IS0tIFBhcmFtZXRlciBFbnRpdGllcyAtLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUIiAtLSByZXBlYXRhYmxlIGhlYWQgZWxlbWVudHMgLS0+Ci0KLTwhRU5USVRZICUgaGVhZGluZyAiSDF8SDJ8SDN8SDR8SDV8SDYiPgotCi08IUVOVElUWSAlIGxpc3QgIlVMIHwgT0wgfCAgRElSIHwgTUVOVSI+Ci0KLTwhRU5USVRZICUgcHJlZm9ybWF0dGVkICJQUkUiPgotCi08IUVOVElUWSAlIENvbG9yICJDREFUQSIgLS0gYSBjb2xvciB1c2luZyBzUkdCOiAjUlJHR0JCIGFzIEhleCB2YWx1ZXMgLS0+Ci0KLTwhLS0gVGhlcmUgYXJlIGFsc28gMTYgd2lkZWx5IGtub3duIGNvbG9yIG5hbWVzIHdpdGggdGhlaXIgc1JHQiB2YWx1ZXM6Ci0KLSAgICBCbGFjayAgPSAjMDAwMDAwICAgIEdyZWVuICA9ICMwMDgwMDAKLSAgICBTaWx2ZXIgPSAjQzBDMEMwICAgIExpbWUgICA9ICMwMEZGMDAKLSAgICBHcmF5ICAgPSAjODA4MDgwICAgIE9saXZlICA9ICM4MDgwMDAKLSAgICBXaGl0ZSAgPSAjRkZGRkZGICAgIFllbGxvdyA9ICNGRkZGMDAKLSAgICBNYXJvb24gPSAjODAwMDAwICAgIE5hdnkgICA9ICMwMDAwODAKLSAgICBSZWQgICAgPSAjRkYwMDAwICAgIEJsdWUgICA9ICMwMDAwRkYKLSAgICBQdXJwbGUgPSAjODAwMDgwICAgIFRlYWwgICA9ICMwMDgwODAKLSAgICBGdWNoc2lhPSAjRkYwMEZGICAgIEFxdWEgICA9ICMwMEZGRkYKLSAtLT4KLQotPCFFTlRJVFkgJSBib2R5Y29sb3JzICIKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGRvY3VtZW50IGJhY2tncm91bmQgY29sb3IgLS0KLSAgdGV4dCAgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGRvY3VtZW50IHRleHQgY29sb3IgLS0KLSAgbGluayAgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIGNvbG9yIG9mIGxpbmtzIC0tCi0gIHZsaW5rICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBjb2xvciBvZiB2aXNpdGVkIGxpbmtzIC0tCi0gIGFsaW5rICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBjb2xvciBvZiBzZWxlY3RlZCBsaW5rcyAtLQotICAiPgotCi08IS0tPT09PT09PT09PT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4xLy9FTi8vSFRNTCIKLSAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvSFRNTGxhdDEuZW50Ij4KLSVIVE1MbGF0MTsKLQotPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scy8vRU4vL0hUTUwiCi0gICAiaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMtaHRtbDQwLTE5OTgwNDI0L0hUTUxzeW1ib2wuZW50Ij4KLSVIVE1Mc3ltYm9sOwotCi08IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbC8vRU4vL0hUTUwiCi0gICAiaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMtaHRtbDQwLTE5OTgwNDI0L0hUTUxzcGVjaWFsLmVudCI+Ci0lSFRNTHNwZWNpYWw7Ci08IS0tPT09PT09PT09PT09PT09PT09PSBHZW5lcmljIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGNvcmVhdHRycwotICJpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQgLS0KLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMgLS0KLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQgIC0tIGFzc29jaWF0ZWQgc3R5bGUgaW5mbyAtLQotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgdGl0bGUvYW1wbGlmaWNhdGlvbiAtLSIKLSAgPgotCi08IUVOVElUWSAlIGkxOG4KLSAibGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI0lNUExJRUQgIC0tIGRpcmVjdGlvbiBmb3Igd2Vhay9uZXV0cmFsIHRleHQgLS0iCi0gID4KLQotPCFFTlRJVFkgJSBldmVudHMKLSAib25jbGljayAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGNsaWNrZWQgLS0KLSAgb25kYmxjbGljayAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGRvdWJsZSBjbGlja2VkLS0KLSAgb25tb3VzZWRvd24gJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIHByZXNzZWQgZG93biAtLQotICBvbm1vdXNldXAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIGJ1dHRvbiB3YXMgcmVsZWFzZWQgLS0KLSAgb25tb3VzZW92ZXIgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgb250byAtLQotICBvbm1vdXNlbW92ZSAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIHdhcyBtb3ZlZCB3aXRoaW4gLS0KLSAgb25tb3VzZW91dCAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgYXdheSAtLQotICBvbmtleXByZXNzICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHByZXNzZWQgYW5kIHJlbGVhc2VkIC0tCi0gIG9ua2V5ZG93biAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcHJlc3NlZCBkb3duIC0tCi0gIG9ua2V5dXAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcmVsZWFzZWQgLS0iCi0gID4KLQotPCEtLSBSZXNlcnZlZCBGZWF0dXJlIFN3aXRjaCAtLT4KLTwhRU5USVRZICUgSFRNTC5SZXNlcnZlZCAiSUdOT1JFIj4KLQotPCEtLSBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tPgotPCFbICVIVE1MLlJlc2VydmVkOyBbCi08IUVOVElUWSAlIHJlc2VydmVkCi0gImRhdGFzcmMgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBhIHNpbmdsZSBvciB0YWJ1bGFyIERhdGEgU291cmNlIC0tCi0gIGRhdGFmbGQgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSB0aGUgcHJvcGVydHkgb3IgY29sdW1uIG5hbWUgLS0KLSAgZGF0YWZvcm1hdGFzIChwbGFpbnRleHR8aHRtbCkgcGxhaW50ZXh0IC0tIHRleHQgb3IgaHRtbCAtLSIKLSAgPgotXV0+Ci0KLTwhRU5USVRZICUgcmVzZXJ2ZWQgIiI+Ci0KLTwhRU5USVRZICUgYXR0cnMgIiVjb3JlYXR0cnM7ICVpMThuOyAlZXZlbnRzOyI+Ci0KLTwhRU5USVRZICUgYWxpZ24gImFsaWduIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5KSAgI0lNUExJRUQiCi0gICAgICAgICAgICAgICAgICAgLS0gZGVmYXVsdCBpcyBsZWZ0IGZvciBsdHIgcGFyYWdyYXBocywgcmlnaHQgZm9yIHJ0bCAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgTWFya3VwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgZm9udHN0eWxlCi0gIlRUIHwgSSB8IEIgfCBVIHwgUyB8IFNUUklLRSB8IEJJRyB8IFNNQUxMIj4KLQotPCFFTlRJVFkgJSBwaHJhc2UgIkVNIHwgU1RST05HIHwgREZOIHwgQ09ERSB8Ci0gICAgICAgICAgICAgICAgICAgU0FNUCB8IEtCRCB8IFZBUiB8IENJVEUgfCBBQkJSIHwgQUNST05ZTSIgPgotCi08IUVOVElUWSAlIHNwZWNpYWwKLSAgICJBIHwgSU1HIHwgQVBQTEVUIHwgT0JKRUNUIHwgRk9OVCB8IEJBU0VGT05UIHwgQlIgfCBTQ1JJUFQgfAotICAgIE1BUCB8IFEgfCBTVUIgfCBTVVAgfCBTUEFOIHwgQkRPIHwgSUZSQU1FIj4KLQotPCFFTlRJVFkgJSBmb3JtY3RybCAiSU5QVVQgfCBTRUxFQ1QgfCBURVhUQVJFQSB8IExBQkVMIHwgQlVUVE9OIj4KLQotPCEtLSAlaW5saW5lOyBjb3ZlcnMgaW5saW5lIG9yICJ0ZXh0LWxldmVsIiBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgaW5saW5lICIjUENEQVRBIHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVzcGVjaWFsOyB8ICVmb3JtY3RybDsiPgotCi08IUVMRU1FTlQgKCVmb250c3R5bGU7fCVwaHJhc2U7KSAtIC0gKCVpbmxpbmU7KSo+Ci08IUFUVExJU1QgKCVmb250c3R5bGU7fCVwaHJhc2U7KQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgKFNVQnxTVVApIC0gLSAoJWlubGluZTspKiAgICAtLSBzdWJzY3JpcHQsIHN1cGVyc2NyaXB0IC0tPgotPCFBVFRMSVNUIChTVUJ8U1VQKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgU1BBTiAtIC0gKCVpbmxpbmU7KSogICAgICAgICAtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBTUEFOCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlcmVzZXJ2ZWQ7CQkJICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIEJETyAtIC0gKCVpbmxpbmU7KSogICAgICAgICAgLS0gSTE4TiBCaURpIG92ZXItcmlkZSAtLT4KLTwhQVRUTElTVCBCRE8KLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNSRVFVSVJFRCAtLSBkaXJlY3Rpb25hbGl0eSAtLQotICA+Ci0KLTwhRUxFTUVOVCBCQVNFRk9OVCAtIE8gRU1QVFkgICAgICAgICAgIC0tIGJhc2UgZm9udCBzaXplIC0tPgotPCFBVFRMSVNUIEJBU0VGT05UCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gYmFzZSBmb250IHNpemUgZm9yIEZPTlQgZWxlbWVudHMgLS0KLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIHRleHQgY29sb3IgLS0KLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGZvbnQgbmFtZXMgLS0KLSAgPgotCi08IUVMRU1FTlQgRk9OVCAtIC0gKCVpbmxpbmU7KSogICAgICAgICAtLSBsb2NhbCBjaGFuZ2UgdG8gZm9udCAtLT4KLTwhQVRUTElTVCBGT05UCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICAlaTE4bjsJCSAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gWyt8LV1ubiBlLmcuIHNpemU9IisxIiwgc2l6ZT0iNCIgLS0KLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQgIC0tIHRleHQgY29sb3IgLS0KLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGZvbnQgbmFtZXMgLS0KLSAgPgotCi08IUVMRU1FTlQgQlIgLSBPIEVNUFRZICAgICAgICAgICAgICAgICAtLSBmb3JjZWQgbGluZSBicmVhayAtLT4KLTwhQVRUTElTVCBCUgotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgY2xlYXIgICAgICAgKGxlZnR8YWxsfHJpZ2h0fG5vbmUpIG5vbmUgLS0gY29udHJvbCBvZiB0ZXh0IGZsb3cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEhUTUwgY29udGVudCBtb2RlbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gICAgSFRNTCBoYXMgdHdvIGJhc2ljIGNvbnRlbnQgbW9kZWxzOgotCi0gICAgICAgICVpbmxpbmU7ICAgICBjaGFyYWN0ZXIgbGV2ZWwgZWxlbWVudHMgYW5kIHRleHQgc3RyaW5ncwotICAgICAgICAlYmxvY2s7ICAgICAgYmxvY2stbGlrZSBlbGVtZW50cyBlLmcuIHBhcmFncmFwaHMgYW5kIGxpc3RzCi0tLT4KLQotPCFFTlRJVFkgJSBibG9jawotICAgICAiUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBDRU5URVIgfAotICAgICAgTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLSAgICAgIFRBQkxFIHwgRklFTERTRVQgfCBBRERSRVNTIj4KLQotPCFFTlRJVFkgJSBmbG93ICIlYmxvY2s7IHwgJWlubGluZTsiPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBEb2N1bWVudCBCb2R5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQk9EWSBPIE8gKCVmbG93OykqICsoSU5TfERFTCkgLS0gZG9jdW1lbnQgYm9keSAtLT4KLTwhQVRUTElTVCBCT0RZCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBvbmxvYWQgICAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIGxvYWRlZCAtLQotICBvbnVubG9hZCAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIHJlbW92ZWQgLS0KLSAgYmFja2dyb3VuZCAgICAgICVVUkk7ICAgICAgI0lNUExJRUQgIC0tIHRleHR1cmUgdGlsZSBmb3IgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgLS0KLSAgJWJvZHljb2xvcnM7ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGJnY29sb3IsIHRleHQsIGxpbmssIHZsaW5rLCBhbGluayAtLQotICA+Ci0KLTwhRUxFTUVOVCBBRERSRVNTIC0gLSAoKCVpbmxpbmU7KXxQKSogIC0tIGluZm9ybWF0aW9uIG9uIGF1dGhvciAtLT4KLTwhQVRUTElTVCBBRERSRVNTCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBESVYgLSAtICglZmxvdzspKiAgICAgICAgICAgIC0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIERJVgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFsaWduLCB0ZXh0IGFsaWdubWVudCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgQ0VOVEVSIC0gLSAoJWZsb3c7KSogICAgICAgICAtLSBzaG9ydGhhbmQgZm9yIERJViBhbGlnbj1jZW50ZXIgLS0+Ci08IUFUVExJU1QgQ0VOVEVSCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgU2hhcGUgIihyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpIj4KLTwhRU5USVRZICUgQ29vcmRzICJDREFUQSIgLS0gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLT4KLQotPCFFTEVNRU5UIEEgLSAtICglaW5saW5lOykqIC0oQSkgICAgICAgLS0gYW5jaG9yIC0tPgotPCFBVFRMSVNUIEEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgY29udGVudCB0eXBlIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lZCBsaW5rIGVuZCAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQgIC0tIHJlbmRlciBpbiB0aGlzIGZyYW1lIC0tCi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSBmb3J3YXJkIGxpbmsgdHlwZXMgLS0KLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIHJldmVyc2UgbGluayB0eXBlcyAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBmb3IgdXNlIHdpdGggY2xpZW50LXNpZGUgaW1hZ2UgbWFwcyAtLQotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRCAgLS0gZm9yIHVzZSB3aXRoIGNsaWVudC1zaWRlIGltYWdlIG1hcHMgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDbGllbnQtc2lkZSBpbWFnZSBtYXBzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBUaGVzZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRvY3VtZW50IG9yIGdyb3VwZWQgaW4gYQotICAgICBzZXBhcmF0ZSBkb2N1bWVudCBhbHRob3VnaCB0aGlzIGlzbid0IHlldCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IUVMRU1FTlQgTUFQIC0gLSAoKCVibG9jazspKyB8IEFSRUErKSAtLSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0+Ci08IUFUVExJU1QgTUFQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gZm9yIHJlZmVyZW5jZSBieSB1c2VtYXAgLS0KLSAgPgotCi08IUVMRU1FTlQgQVJFQSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgYXJlYSAtLT4KLTwhQVRUTElTVCBBUkVBCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICByZWN0ICAgICAgLS0gY29udHJvbHMgaW50ZXJwcmV0YXRpb24gb2YgY29vcmRzIC0tCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVEICAtLSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsZW5ndGhzIC0tCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIGxpbmtlZCByZXNvdXJjZSAtLQotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRCAgLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0KLSAgbm9ocmVmICAgICAgKG5vaHJlZikgICAgICAgI0lNUExJRUQgIC0tIHRoaXMgcmVnaW9uIGhhcyBubyBhY3Rpb24gLS0KLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVEIC0tIHNob3J0IGRlc2NyaXB0aW9uIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBUaGUgTElOSyBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBSZWxhdGlvbnNoaXAgdmFsdWVzIGNhbiBiZSB1c2VkIGluIHByaW5jaXBsZToKLQotICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzIHdoZW4gdXNlZAotICAgICAgd2l0aCB0aGUgTElOSyBlbGVtZW50IGluIGRvY3VtZW50IGhlYWQgZS5nLgotICAgICAgICBzdGFydCwgY29udGVudHMsIHByZXZpb3VzLCBuZXh0LCBpbmRleCwgZW5kLCBoZWxwCi0gICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQgKHJlbD1zdHlsZXNoZWV0KQotICAgYykgdG8gbWFrZSBhIGxpbmsgdG8gYSBzY3JpcHQgKHJlbD1zY3JpcHQpCi0gICBkKSBieSBzdHlsZXNoZWV0cyB0byBjb250cm9sIGhvdyBjb2xsZWN0aW9ucyBvZgotICAgICAgaHRtbCBub2RlcyBhcmUgcmVuZGVyZWQgaW50byBwcmludGVkIGRvY3VtZW50cwotICAgZSkgdG8gbWFrZSBhIGxpbmsgdG8gYSBwcmludGFibGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBlLmcuIGEgcG9zdHNjcmlwdCBvciBwZGYgdmVyc2lvbiAocmVsPWFsdGVybmF0ZSBtZWRpYT1wcmludCkKLS0tPgotCi08IUVMRU1FTlQgTElOSyAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBhIG1lZGlhLWluZGVwZW5kZW50IGxpbmsgLS0+Ci08IUFUVExJU1QgTElOSwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQgIC0tIGNoYXIgZW5jb2Rpbmcgb2YgbGlua2VkIHJlc291cmNlIC0tCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIGxpbmtlZCByZXNvdXJjZSAtLQotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCAgLS0gbGFuZ3VhZ2UgY29kZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgY29udGVudCB0eXBlIC0tCi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSBmb3J3YXJkIGxpbmsgdHlwZXMgLS0KLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIHJldmVyc2UgbGluayB0eXBlcyAtLQotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRCAgLS0gZm9yIHJlbmRlcmluZyBvbiB0aGVzZSBtZWRpYSAtLQotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRCAgLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGluIHN0cmljdCBEVEQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIiAtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIE11bHRpTGVuZ3RoICJDREFUQSIgLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotCi08IUVOVElUWSAlIE11bHRpTGVuZ3RocyAiQ0RBVEEiIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIE11bHRpTGVuZ3RoIC0tPgotCi08IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiIC0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci0KLTwhRU5USVRZICUgSUFsaWduICIodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkiIC0tIGNlbnRlcj8gLS0+Ci0KLTwhLS0gVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0ZXh0LW9ubHkgVUFzIGFzIHdlbGwgYXMgCi0gICB0byBtYWtlIGltYWdlIGNvbnRlbnQgdW5kZXJzdGFuZGFibGUgYW5kIG5hdmlnYWJsZSAKLSAgIHRvIHVzZXJzIG9mIG5vbi12aXN1YWwgVUFzLCB5b3UgbmVlZCB0byBwcm92aWRlCi0gICBhIGRlc2NyaXB0aW9uIHdpdGggQUxULCBhbmQgYXZvaWQgc2VydmVyLXNpZGUgaW1hZ2UgbWFwcyAtLT4KLTwhRUxFTUVOVCBJTUcgLSBPIEVNUFRZICAgICAgICAgICAgICAgIC0tIEVtYmVkZGVkIGltYWdlIC0tPgotPCFBVFRMSVNUIElNRwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIFVSSSBvZiBpbWFnZSB0byBlbWJlZCAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGxpbmsgdG8gbG9uZyBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZW1lbnRzIGFsdCkgLS0KLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIGhlaWdodCAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgd2lkdGggLS0KLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBjbGllbnQtc2lkZSBpbWFnZSBtYXAgLS0KLSAgaXNtYXAgICAgICAgKGlzbWFwKSAgICAgICAgI0lNUExJRUQgIC0tIHVzZSBzZXJ2ZXItc2lkZSBpbWFnZSBtYXAgLS0KLSAgYWxpZ24gICAgICAgJUlBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gIGJvcmRlciAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBsaW5rIGJvcmRlciB3aWR0aCAtLQotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gaG9yaXpvbnRhbCBndXR0ZXIgLS0KLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIGd1dHRlciAtLQotICA+Ci0KLTwhLS0gVVNFTUFQIHBvaW50cyB0byBhIE1BUCBlbGVtZW50IHdoaWNoIG1heSBiZSBpbiB0aGlzIGRvY3VtZW50Ci0gIG9yIGFuIGV4dGVybmFsIGRvY3VtZW50LCBhbHRob3VnaCB0aGUgbGF0dGVyIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT0gT0JKRUNUID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIE9CSkVDVCBpcyB1c2VkIHRvIGVtYmVkIG9iamVjdHMgYXMgcGFydCBvZiBIVE1MIHBhZ2VzIAotICBQQVJBTSBlbGVtZW50cyBzaG91bGQgcHJlY2VkZSBvdGhlciBjb250ZW50LiBTR01MIG1peGVkIGNvbnRlbnQKLSAgbW9kZWwgdGVjaG5pY2FsaXR5IHByZWNsdWRlcyBzcGVjaWZ5aW5nIHRoaXMgZm9ybWFsbHkgLi4uCi0tLT4KLQotPCFFTEVNRU5UIE9CSkVDVCAtIC0gKFBBUkFNIHwgJWZsb3c7KSoKLSAtLSBnZW5lcmljIGVtYmVkZGVkIG9iamVjdCAtLT4KLTwhQVRUTElTVCBPQkpFQ1QKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGRlY2xhcmUgICAgIChkZWNsYXJlKSAgICAgICNJTVBMSUVEICAtLSBkZWNsYXJlIGJ1dCBkb24ndCBpbnN0YW50aWF0ZSBmbGFnIC0tCi0gIGNsYXNzaWQgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBpZGVudGlmaWVzIGFuIGltcGxlbWVudGF0aW9uIC0tCi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBiYXNlIFVSSSBmb3IgY2xhc3NpZCwgZGF0YSwgYXJjaGl2ZS0tCi0gIGRhdGEgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSByZWZlcmVuY2UgdG8gb2JqZWN0J3MgZGF0YSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gY29udGVudCB0eXBlIGZvciBkYXRhIC0tCi0gIGNvZGV0eXBlICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIGNvZGUgLS0KLSAgYXJjaGl2ZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlIHNlcGFyYXRlZCBhcmNoaXZlIGxpc3QgLS0KLSAgc3RhbmRieSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIG1lc3NhZ2UgdG8gc2hvdyB3aGlsZSBsb2FkaW5nIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSBoZWlnaHQgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIHdpZHRoIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFsaWduICAgICAgICVJQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGFsaWdubWVudCAtLQotICBib3JkZXIgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gbGluayBib3JkZXIgd2lkdGggLS0KLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGhvcml6b250YWwgZ3V0dGVyIC0tCi0gIHZzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBndXR0ZXIgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIFBBUkFNIC0gTyBFTVBUWSAgICAgICAgICAgICAgLS0gbmFtZWQgcHJvcGVydHkgdmFsdWUgLS0+Ci08IUFUVExJU1QgUEFSQU0KLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQgIC0tIGRvY3VtZW50LXdpZGUgdW5pcXVlIGlkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBwcm9wZXJ0eSBuYW1lIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBwcm9wZXJ0eSB2YWx1ZSAtLQotICB2YWx1ZXR5cGUgICAoREFUQXxSRUZ8T0JKRUNUKSBEQVRBICAgLS0gSG93IHRvIGludGVycHJldCB2YWx1ZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gY29udGVudCB0eXBlIGZvciB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB2YWx1ZXR5cGU9cmVmIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSmF2YSBBUFBMRVQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBPbmUgb2YgY29kZSBvciBvYmplY3QgYXR0cmlidXRlcyBtdXN0IGJlIHByZXNlbnQuCi0gIFBsYWNlIFBBUkFNIGVsZW1lbnRzIGJlZm9yZSBvdGhlciBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgQVBQTEVUIC0gLSAoUEFSQU0gfCAlZmxvdzspKiAtLSBKYXZhIGFwcGxldCAtLT4KLTwhQVRUTElTVCBBUFBMRVQKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBvcHRpb25hbCBiYXNlIFVSSSBmb3IgYXBwbGV0IC0tCi0gIGFyY2hpdmUgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBjb21tYSBzZXBhcmF0ZWQgYXJjaGl2ZSBsaXN0IC0tCi0gIGNvZGUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBhcHBsZXQgY2xhc3MgZmlsZSAtLQotICBvYmplY3QgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VyaWFsaXplZCBhcHBsZXQgZmlsZSAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGFsbG93cyBhcHBsZXRzIHRvIGZpbmQgZWFjaCBvdGhlciAtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjUkVRVUlSRUQgLS0gaW5pdGlhbCB3aWR0aCAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjUkVRVUlSRUQgLS0gaW5pdGlhbCBoZWlnaHQgLS0KLSAgYWxpZ24gICAgICAgJUlBbGlnbjsgICAgICAgI0lNUExJRUQgIC0tIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYWxpZ25tZW50IC0tCi0gIGhzcGFjZSAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBob3Jpem9udGFsIGd1dHRlciAtLQotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgZ3V0dGVyIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEhSIC0gTyBFTVBUWSAtLSBob3Jpem9udGFsIHJ1bGUgLS0+Ci08IUFUVExJU1QgSFIKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gICVldmVudHM7Ci0gIGFsaWduICAgICAgIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQKLSAgbm9zaGFkZSAgICAgKG5vc2hhZGUpICAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQYXJhZ3JhcGhzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgUCAtIE8gKCVpbmxpbmU7KSogICAgICAgICAgICAtLSBwYXJhZ3JhcGggLS0+Ci08IUFUVExJU1QgUAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFsaWduLCB0ZXh0IGFsaWdubWVudCAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhlYWRpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgVGhlcmUgYXJlIHNpeCBsZXZlbHMgb2YgaGVhZGluZ3MgZnJvbSBIMSAodGhlIG1vc3QgaW1wb3J0YW50KQotICB0byBINiAodGhlIGxlYXN0IGltcG9ydGFudCkuCi0tLT4KLQotPCFFTEVNRU5UICglaGVhZGluZzspICAtIC0gKCVpbmxpbmU7KSogLS0gaGVhZGluZyAtLT4KLTwhQVRUTElTVCAoJWhlYWRpbmc7KQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFsaWduLCB0ZXh0IGFsaWdubWVudCAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZXhjbHVkZXMgbWFya3VwIGZvciBpbWFnZXMgYW5kIGNoYW5nZXMgaW4gZm9udCBzaXplIC0tPgotPCFFTlRJVFkgJSBwcmUuZXhjbHVzaW9uICJJTUd8T0JKRUNUfEFQUExFVHxCSUd8U01BTEx8U1VCfFNVUHxGT05UfEJBU0VGT05UIj4KLQotPCFFTEVNRU5UIFBSRSAtIC0gKCVpbmxpbmU7KSogLSglcHJlLmV4Y2x1c2lvbjspIC0tIHByZWZvcm1hdHRlZCB0ZXh0IC0tPgotPCFBVFRMSVNUIFBSRQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgd2lkdGggICAgICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09IElubGluZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgUSAtIC0gKCVpbmxpbmU7KSogICAgICAgICAgICAtLSBzaG9ydCBpbmxpbmUgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIFEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIHNvdXJjZSBkb2N1bWVudCBvciBtc2cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBCbG9jay1saWtlIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQkxPQ0tRVU9URSAtIC0gKCVmbG93OykqICAgICAtLSBsb25nIHF1b3RhdGlvbiAtLT4KLTwhQVRUTElTVCBCTE9DS1FVT1RFCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBzb3VyY2UgZG9jdW1lbnQgb3IgbXNnIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW5zZXJ0ZWQvRGVsZXRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotCi08IS0tIElOUy9ERUwgYXJlIGhhbmRsZWQgYnkgaW5jbHVzaW9uIG9uIEJPRFkgLS0+Ci08IUVMRU1FTlQgKElOU3xERUwpIC0gLSAoJWZsb3c7KSogICAgICAtLSBpbnNlcnRlZCB0ZXh0LCBkZWxldGVkIHRleHQgLS0+Ci08IUFUVExJU1QgKElOU3xERUwpCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gaW5mbyBvbiByZWFzb24gZm9yIGNoYW5nZSAtLQotICBkYXRldGltZSAgICAlRGF0ZXRpbWU7ICAgICAjSU1QTElFRCAgLS0gZGF0ZSBhbmQgdGltZSBvZiBjaGFuZ2UgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGRlZmluaXRpb24gbGlzdHMgLSBEVCBmb3IgdGVybSwgREQgZm9yIGl0cyBkZWZpbml0aW9uIC0tPgotCi08IUVMRU1FTlQgREwgLSAtIChEVHxERCkrICAgICAgICAgICAgICAtLSBkZWZpbml0aW9uIGxpc3QgLS0+Ci08IUFUVExJU1QgREwKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVEICAtLSByZWR1Y2VkIGludGVyaXRlbSBzcGFjaW5nIC0tCi0gID4KLQotPCFFTEVNRU5UIERUIC0gTyAoJWlubGluZTspKiAgICAgICAgICAgLS0gZGVmaW5pdGlvbiB0ZXJtIC0tPgotPCFFTEVNRU5UIEREIC0gTyAoJWZsb3c7KSogICAgICAgICAgICAgLS0gZGVmaW5pdGlvbiBkZXNjcmlwdGlvbiAtLT4KLTwhQVRUTElTVCAoRFR8REQpCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS0gT3JkZXJlZCBsaXN0cyAoT0wpIE51bWJlcmluZyBzdHlsZQotCi0gICAgMSAgIGFyYWJsaWMgbnVtYmVycyAgICAgMSwgMiwgMywgLi4uCi0gICAgYSAgIGxvd2VyIGFscGhhICAgICAgICAgYSwgYiwgYywgLi4uCi0gICAgQSAgIHVwcGVyIGFscGhhICAgICAgICAgQSwgQiwgQywgLi4uCi0gICAgaSAgIGxvd2VyIHJvbWFuICAgICAgICAgaSwgaWksIGlpaSwgLi4uCi0gICAgSSAgIHVwcGVyIHJvbWFuICAgICAgICAgSSwgSUksIElJSSwgLi4uCi0KLSAgICBUaGUgc3R5bGUgaXMgYXBwbGllZCB0byB0aGUgc2VxdWVuY2UgbnVtYmVyIHdoaWNoIGJ5IGRlZmF1bHQKLSAgICBpcyByZXNldCB0byAxIGZvciB0aGUgZmlyc3QgbGlzdCBpdGVtIGluIGFuIG9yZGVyZWQgbGlzdC4KLQotICAgIFRoaXMgY2FuJ3QgYmUgZXhwcmVzc2VkIGRpcmVjdGx5IGluIFNHTUwgZHVlIHRvIGNhc2UgZm9sZGluZy4KLS0tPgotCi08IUVOVElUWSAlIE9MU3R5bGUgIkNEQVRBIiAgICAgIC0tIGNvbnN0cmFpbmVkIHRvOiAiKDF8YXxBfGl8SSkiIC0tPgotCi08IUVMRU1FTlQgT0wgLSAtIChMSSkrICAgICAgICAgICAgICAgICAtLSBvcmRlcmVkIGxpc3QgLS0+Ci08IUFUVExJU1QgT0wKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHR5cGUgICAgICAgICVPTFN0eWxlOyAgICAgICNJTVBMSUVEICAtLSBudW1iZXJpbmcgc3R5bGUgLS0KLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQgIC0tIHJlZHVjZWQgaW50ZXJpdGVtIHNwYWNpbmcgLS0KLSAgc3RhcnQgICAgICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciAtLQotICA+Ci0KLTwhLS0gVW5vcmRlcmVkIExpc3RzIChVTCkgYnVsbGV0IHN0eWxlcyAtLT4KLTwhRU5USVRZICUgVUxTdHlsZSAiKGRpc2N8c3F1YXJlfGNpcmNsZSkiPgotCi08IUVMRU1FTlQgVUwgLSAtIChMSSkrICAgICAgICAgICAgICAgICAtLSB1bm9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBVTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJVVMU3R5bGU7ICAgICAgI0lNUExJRUQgIC0tIGJ1bGxldCBzdHlsZSAtLQotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRCAgLS0gcmVkdWNlZCBpbnRlcml0ZW0gc3BhY2luZyAtLQotICA+Ci0KLTwhRUxFTUVOVCAoRElSfE1FTlUpIC0gLSAoTEkpKyAtKCVibG9jazspIC0tIGRpcmVjdG9yeSBsaXN0LCBtZW51IGxpc3QgLS0+Ci08IUFUVExJU1QgRElSCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRAotICA+Ci08IUFUVExJU1QgTUVOVQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVOVElUWSAlIExJU3R5bGUgIkNEQVRBIiAtLSBjb25zdHJhaW5lZCB0bzogIiglVUxTdHlsZTt8JU9MU3R5bGU7KSIgLS0+Ci0KLTwhRUxFTUVOVCBMSSAtIE8gKCVmbG93OykqICAgICAgICAgICAgIC0tIGxpc3QgaXRlbSAtLT4KLTwhQVRUTElTVCBMSQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUxJU3R5bGU7ICAgICAgI0lNUExJRUQgIC0tIGxpc3QgaXRlbSBzdHlsZSAtLQotICB2YWx1ZSAgICAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXQgc2VxdWVuY2UgbnVtYmVyIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRm9ybXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhRUxFTUVOVCBGT1JNIC0gLSAoJWZsb3c7KSogLShGT1JNKSAgIC0tIGludGVyYWN0aXZlIGZvcm0gLS0+Ci08IUFUVExJU1QgRk9STQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWN0aW9uICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIHNlcnZlci1zaWRlIGZvcm0gaGFuZGxlciAtLQotICBtZXRob2QgICAgICAoR0VUfFBPU1QpICAgICBHRVQgICAgICAgLS0gSFRUUCBtZXRob2QgdXNlZCB0byBzdWJtaXQgdGhlIGZvcm0tLQotICBlbmN0eXBlICAgICAlQ29udGVudFR5cGU7ICAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICBvbnN1Ym1pdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGZvcm0gd2FzIHN1Ym1pdHRlZCAtLQotICBvbnJlc2V0ICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGZvcm0gd2FzIHJlc2V0IC0tCi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVEICAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLQotICBhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7ICAjSU1QTElFRCAgLS0gbGlzdCBvZiBzdXBwb3J0ZWQgY2hhcnNldHMgLS0KLSAgPgotCi08IS0tIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkIC0tPgotPCFFTEVNRU5UIExBQkVMIC0gLSAoJWlubGluZTspKiAtKExBQkVMKSAtLSBmb3JtIGZpZWxkIGxhYmVsIHRleHQgLS0+Ci08IUFUVExJU1QgTEFCRUwKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGZvciAgICAgICAgIElEUkVGICAgICAgICAgICNJTVBMSUVEICAtLSBtYXRjaGVzIGZpZWxkIElEIHZhbHVlIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCFFTlRJVFkgJSBJbnB1dFR5cGUKLSAgIihURVhUIHwgUEFTU1dPUkQgfCBDSEVDS0JPWCB8Ci0gICAgUkFESU8gfCBTVUJNSVQgfCBSRVNFVCB8Ci0gICAgRklMRSB8IEhJRERFTiB8IElNQUdFIHwgQlVUVE9OKSIKLSAgID4KLQotPCEtLSBhdHRyaWJ1dGUgbmFtZSByZXF1aXJlZCBmb3IgYWxsIGJ1dCBzdWJtaXQgJiByZXNldCAtLT4KLTwhRUxFTUVOVCBJTlBVVCAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBJTlBVVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUlucHV0VHlwZTsgICAgVEVYVCAgICAgIC0tIHdoYXQga2luZCBvZiB3aWRnZXQgaXMgbmVlZGVkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSByZXF1aXJlZCBmb3IgcmFkaW8gYW5kIGNoZWNrYm94ZXMgLS0KLSAgY2hlY2tlZCAgICAgKGNoZWNrZWQpICAgICAgI0lNUExJRUQgIC0tIGZvciByYWRpbyBidXR0b25zIGFuZCBjaGVjayBib3hlcyAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVEICAtLSBmb3IgdGV4dCBhbmQgcGFzc3dkIC0tCi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzcGVjaWZpYyB0byBlYWNoIHR5cGUgb2YgZmllbGQgLS0KLSAgbWF4bGVuZ3RoICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIG1heCBjaGFycyBmb3IgdGV4dCBmaWVsZHMgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGZvciBmaWVsZHMgd2l0aCBpbWFnZXMgLS0KLSAgYWx0ICAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNob3J0IGRlc2NyaXB0aW9uIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBzb21lIHRleHQgd2FzIHNlbGVjdGVkIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRCAgLS0gbGlzdCBvZiBNSU1FIHR5cGVzIGZvciBmaWxlIHVwbG9hZCAtLQotICBhbGlnbiAgICAgICAlSUFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIFNFTEVDVCAtIC0gKE9QVEdST1VQfE9QVElPTikrIC0tIG9wdGlvbiBzZWxlY3RvciAtLT4KLTwhQVRUTElTVCBTRUxFQ1QKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBmaWVsZCBuYW1lIC0tCi0gIHNpemUgICAgICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSByb3dzIHZpc2libGUgLS0KLSAgbXVsdGlwbGUgICAgKG11bHRpcGxlKSAgICAgI0lNUExJRUQgIC0tIGRlZmF1bHQgaXMgc2luZ2xlIHNlbGVjdGlvbiAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIE9QVEdST1VQIC0gLSAoT1BUSU9OKSsgLS0gb3B0aW9uIGdyb3VwIC0tPgotPCFBVFRMSVNUIE9QVEdST1VQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBmb3IgdXNlIGluIGhpZXJhcmNoaWNhbCBtZW51cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBPUFRJT04gLSBPICgjUENEQVRBKSAgICAgICAgIC0tIHNlbGVjdGFibGUgY2hvaWNlIC0tPgotPCFBVFRMSVNUIE9QVElPTgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc2VsZWN0ZWQgICAgKHNlbGVjdGVkKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gZm9yIHVzZSBpbiBoaWVyYXJjaGljYWwgbWVudXMgLS0KLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGRlZmF1bHRzIHRvIGVsZW1lbnQgY29udGVudCAtLQotICA+Ci0KLTwhRUxFTUVOVCBURVhUQVJFQSAtIC0gKCNQQ0RBVEEpICAgICAgIC0tIG11bHRpLWxpbmUgdGV4dCBmaWVsZCAtLT4KLTwhQVRUTElTVCBURVhUQVJFQQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgcm93cyAgICAgICAgTlVNQkVSICAgICAgICAgI1JFUVVJUkVECi0gIGNvbHMgICAgICAgIE5VTUJFUiAgICAgICAgICNSRVFVSVJFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBzb21lIHRleHQgd2FzIHNlbGVjdGVkIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IS0tCi0gICNQQ0RBVEEgaXMgdG8gc29sdmUgdGhlIG1peGVkIGNvbnRlbnQgcHJvYmxlbSwKLSAgcGVyIHNwZWNpZmljYXRpb24gb25seSB3aGl0ZXNwYWNlIGlzIGFsbG93ZWQgdGhlcmUhCi0gLS0+Ci08IUVMRU1FTlQgRklFTERTRVQgLSAtICgjUENEQVRBLExFR0VORCwoJWZsb3c7KSopIC0tIGZvcm0gY29udHJvbCBncm91cCAtLT4KLTwhQVRUTElTVCBGSUVMRFNFVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgTEVHRU5EIC0gLSAoJWlubGluZTspKiAgICAgICAtLSBmaWVsZHNldCBsZWdlbmQgLS0+Ci08IUVOVElUWSAlIExBbGlnbiAiKHRvcHxib3R0b218bGVmdHxyaWdodCkiPgotCi08IUFUVExJU1QgTEVHRU5ECi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIGFsaWduICAgICAgICVMQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSByZWxhdGl2ZSB0byBmaWVsZHNldCAtLQotICA+Ci0KLTwhRUxFTUVOVCBCVVRUT04gLSAtCi0gICAgICglZmxvdzspKiAtKEF8JWZvcm1jdHJsO3xGT1JNfElTSU5ERVh8RklFTERTRVR8SUZSQU1FKQotICAgICAtLSBwdXNoIGJ1dHRvbiAtLT4KLTwhQVRUTElTVCBCVVRUT04KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzZW50IHRvIHNlcnZlciB3aGVuIHN1Ym1pdHRlZCAtLQotICB0eXBlICAgICAgICAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgc3VibWl0IC0tIGZvciB1c2UgYXMgZm9ybSBidXR0b24gLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT0gVGFibGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIElFVEYgSFRNTCB0YWJsZSBzdGFuZGFyZCwgc2VlIFtSRkMxOTQyXSAtLT4KLQotPCEtLQotIFRoZSBCT1JERVIgYXR0cmlidXRlIHNldHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgZnJhbWUgYXJvdW5kIHRoZQotIHRhYmxlLiBUaGUgZGVmYXVsdCB1bml0cyBhcmUgc2NyZWVuIHBpeGVscy4KLQotIFRoZSBGUkFNRSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoaWNoIHBhcnRzIG9mIHRoZSBmcmFtZSBhcm91bmQKLSB0aGUgdGFibGUgc2hvdWxkIGJlIHJlbmRlcmVkLiBUaGUgdmFsdWVzIGFyZSBub3QgdGhlIHNhbWUgYXMKLSBDQUxTIHRvIGF2b2lkIGEgbmFtZSBjbGFzaCB3aXRoIHRoZSBWQUxJR04gYXR0cmlidXRlLgotCi0gVGhlIHZhbHVlICJib3JkZXIiIGlzIGluY2x1ZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoCi0gPFRBQkxFIEJPUkRFUj4gd2hpY2ggeWllbGRzIGZyYW1lPWJvcmRlciBhbmQgYm9yZGVyPWltcGxpZWQKLSBGb3IgPFRBQkxFIEJPUkRFUj0xPiB5b3UgZ2V0IGJvcmRlcj0xIGFuZCBmcmFtZT1pbXBsaWVkLiBJbiB0aGlzCi0gY2FzZSwgaXQgaXMgYXBwcm9wcmlhdGUgdG8gdHJlYXQgdGhpcyBhcyBmcmFtZT1ib3JkZXIgZm9yIGJhY2t3YXJkcwotIGNvbXBhdGliaWxpdHkgd2l0aCBkZXBsb3llZCBicm93c2Vycy4KLS0tPgotPCFFTlRJVFkgJSBURnJhbWUgIih2b2lkfGFib3ZlfGJlbG93fGhzaWRlc3xsaHN8cmhzfHZzaWRlc3xib3h8Ym9yZGVyKSI+Ci0KLTwhLS0KLSBUaGUgUlVMRVMgYXR0cmlidXRlIGRlZmluZXMgd2hpY2ggcnVsZXMgdG8gZHJhdyBiZXR3ZWVuIGNlbGxzOgotCi0gSWYgUlVMRVMgaXMgYWJzZW50IHRoZW4gYXNzdW1lOgotICAgICAibm9uZSIgaWYgQk9SREVSIGlzIGFic2VudCBvciBCT1JERVI9MCBvdGhlcndpc2UgImFsbCIKLS0tPgotCi08IUVOVElUWSAlIFRSdWxlcyAiKG5vbmUgfCBncm91cHMgfCByb3dzIHwgY29scyB8IGFsbCkiPgotICAKLTwhLS0gaG9yaXpvbnRhbCBwbGFjZW1lbnQgb2YgdGFibGUgcmVsYXRpdmUgdG8gZG9jdW1lbnQgLS0+Ci08IUVOVElUWSAlIFRBbGlnbiAiKGxlZnR8Y2VudGVyfHJpZ2h0KSI+Ci0KLTwhLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbGhhbGlnbgotICAiYWxpZ24gICAgICAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeXxjaGFyKSAjSU1QTElFRAotICAgY2hhciAgICAgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWxpZ25tZW50IGNoYXIsIGUuZy4gY2hhcj0nOicgLS0KLSAgIGNoYXJvZmYgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG9mZnNldCBmb3IgYWxpZ25tZW50IGNoYXIgLS0iCi0gID4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbHZhbGlnbgotICAidmFsaWduICAgICAodG9wfG1pZGRsZXxib3R0b218YmFzZWxpbmUpICNJTVBMSUVEIgotICA+Ci0KLTwhRUxFTUVOVCBUQUJMRSAtIC0KLSAgICAgKENBUFRJT04/LCAoQ09MKnxDT0xHUk9VUCopLCBUSEVBRD8sIFRGT09UPywgVEJPRFkrKT4KLTwhRUxFTUVOVCBDQVBUSU9OICAtIC0gKCVpbmxpbmU7KSogICAgIC0tIHRhYmxlIGNhcHRpb24gLS0+Ci08IUVMRU1FTlQgVEhFQUQgICAgLSBPIChUUikrICAgICAgICAgICAtLSB0YWJsZSBoZWFkZXIgLS0+Ci08IUVMRU1FTlQgVEZPT1QgICAgLSBPIChUUikrICAgICAgICAgICAtLSB0YWJsZSBmb290ZXIgLS0+Ci08IUVMRU1FTlQgVEJPRFkgICAgTyBPIChUUikrICAgICAgICAgICAtLSB0YWJsZSBib2R5IC0tPgotPCFFTEVNRU5UIENPTEdST1VQIC0gTyAoY29sKSogICAgICAgICAgLS0gdGFibGUgY29sdW1uIGdyb3VwIC0tPgotPCFFTEVNRU5UIENPTCAgICAgIC0gTyBFTVBUWSAgICAgICAgICAgLS0gdGFibGUgY29sdW1uIC0tPgotPCFFTEVNRU5UIFRSICAgICAgIC0gTyAoVEh8VEQpKyAgICAgICAgLS0gdGFibGUgcm93IC0tPgotPCFFTEVNRU5UIChUSHxURCkgIC0gTyAoJWZsb3c7KSogICAgICAgLS0gdGFibGUgaGVhZGVyIGNlbGwsIHRhYmxlIGRhdGEgY2VsbC0tPgotCi08IUFUVExJU1QgVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAtLSB0YWJsZSBlbGVtZW50IC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzdW1tYXJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gcHVycG9zZS9zdHJ1Y3R1cmUgZm9yIHNwZWVjaCBvdXRwdXQtLQotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gdGFibGUgd2lkdGggLS0KLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIGNvbnRyb2xzIGZyYW1lIHdpZHRoIGFyb3VuZCB0YWJsZSAtLQotICBmcmFtZSAgICAgICAlVEZyYW1lOyAgICAgICAjSU1QTElFRCAgLS0gd2hpY2ggcGFydHMgb2YgZnJhbWUgdG8gcmVuZGVyIC0tCi0gIHJ1bGVzICAgICAgICVUUnVsZXM7ICAgICAgICNJTVBMSUVEICAtLSBydWxpbmdzIGJldHdlZW4gcm93cyBhbmQgY29scyAtLQotICBjZWxsc3BhY2luZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gc3BhY2luZyBiZXR3ZWVuIGNlbGxzIC0tCi0gIGNlbGxwYWRkaW5nICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBzcGFjaW5nIHdpdGhpbiBjZWxscyAtLQotICBhbGlnbiAgICAgICAlVEFsaWduOyAgICAgICAjSU1QTElFRCAgLS0gdGFibGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gd2luZG93IC0tCi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBiYWNrZ3JvdW5kIGNvbG9yIGZvciBjZWxscyAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgZGF0YXBhZ2VzaXplIENEQVRBICAgICAgICAgI0lNUExJRUQgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTlRJVFkgJSBDQWxpZ24gIih0b3B8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCFBVFRMSVNUIENBUFRJT04KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFsaWduICAgICAgICVDQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSByZWxhdGl2ZSB0byB0YWJsZSAtLQotICA+Ci0KLTwhLS0KLUNPTEdST1VQIGdyb3VwcyBhIHNldCBvZiBDT0wgZWxlbWVudHMuIEl0IGFsbG93cyB5b3UgdG8gZ3JvdXAKLXNldmVyYWwgc2VtYW50aWNhbGx5IHJlbGF0ZWQgY29sdW1ucyB0b2dldGhlci4KLS0tPgotPCFBVFRMSVNUIENPTEdST1VQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzcGFuICAgICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gZGVmYXVsdCBudW1iZXIgb2YgY29sdW1ucyBpbiBncm91cCAtLQotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRCAgLS0gZGVmYXVsdCB3aWR0aCBmb3IgZW5jbG9zZWQgQ09McyAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLTwhLS0KLSBDT0wgZWxlbWVudHMgZGVmaW5lIHRoZSBhbGlnbm1lbnQgcHJvcGVydGllcyBmb3IgY2VsbHMgaW4KLSBvbmUgb3IgbW9yZSBjb2x1bW5zLgotCi0gVGhlIFdJRFRIIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW5zLCBlLmcuCi0KLSAgICAgd2lkdGg9NjQgICAgICAgIHdpZHRoIGluIHNjcmVlbiBwaXhlbHMKLSAgICAgd2lkdGg9MC41KiAgICAgIHJlbGF0aXZlIHdpZHRoIG9mIDAuNQotCi0gVGhlIFNQQU4gYXR0cmlidXRlIGNhdXNlcyB0aGUgYXR0cmlidXRlcyBvZiBvbmUKLSBDT0wgZWxlbWVudCB0byBhcHBseSB0byBtb3JlIHRoYW4gb25lIGNvbHVtbi4KLS0tPgotPCFBVFRMSVNUIENPTCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gY29sdW1uIGdyb3VwcyBhbmQgcHJvcGVydGllcyAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3BhbiAgICAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIENPTCBhdHRyaWJ1dGVzIGFmZmVjdCBOIGNvbHVtbnMgLS0KLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQgIC0tIGNvbHVtbiB3aWR0aCBzcGVjaWZpY2F0aW9uIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotPCEtLQotICAgIFVzZSBUSEVBRCB0byBkdXBsaWNhdGUgaGVhZGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBoZWFkZXJzIHdoZW4KLSAgICBUQk9EWSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIFRGT09UIHRvIGR1cGxpY2F0ZSBmb290ZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGZvb3RlcnMgd2hlbgotICAgIFRCT0RZIHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgbXVsdGlwbGUgVEJPRFkgc2VjdGlvbnMgd2hlbiBydWxlcyBhcmUgbmVlZGVkCi0gICAgYmV0d2VlbiBncm91cHMgb2YgdGFibGUgcm93cy4KLS0tPgotPCFBVFRMSVNUIChUSEVBRHxUQk9EWXxURk9PVCkgICAgICAgICAgLS0gdGFibGUgc2VjdGlvbiAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi08IUFUVExJU1QgVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB0YWJsZSByb3cgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBiYWNrZ3JvdW5kIGNvbG9yIGZvciByb3cgLS0KLSAgPgotCi0KLTwhLS0gU2NvcGUgaXMgc2ltcGxlciB0aGFuIGF4ZXMgYXR0cmlidXRlIGZvciBjb21tb24gdGFibGVzIC0tPgotPCFFTlRJVFkgJSBTY29wZSAiKHJvd3xjb2x8cm93Z3JvdXB8Y29sZ3JvdXApIj4KLQotPCEtLSBUSCBpcyBmb3IgaGVhZGVycywgVEQgZm9yIGRhdGEsIGJ1dCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggdXNlIFREIC0tPgotPCFBVFRMSVNUIChUSHxURCkgICAgICAgICAgICAgICAgICAgICAgLS0gaGVhZGVyIG9yIGRhdGEgY2VsbCAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWJiciAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGFiYnJldmlhdGlvbiBmb3IgaGVhZGVyIGNlbGwgLS0KLSAgYXhpcyAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWVzIGdyb3VwcyBvZiByZWxhdGVkIGhlYWRlcnMtLQotICBoZWFkZXJzICAgICBJRFJFRlMgICAgICAgICAjSU1QTElFRCAgLS0gbGlzdCBvZiBpZCdzIGZvciBoZWFkZXIgY2VsbHMgLS0KLSAgc2NvcGUgICAgICAgJVNjb3BlOyAgICAgICAgI0lNUExJRUQgIC0tIHNjb3BlIGNvdmVyZWQgYnkgaGVhZGVyIGNlbGxzIC0tCi0gIHJvd3NwYW4gICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBudW1iZXIgb2Ygcm93cyBzcGFubmVkIGJ5IGNlbGwgLS0KLSAgY29sc3BhbiAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIG51bWJlciBvZiBjb2xzIHNwYW5uZWQgYnkgY2VsbCAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICBub3dyYXAgICAgICAobm93cmFwKSAgICAgICAjSU1QTElFRCAgLS0gc3VwcHJlc3Mgd29yZCB3cmFwIC0tCi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVEICAtLSBjZWxsIGJhY2tncm91bmQgY29sb3IgLS0KLSAgd2lkdGggICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQgIC0tIHdpZHRoIGZvciBjZWxsIC0tCi0gIGhlaWdodCAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBoZWlnaHQgZm9yIGNlbGwgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IERvY3VtZW50IEZyYW1lcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZSBjb250ZW50IG1vZGVsIGZvciBIVE1MIGRvY3VtZW50cyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIEhFQUQgaXMKLSAgZm9sbG93ZWQgYnkgYSBGUkFNRVNFVCBvciBCT0RZIGVsZW1lbnQuIFRoZSB3aWRlc3ByZWFkIG9taXNzaW9uIG9mCi0gIHRoZSBCT0RZIHN0YXJ0IHRhZyBtYWtlcyBpdCBpbXByYWN0aWNhbCB0byBkZWZpbmUgdGhlIGNvbnRlbnQgbW9kZWwKLSAgd2l0aG91dCB0aGUgdXNlIG9mIGEgbWFya2VkIHNlY3Rpb24uCi0tLT4KLQotPCEtLSBGZWF0dXJlIFN3aXRjaCBmb3IgZnJhbWVzZXQgZG9jdW1lbnRzIC0tPgotPCFFTlRJVFkgJSBIVE1MLkZyYW1lc2V0ICJJR05PUkUiPgotCi08IVsgJUhUTUwuRnJhbWVzZXQ7IFsKLTwhRUxFTUVOVCBGUkFNRVNFVCAtIC0gKChGUkFNRVNFVHxGUkFNRSkrICYgTk9GUkFNRVM/KSAtLSB3aW5kb3cgc3ViZGl2aXNpb24tLT4KLTwhQVRUTElTVCBGUkFNRVNFVAotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgcm93cyAgICAgICAgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDEwMCUgKDEgcm93KSAtLQotICBjb2xzICAgICAgICAlTXVsdGlMZW5ndGhzOyAjSU1QTElFRCAgLS0gbGlzdCBvZiBsZW5ndGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogMTAwJSAoMSBjb2wpIC0tCi0gIG9ubG9hZCAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhbGwgdGhlIGZyYW1lcyBoYXZlIGJlZW4gbG9hZGVkICAtLSAKLSAgb251bmxvYWQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGFsbCB0aGUgZnJhbWVzIGhhdmUgYmVlbiByZW1vdmVkIC0tIAotICA+Ci1dXT4KLQotPCFbICVIVE1MLkZyYW1lc2V0OyBbCi08IS0tIHJlc2VydmVkIGZyYW1lIG5hbWVzIHN0YXJ0IHdpdGggIl8iIG90aGVyd2lzZSBzdGFydHMgd2l0aCBsZXR0ZXIgLS0+Ci08IUVMRU1FTlQgRlJBTUUgLSBPIEVNUFRZICAgICAgICAgICAgICAtLSBzdWJ3aW5kb3cgLS0+Ci08IUFUVExJU1QgRlJBTUUKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBsaW5rIHRvIGxvbmcgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wbGVtZW50cyB0aXRsZSkgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgZnJhbWUgZm9yIHRhcmdldHRpbmcgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHNvdXJjZSBvZiBmcmFtZSBjb250ZW50IC0tCi0gIGZyYW1lYm9yZGVyICgxfDApICAgICAgICAgIDEgICAgICAgICAtLSByZXF1ZXN0IGZyYW1lIGJvcmRlcnM/IC0tCi0gIG1hcmdpbndpZHRoICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBtYXJnaW4gd2lkdGhzIGluIHBpeGVscyAtLQotICBtYXJnaW5oZWlnaHQgJVBpeGVsczsgICAgICAjSU1QTElFRCAgLS0gbWFyZ2luIGhlaWdodCBpbiBwaXhlbHMgLS0KLSAgbm9yZXNpemUgICAgKG5vcmVzaXplKSAgICAgI0lNUExJRUQgIC0tIGFsbG93IHVzZXJzIHRvIHJlc2l6ZSBmcmFtZXM/IC0tCi0gIHNjcm9sbGluZyAgICh5ZXN8bm98YXV0bykgIGF1dG8gICAgICAtLSBzY3JvbGxiYXIgb3Igbm9uZSAtLQotICA+Ci1dXT4KLQotPCFFTEVNRU5UIElGUkFNRSAtIC0gKCVmbG93OykqICAgICAgICAgLS0gaW5saW5lIHN1YndpbmRvdyAtLT4KLTwhQVRUTElTVCBJRlJBTUUKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBsaW5rIHRvIGxvbmcgZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wbGVtZW50cyB0aXRsZSkgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgZnJhbWUgZm9yIHRhcmdldHRpbmcgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHNvdXJjZSBvZiBmcmFtZSBjb250ZW50IC0tCi0gIGZyYW1lYm9yZGVyICgxfDApICAgICAgICAgIDEgICAgICAgICAtLSByZXF1ZXN0IGZyYW1lIGJvcmRlcnM/IC0tCi0gIG1hcmdpbndpZHRoICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBtYXJnaW4gd2lkdGhzIGluIHBpeGVscyAtLQotICBtYXJnaW5oZWlnaHQgJVBpeGVsczsgICAgICAjSU1QTElFRCAgLS0gbWFyZ2luIGhlaWdodCBpbiBwaXhlbHMgLS0KLSAgc2Nyb2xsaW5nICAgKHllc3xub3xhdXRvKSAgYXV0byAgICAgIC0tIHNjcm9sbGJhciBvciBub25lIC0tCi0gIGFsaWduICAgICAgICVJQWxpZ247ICAgICAgICNJTVBMSUVEICAtLSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGFsaWdubWVudCAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gZnJhbWUgaGVpZ2h0IC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBmcmFtZSB3aWR0aCAtLQotICA+Ci0KLTwhWyAlSFRNTC5GcmFtZXNldDsgWwotPCFFTlRJVFkgJSBub2ZyYW1lcy5jb250ZW50ICIoQk9EWSkgLShOT0ZSQU1FUykiPgotXV0+Ci0KLTwhRU5USVRZICUgbm9mcmFtZXMuY29udGVudCAiKCVmbG93OykqIj4KLQotPCFFTEVNRU5UIE5PRlJBTUVTIC0gLSAlbm9mcmFtZXMuY29udGVudDsKLSAtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBmcmFtZS1iYXNlZCByZW5kZXJpbmcgLS0+Ci08IUFUVExJU1QgTk9GUkFNRVMKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgSGVhZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gJWhlYWQubWlzYzsgZGVmaW5lZCBlYXJsaWVyIG9uIGFzICJTQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVCIgLS0+Ci08IUVOVElUWSAlIGhlYWQuY29udGVudCAiVElUTEUgJiBJU0lOREVYPyAmIEJBU0U/Ij4KLQotPCFFTEVNRU5UIEhFQUQgTyBPICglaGVhZC5jb250ZW50OykgKyglaGVhZC5taXNjOykgLS0gZG9jdW1lbnQgaGVhZCAtLT4KLTwhQVRUTElTVCBIRUFECi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIgLS0KLSAgcHJvZmlsZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWVkIGRpY3Rpb25hcnkgb2YgbWV0YSBpbmZvIC0tCi0gID4KLQotPCEtLSBUaGUgVElUTEUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgICAgSXQgc2hvdWxkIGJlIGRpc3BsYXllZCwgZm9yIGV4YW1wbGUgYXMgdGhlIHBhZ2UgaGVhZGVyIG9yCi0gICAgICAgd2luZG93IHRpdGxlLiBFeGFjdGx5IG9uZSB0aXRsZSBpcyByZXF1aXJlZCBwZXIgZG9jdW1lbnQuCi0gICAgLS0+Ci08IUVMRU1FTlQgVElUTEUgLSAtICgjUENEQVRBKSAtKCVoZWFkLm1pc2M7KSAtLSBkb2N1bWVudCB0aXRsZSAtLT4KLTwhQVRUTElTVCBUSVRMRSAlaTE4bj4KLQotPCFFTEVNRU5UIElTSU5ERVggLSBPIEVNUFRZICAgICAgICAgICAgLS0gc2luZ2xlIGxpbmUgcHJvbXB0IC0tPgotPCFBVFRMSVNUIElTSU5ERVgKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIgLS0KLSAgcHJvbXB0ICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIHByb21wdCBtZXNzYWdlIC0tPgotCi08IUVMRU1FTlQgQkFTRSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBkb2N1bWVudCBiYXNlIFVSSSAtLT4KLTwhQVRUTElTVCBCQVNFCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgdGhhdCBhY3RzIGFzIGJhc2UgVVJJIC0tCi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVEICAtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBNRVRBIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGdlbmVyaWMgbWV0YWluZm9ybWF0aW9uIC0tPgotPCFBVFRMSVNUIE1FVEEKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciwgZm9yIHVzZSB3aXRoIGNvbnRlbnQgLS0KLSAgaHR0cC1lcXVpdiAgTkFNRSAgICAgICAgICAgI0lNUExJRUQgIC0tIEhUVFAgcmVzcG9uc2UgaGVhZGVyIG5hbWUgIC0tCi0gIG5hbWUgICAgICAgIE5BTUUgICAgICAgICAgICNJTVBMSUVEICAtLSBtZXRhaW5mb3JtYXRpb24gbmFtZSAtLQotICBjb250ZW50ICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiAtLQotICBzY2hlbWUgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VsZWN0IGZvcm0gb2YgY29udGVudCAtLQotICA+Ci0KLTwhRUxFTUVOVCBTVFlMRSAtIC0gJVN0eWxlU2hlZXQgICAgICAgIC0tIHN0eWxlIGluZm8gLS0+Ci08IUFUVExJU1QgU1RZTEUKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciwgZm9yIHVzZSB3aXRoIHRpdGxlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRCAtLSBjb250ZW50IHR5cGUgb2Ygc3R5bGUgbGFuZ3VhZ2UgLS0KLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQgIC0tIGRlc2lnbmVkIGZvciB1c2Ugd2l0aCB0aGVzZSBtZWRpYSAtLQotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgdGl0bGUgLS0KLSAgPgotCi08IUVMRU1FTlQgU0NSSVBUIC0gLSAlU2NyaXB0OyAgICAgICAgICAtLSBzY3JpcHQgc3RhdGVtZW50cyAtLT4KLTwhQVRUTElTVCBTQ1JJUFQKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQgIC0tIGNoYXIgZW5jb2Rpbmcgb2YgbGlua2VkIHJlc291cmNlIC0tCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNSRVFVSVJFRCAtLSBjb250ZW50IHR5cGUgb2Ygc2NyaXB0IGxhbmd1YWdlIC0tCi0gIGxhbmd1YWdlICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBwcmVkZWZpbmVkIHNjcmlwdCBsYW5ndWFnZSBuYW1lIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIGFuIGV4dGVybmFsIHNjcmlwdCAtLQotICBkZWZlciAgICAgICAoZGVmZXIpICAgICAgICAjSU1QTElFRCAgLS0gVUEgbWF5IGRlZmVyIGV4ZWN1dGlvbiBvZiBzY3JpcHQgLS0KLSAgZXZlbnQgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gIGZvciAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBOT1NDUklQVCAtIC0gKCVmbG93OykqCi0gIC0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIHNjcmlwdC1iYXNlZCByZW5kZXJpbmcgLS0+Ci08IUFUVExJU1QgTk9TQ1JJUFQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgU3RydWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhRU5USVRZICUgdmVyc2lvbiAidmVyc2lvbiBDREFUQSAjRklYRUQgJyVIVE1MLlZlcnNpb247JyI+Ci0KLTwhWyAlSFRNTC5GcmFtZXNldDsgWwotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEZSQU1FU0VUIj4KLV1dPgotCi08IUVOVElUWSAlIGh0bWwuY29udGVudCAiSEVBRCwgQk9EWSI+Ci0KLTwhRUxFTUVOVCBIVE1MIE8gTyAoJWh0bWwuY29udGVudDspICAgIC0tIGRvY3VtZW50IHJvb3QgZWxlbWVudCAtLT4KLTwhQVRUTElTVCBIVE1MCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIgLS0KLSAgJXZlcnNpb247Ci0gID4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvc3RyaWN0LmR0ZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9kdGQvc3RyaWN0LmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzNDM3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL3N0cmljdC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw4NzAgKzAsMCBAQAotPCEtLQotICAgIFRoaXMgaXMgSFRNTCA0LjAxIFN0cmljdCBEVEQsIHdoaWNoIGV4Y2x1ZGVzIHRoZSBwcmVzZW50YXRpb24gCi0gICAgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgdGhhdCBXM0MgZXhwZWN0cyB0byBwaGFzZSBvdXQgYXMgCi0gICAgc3VwcG9ydCBmb3Igc3R5bGUgc2hlZXRzIG1hdHVyZXMuIEF1dGhvcnMgc2hvdWxkIHVzZSB0aGUgU3RyaWN0Ci0gICAgRFREIHdoZW4gcG9zc2libGUsIGJ1dCBtYXkgdXNlIHRoZSBUcmFuc2l0aW9uYWwgRFREIHdoZW4gc3VwcG9ydAotICAgIGZvciBwcmVzZW50YXRpb24gYXR0cmlidXRlIGFuZCBlbGVtZW50cyBpcyByZXF1aXJlZC4KLSAgICAKLSAgICBIVE1MIDQgaW5jbHVkZXMgbWVjaGFuaXNtcyBmb3Igc3R5bGUgc2hlZXRzLCBzY3JpcHRpbmcsCi0gICAgZW1iZWRkaW5nIG9iamVjdHMsIGltcHJvdmVkIHN1cHBvcnQgZm9yIHJpZ2h0IHRvIGxlZnQgYW5kIG1peGVkCi0gICAgZGlyZWN0aW9uIHRleHQsIGFuZCBlbmhhbmNlbWVudHMgdG8gZm9ybXMgZm9yIGltcHJvdmVkCi0gICAgYWNjZXNzaWJpbGl0eSBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzLgotCi0gICAgICAgICAgRHJhZnQ6ICREYXRlOiAxOTk5LzEyLzI0IDIyOjQwOjM1ICQKLQotICAgICAgICAgIEF1dGhvcnM6Ci0gICAgICAgICAgICAgIERhdmUgUmFnZ2V0dCA8ZHNyQHczLm9yZz4KLSAgICAgICAgICAgICAgQXJuYXVkIExlIEhvcnMgPGxlaG9yc0B3My5vcmc+Ci0gICAgICAgICAgICAgIElhbiBKYWNvYnMgPGlqQHczLm9yZz4KLQotICAgIEZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgSFRNTCA0LjAxIGlzIGF2YWlsYWJsZSBhdDoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0Ci0KLQotICAgIFRoZSBIVE1MIDQuMDEgc3BlY2lmaWNhdGlvbiBpbmNsdWRlcyBhZGRpdGlvbmFsCi0gICAgc3ludGFjdGljIGNvbnN0cmFpbnRzIHRoYXQgY2Fubm90IGJlIGV4cHJlc3NlZCB3aXRoaW4KLSAgICB0aGUgRFREcy4KLQotLS0+Ci08IS0tCi0gICAgVHlwaWNhbCB1c2FnZToKLQotICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KLSAgICA8aHRtbD4KLSAgICA8aGVhZD4KLSAgICAuLi4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgLi4uCi0gICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLQotICAgIFRoZSBVUkkgdXNlZCBhcyBhIHN5c3RlbSBpZGVudGlmaWVyIHdpdGggdGhlIHB1YmxpYyBpZGVudGlmaWVyIGFsbG93cwotICAgIHRoZSB1c2VyIGFnZW50IHRvIGRvd25sb2FkIHRoZSBEVEQgYW5kIGVudGl0eSBzZXRzIGFzIG5lZWRlZC4KLQotICAgIFRoZSBGUEkgZm9yIHRoZSBUcmFuc2l0aW9uYWwgSFRNTCA0LjAxIERURCBpczoKLQotICAgICAgICAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0KLSAgICBUaGlzIHZlcnNpb24gb2YgdGhlIHRyYW5zaXRpb25hbCBEVEQgaXM6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQKLQotICAgIElmIHlvdSBhcmUgd3JpdGluZyBhIGRvY3VtZW50IHRoYXQgaW5jbHVkZXMgZnJhbWVzLCB1c2UgCi0gICAgdGhlIGZvbGxvd2luZyBGUEk6Ci0KLSAgICAgICAgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iCi0KLSAgICBUaGlzIHZlcnNpb24gb2YgdGhlIGZyYW1lc2V0IERURCBpczoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2ZyYW1lc2V0LmR0ZAotCi0gICAgVXNlIHRoZSBmb2xsb3dpbmcgKHJlbGF0aXZlKSBVUklzIHRvIHJlZmVyIHRvIAotICAgIHRoZSBEVERzIGFuZCBlbnRpdHkgZGVmaW5pdGlvbnMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uOgotCi0gICAgInN0cmljdC5kdGQiCi0gICAgImxvb3NlLmR0ZCIKLSAgICAiZnJhbWVzZXQuZHRkIgotICAgICJIVE1MbGF0MS5lbnQiCi0gICAgIkhUTUxzeW1ib2wuZW50IgotICAgICJIVE1Mc3BlY2lhbC5lbnQiCi0KLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEltcG9ydGVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBGZWF0dXJlIFN3aXRjaCBmb3IgZnJhbWVzZXQgZG9jdW1lbnRzIC0tPgotPCFFTlRJVFkgJSBIVE1MLkZyYW1lc2V0ICJJR05PUkUiPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlICJDREFUQSIKLSAgICAtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGVzICJDREFUQSIKLSAgICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXQgIkNEQVRBIgotICAgIC0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldHMgIkNEQVRBIgotICAgIC0tIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIExhbmd1YWdlQ29kZSAiTkFNRSIKLSAgICAtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyYWN0ZXIgIkNEQVRBIgotICAgIC0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTGlua1R5cGVzICJDREFUQSIKLSAgICAtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTWVkaWFEZXNjICJDREFUQSIKLSAgICAtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBVUkkgIkNEQVRBIgotICAgIC0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLAotICAgICAgIHNlZSBbVVJJXQotICAgIC0tPgotCi08IUVOVElUWSAlIERhdGV0aW1lICJDREFUQSIgLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotCi0KLTwhRU5USVRZICUgU2NyaXB0ICJDREFUQSIgLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci0KLTwhRU5USVRZICUgU3R5bGVTaGVldCAiQ0RBVEEiIC0tIHN0eWxlIHNoZWV0IGRhdGEgLS0+Ci0KLQotCi08IUVOVElUWSAlIFRleHQgIkNEQVRBIj4KLQotCi08IS0tIFBhcmFtZXRlciBFbnRpdGllcyAtLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUIiAtLSByZXBlYXRhYmxlIGhlYWQgZWxlbWVudHMgLS0+Ci0KLTwhRU5USVRZICUgaGVhZGluZyAiSDF8SDJ8SDN8SDR8SDV8SDYiPgotCi08IUVOVElUWSAlIGxpc3QgIlVMIHwgT0wiPgotCi08IUVOVElUWSAlIHByZWZvcm1hdHRlZCAiUFJFIj4KLQotCi08IS0tPT09PT09PT09PT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4xLy9FTi8vSFRNTCIKLSAgICJIVE1MbGF0MS5lbnQiPgotJUhUTUxsYXQxOwotCi08IUVOVElUWSAlIEhUTUxzeW1ib2wgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzLy9FTi8vSFRNTCIKLSAgICJIVE1Mc3ltYm9sLmVudCI+Ci0lSFRNTHN5bWJvbDsKLQotPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwvL0VOLy9IVE1MIgotICAgIkhUTUxzcGVjaWFsLmVudCI+Ci0lSFRNTHNwZWNpYWw7Ci08IS0tPT09PT09PT09PT09PT09PT09PSBHZW5lcmljIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGNvcmVhdHRycwotICJpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQgLS0KLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMgLS0KLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQgIC0tIGFzc29jaWF0ZWQgc3R5bGUgaW5mbyAtLQotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgdGl0bGUgLS0iCi0gID4KLQotPCFFTlRJVFkgJSBpMThuCi0gImxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNJTVBMSUVEICAtLSBkaXJlY3Rpb24gZm9yIHdlYWsvbmV1dHJhbCB0ZXh0IC0tIgotICA+Ci0KLTwhRU5USVRZICUgZXZlbnRzCi0gIm9uY2xpY2sgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgYnV0dG9uIHdhcyBjbGlja2VkIC0tCi0gIG9uZGJsY2xpY2sgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgYnV0dG9uIHdhcyBkb3VibGUgY2xpY2tlZC0tCi0gIG9ubW91c2Vkb3duICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgYnV0dG9uIHdhcyBwcmVzc2VkIGRvd24gLS0KLSAgb25tb3VzZXVwICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIHJlbGVhc2VkIC0tCi0gIG9ubW91c2VvdmVyICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgd2FzIG1vdmVkIG9udG8gLS0KLSAgb25tb3VzZW1vdmUgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgd2l0aGluIC0tCi0gIG9ubW91c2VvdXQgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIHBvaW50ZXIgd2FzIG1vdmVkIGF3YXkgLS0KLSAgb25rZXlwcmVzcyAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEga2V5IHdhcyBwcmVzc2VkIGFuZCByZWxlYXNlZCAtLQotICBvbmtleWRvd24gICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHByZXNzZWQgZG93biAtLQotICBvbmtleXVwICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHJlbGVhc2VkIC0tIgotICA+Ci0KLTwhLS0gUmVzZXJ2ZWQgRmVhdHVyZSBTd2l0Y2ggLS0+Ci08IUVOVElUWSAlIEhUTUwuUmVzZXJ2ZWQgIklHTk9SRSI+Ci0KLTwhLS0gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLT4KLTwhWyAlSFRNTC5SZXNlcnZlZDsgWwotPCFFTlRJVFkgJSByZXNlcnZlZAotICJkYXRhc3JjICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gYSBzaW5nbGUgb3IgdGFidWxhciBEYXRhIFNvdXJjZSAtLQotICBkYXRhZmxkICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gdGhlIHByb3BlcnR5IG9yIGNvbHVtbiBuYW1lIC0tCi0gIGRhdGFmb3JtYXRhcyAocGxhaW50ZXh0fGh0bWwpIHBsYWludGV4dCAtLSB0ZXh0IG9yIGh0bWwgLS0iCi0gID4KLV1dPgotCi08IUVOVElUWSAlIHJlc2VydmVkICIiPgotCi08IUVOVElUWSAlIGF0dHJzICIlY29yZWF0dHJzOyAlaTE4bjsgJWV2ZW50czsiPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgTWFya3VwID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgZm9udHN0eWxlCi0gIlRUIHwgSSB8IEIgfCBCSUcgfCBTTUFMTCI+Ci0KLTwhRU5USVRZICUgcGhyYXNlICJFTSB8IFNUUk9ORyB8IERGTiB8IENPREUgfAotICAgICAgICAgICAgICAgICAgIFNBTVAgfCBLQkQgfCBWQVIgfCBDSVRFIHwgQUJCUiB8IEFDUk9OWU0iID4KLQotPCFFTlRJVFkgJSBzcGVjaWFsCi0gICAiQSB8IElNRyB8IE9CSkVDVCB8IEJSIHwgU0NSSVBUIHwgTUFQIHwgUSB8IFNVQiB8IFNVUCB8IFNQQU4gfCBCRE8iPgotCi08IUVOVElUWSAlIGZvcm1jdHJsICJJTlBVVCB8IFNFTEVDVCB8IFRFWFRBUkVBIHwgTEFCRUwgfCBCVVRUT04iPgotCi08IS0tICVpbmxpbmU7IGNvdmVycyBpbmxpbmUgb3IgInRleHQtbGV2ZWwiIGVsZW1lbnRzIC0tPgotPCFFTlRJVFkgJSBpbmxpbmUgIiNQQ0RBVEEgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJXNwZWNpYWw7IHwgJWZvcm1jdHJsOyI+Ci0KLTwhRUxFTUVOVCAoJWZvbnRzdHlsZTt8JXBocmFzZTspIC0gLSAoJWlubGluZTspKj4KLTwhQVRUTElTVCAoJWZvbnRzdHlsZTt8JXBocmFzZTspCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCAoU1VCfFNVUCkgLSAtICglaW5saW5lOykqICAgIC0tIHN1YnNjcmlwdCwgc3VwZXJzY3JpcHQgLS0+Ci08IUFUVExJU1QgKFNVQnxTVVApCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBTUEFOIC0gLSAoJWlubGluZTspKiAgICAgICAgIC0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIFNQQU4KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVyZXNlcnZlZDsJCQkgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgQkRPIC0gLSAoJWlubGluZTspKiAgICAgICAgICAtLSBJMThOIEJpRGkgb3Zlci1yaWRlIC0tPgotPCFBVFRMSVNUIEJETwotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgbGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI1JFUVVJUkVEIC0tIGRpcmVjdGlvbmFsaXR5IC0tCi0gID4KLQotCi08IUVMRU1FTlQgQlIgLSBPIEVNUFRZICAgICAgICAgICAgICAgICAtLSBmb3JjZWQgbGluZSBicmVhayAtLT4KLTwhQVRUTElTVCBCUgotICAlY29yZWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaWQsIGNsYXNzLCBzdHlsZSwgdGl0bGUgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEhUTUwgY29udGVudCBtb2RlbHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gICAgSFRNTCBoYXMgdHdvIGJhc2ljIGNvbnRlbnQgbW9kZWxzOgotCi0gICAgICAgICVpbmxpbmU7ICAgICBjaGFyYWN0ZXIgbGV2ZWwgZWxlbWVudHMgYW5kIHRleHQgc3RyaW5ncwotICAgICAgICAlYmxvY2s7ICAgICAgYmxvY2stbGlrZSBlbGVtZW50cyBlLmcuIHBhcmFncmFwaHMgYW5kIGxpc3RzCi0tLT4KLQotPCFFTlRJVFkgJSBibG9jawotICAgICAiUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBOT1NDUklQVCB8Ci0gICAgICBCTE9DS1FVT1RFIHwgRk9STSB8IEhSIHwgVEFCTEUgfCBGSUVMRFNFVCB8IEFERFJFU1MiPgotCi08IUVOVElUWSAlIGZsb3cgIiVibG9jazsgfCAlaW5saW5lOyI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IERvY3VtZW50IEJvZHkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBCT0RZIE8gTyAoJWJsb2NrO3xTQ1JJUFQpKyArKElOU3xERUwpIC0tIGRvY3VtZW50IGJvZHkgLS0+Ci08IUFUVExJU1QgQk9EWQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgb25sb2FkICAgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQgIC0tIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBsb2FkZWQgLS0KLSAgb251bmxvYWQgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQgIC0tIHRoZSBkb2N1bWVudCBoYXMgYmVlbiByZW1vdmVkIC0tCi0gID4KLQotPCFFTEVNRU5UIEFERFJFU1MgLSAtICglaW5saW5lOykqIC0tIGluZm9ybWF0aW9uIG9uIGF1dGhvciAtLT4KLTwhQVRUTElTVCBBRERSRVNTCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBESVYgLSAtICglZmxvdzspKiAgICAgICAgICAgIC0tIGdlbmVyaWMgbGFuZ3VhZ2Uvc3R5bGUgY29udGFpbmVyIC0tPgotPCFBVFRMSVNUIERJVgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBBbmNob3IgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIFNoYXBlICIocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KSI+Ci08IUVOVElUWSAlIENvb3JkcyAiQ0RBVEEiIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0+Ci0KLTwhRUxFTUVOVCBBIC0gLSAoJWlubGluZTspKiAtKEEpICAgICAgIC0tIGFuY2hvciAtLT4KLTwhQVRUTElTVCBBCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRCAgLS0gY2hhciBlbmNvZGluZyBvZiBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IGNvbnRlbnQgdHlwZSAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZWQgbGluayBlbmQgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIGhyZWZsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEICAtLSBsYW5ndWFnZSBjb2RlIC0tCi0gIHJlbCAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSBmb3J3YXJkIGxpbmsgdHlwZXMgLS0KLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIHJldmVyc2UgbGluayB0eXBlcyAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBmb3IgdXNlIHdpdGggY2xpZW50LXNpZGUgaW1hZ2UgbWFwcyAtLQotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRCAgLS0gZm9yIHVzZSB3aXRoIGNsaWVudC1zaWRlIGltYWdlIG1hcHMgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDbGllbnQtc2lkZSBpbWFnZSBtYXBzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBUaGVzZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRvY3VtZW50IG9yIGdyb3VwZWQgaW4gYQotICAgICBzZXBhcmF0ZSBkb2N1bWVudCBhbHRob3VnaCB0aGlzIGlzbid0IHlldCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IUVMRU1FTlQgTUFQIC0gLSAoKCVibG9jazspIHwgQVJFQSkrIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLT4KLTwhQVRUTElTVCBNQVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBmb3IgcmVmZXJlbmNlIGJ5IHVzZW1hcCAtLQotICA+Ci0KLTwhRUxFTUVOVCBBUkVBIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCBhcmVhIC0tPgotPCFBVFRMSVNUIEFSRUEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBjb250cm9scyBpbnRlcnByZXRhdGlvbiBvZiBjb29yZHMgLS0KLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIG5vaHJlZiAgICAgIChub2hyZWYpICAgICAgICNJTVBMSUVEICAtLSB0aGlzIHJlZ2lvbiBoYXMgbm8gYWN0aW9uIC0tCi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIExJTksgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgUmVsYXRpb25zaGlwIHZhbHVlcyBjYW4gYmUgdXNlZCBpbiBwcmluY2lwbGU6Ci0KLSAgIGEpIGZvciBkb2N1bWVudCBzcGVjaWZpYyB0b29sYmFycy9tZW51cyB3aGVuIHVzZWQKLSAgICAgIHdpdGggdGhlIExJTksgZWxlbWVudCBpbiBkb2N1bWVudCBoZWFkIGUuZy4KLSAgICAgICAgc3RhcnQsIGNvbnRlbnRzLCBwcmV2aW91cywgbmV4dCwgaW5kZXgsIGVuZCwgaGVscAotICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9c3R5bGVzaGVldCkKLSAgIGMpIHRvIG1ha2UgYSBsaW5rIHRvIGEgc2NyaXB0IChyZWw9c2NyaXB0KQotICAgZCkgYnkgc3R5bGVzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YKLSAgICAgIGh0bWwgbm9kZXMgYXJlIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgZS5nLiBhIHBvc3RzY3JpcHQgb3IgcGRmIHZlcnNpb24gKHJlbD1hbHRlcm5hdGUgbWVkaWE9cHJpbnQpCi0tLT4KLQotPCFFTEVNRU5UIExJTksgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gYSBtZWRpYS1pbmRlcGVuZGVudCBsaW5rIC0tPgotPCFBVFRMSVNUIExJTksKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IGNvbnRlbnQgdHlwZSAtLQotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gZm9yd2FyZCBsaW5rIHR5cGVzIC0tCi0gIHJldiAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSByZXZlcnNlIGxpbmsgdHlwZXMgLS0KLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQgIC0tIGZvciByZW5kZXJpbmcgb24gdGhlc2UgbWVkaWEgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGluIHN0cmljdCBEVEQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIiAtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIE11bHRpTGVuZ3RoICJDREFUQSIgLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotCi08IVsgJUhUTUwuRnJhbWVzZXQ7IFsKLTwhRU5USVRZICUgTXVsdGlMZW5ndGhzICJDREFUQSIgLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgTXVsdGlMZW5ndGggLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSBQaXhlbHMgIkNEQVRBIiAtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotCi0KLTwhLS0gVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0ZXh0LW9ubHkgVUFzIGFzIHdlbGwgYXMgCi0gICB0byBtYWtlIGltYWdlIGNvbnRlbnQgdW5kZXJzdGFuZGFibGUgYW5kIG5hdmlnYWJsZSAKLSAgIHRvIHVzZXJzIG9mIG5vbi12aXN1YWwgVUFzLCB5b3UgbmVlZCB0byBwcm92aWRlCi0gICBhIGRlc2NyaXB0aW9uIHdpdGggQUxULCBhbmQgYXZvaWQgc2VydmVyLXNpZGUgaW1hZ2UgbWFwcyAtLT4KLTwhRUxFTUVOVCBJTUcgLSBPIEVNUFRZICAgICAgICAgICAgICAgIC0tIEVtYmVkZGVkIGltYWdlIC0tPgotPCFBVFRMSVNUIElNRwotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIFVSSSBvZiBpbWFnZSB0byBlbWJlZCAtLQotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQgLS0gc2hvcnQgZGVzY3JpcHRpb24gLS0KLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGxpbmsgdG8gbG9uZyBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZW1lbnRzIGFsdCkgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgaW1hZ2UgZm9yIHNjcmlwdGluZyAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgaGVpZ2h0IC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSB3aWR0aCAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRCAgLS0gdXNlIHNlcnZlci1zaWRlIGltYWdlIG1hcCAtLQotICA+Ci0KLTwhLS0gVVNFTUFQIHBvaW50cyB0byBhIE1BUCBlbGVtZW50IHdoaWNoIG1heSBiZSBpbiB0aGlzIGRvY3VtZW50Ci0gIG9yIGFuIGV4dGVybmFsIGRvY3VtZW50LCBhbHRob3VnaCB0aGUgbGF0dGVyIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT0gT0JKRUNUID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIE9CSkVDVCBpcyB1c2VkIHRvIGVtYmVkIG9iamVjdHMgYXMgcGFydCBvZiBIVE1MIHBhZ2VzIAotICBQQVJBTSBlbGVtZW50cyBzaG91bGQgcHJlY2VkZSBvdGhlciBjb250ZW50LiBTR01MIG1peGVkIGNvbnRlbnQKLSAgbW9kZWwgdGVjaG5pY2FsaXR5IHByZWNsdWRlcyBzcGVjaWZ5aW5nIHRoaXMgZm9ybWFsbHkgLi4uCi0tLT4KLQotPCFFTEVNRU5UIE9CSkVDVCAtIC0gKFBBUkFNIHwgJWZsb3c7KSoKLSAtLSBnZW5lcmljIGVtYmVkZGVkIG9iamVjdCAtLT4KLTwhQVRUTElTVCBPQkpFQ1QKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGRlY2xhcmUgICAgIChkZWNsYXJlKSAgICAgICNJTVBMSUVEICAtLSBkZWNsYXJlIGJ1dCBkb24ndCBpbnN0YW50aWF0ZSBmbGFnIC0tCi0gIGNsYXNzaWQgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBpZGVudGlmaWVzIGFuIGltcGxlbWVudGF0aW9uIC0tCi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBiYXNlIFVSSSBmb3IgY2xhc3NpZCwgZGF0YSwgYXJjaGl2ZS0tCi0gIGRhdGEgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSByZWZlcmVuY2UgdG8gb2JqZWN0J3MgZGF0YSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gY29udGVudCB0eXBlIGZvciBkYXRhIC0tCi0gIGNvZGV0eXBlICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIGNvZGUgLS0KLSAgYXJjaGl2ZSAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFVSSXMgLS0KLSAgc3RhbmRieSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIG1lc3NhZ2UgdG8gc2hvdyB3aGlsZSBsb2FkaW5nIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSBoZWlnaHQgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIHdpZHRoIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBQQVJBTSAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIG5hbWVkIHByb3BlcnR5IHZhbHVlIC0tPgotPCFBVFRMSVNUIFBBUkFNCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gcHJvcGVydHkgbmFtZSAtLQotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gcHJvcGVydHkgdmFsdWUgLS0KLSAgdmFsdWV0eXBlICAgKERBVEF8UkVGfE9CSkVDVCkgREFUQSAgIC0tIEhvdyB0byBpbnRlcnByZXQgdmFsdWUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGNvbnRlbnQgdHlwZSBmb3IgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdmFsdWV0eXBlPXJlZiAtLQotICA+Ci0KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEhSIC0gTyBFTVBUWSAtLSBob3Jpem9udGFsIHJ1bGUgLS0+Ci08IUFUVExJU1QgSFIKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUGFyYWdyYXBocyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIFAgLSBPICglaW5saW5lOykqICAgICAgICAgICAgLS0gcGFyYWdyYXBoIC0tPgotPCFBVFRMSVNUIFAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSGVhZGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBUaGVyZSBhcmUgc2l4IGxldmVscyBvZiBoZWFkaW5ncyBmcm9tIEgxICh0aGUgbW9zdCBpbXBvcnRhbnQpCi0gIHRvIEg2ICh0aGUgbGVhc3QgaW1wb3J0YW50KS4KLS0tPgotCi08IUVMRU1FTlQgKCVoZWFkaW5nOykgIC0gLSAoJWlubGluZTspKiAtLSBoZWFkaW5nIC0tPgotPCFBVFRMSVNUICglaGVhZGluZzspCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZXhjbHVkZXMgbWFya3VwIGZvciBpbWFnZXMgYW5kIGNoYW5nZXMgaW4gZm9udCBzaXplIC0tPgotPCFFTlRJVFkgJSBwcmUuZXhjbHVzaW9uICJJTUd8T0JKRUNUfEJJR3xTTUFMTHxTVUJ8U1VQIj4KLQotPCFFTEVNRU5UIFBSRSAtIC0gKCVpbmxpbmU7KSogLSglcHJlLmV4Y2x1c2lvbjspIC0tIHByZWZvcm1hdHRlZCB0ZXh0IC0tPgotPCFBVFRMSVNUIFBSRQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09IElubGluZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgUSAtIC0gKCVpbmxpbmU7KSogICAgICAgICAgICAtLSBzaG9ydCBpbmxpbmUgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIFEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIHNvdXJjZSBkb2N1bWVudCBvciBtc2cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBCbG9jay1saWtlIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQkxPQ0tRVU9URSAtIC0gKCVibG9jazt8U0NSSVBUKSsgLS0gbG9uZyBxdW90YXRpb24gLS0+Ci08IUFUVExJU1QgQkxPQ0tRVU9URQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3Igc291cmNlIGRvY3VtZW50IG9yIG1zZyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEluc2VydGVkL0RlbGV0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLQotPCEtLSBJTlMvREVMIGFyZSBoYW5kbGVkIGJ5IGluY2x1c2lvbiBvbiBCT0RZIC0tPgotPCFFTEVNRU5UIChJTlN8REVMKSAtIC0gKCVmbG93OykqICAgICAgLS0gaW5zZXJ0ZWQgdGV4dCwgZGVsZXRlZCB0ZXh0IC0tPgotPCFBVFRMSVNUIChJTlN8REVMKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGluZm8gb24gcmVhc29uIGZvciBjaGFuZ2UgLS0KLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQgIC0tIGRhdGUgYW5kIHRpbWUgb2YgY2hhbmdlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gTGlzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBkZWZpbml0aW9uIGxpc3RzIC0gRFQgZm9yIHRlcm0sIEREIGZvciBpdHMgZGVmaW5pdGlvbiAtLT4KLQotPCFFTEVNRU5UIERMIC0gLSAoRFR8REQpKyAgICAgICAgICAgICAgLS0gZGVmaW5pdGlvbiBsaXN0IC0tPgotPCFBVFRMSVNUIERMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBEVCAtIE8gKCVpbmxpbmU7KSogICAgICAgICAgIC0tIGRlZmluaXRpb24gdGVybSAtLT4KLTwhRUxFTUVOVCBERCAtIE8gKCVmbG93OykqICAgICAgICAgICAgIC0tIGRlZmluaXRpb24gZGVzY3JpcHRpb24gLS0+Ci08IUFUVExJU1QgKERUfEREKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi0KLTwhRUxFTUVOVCBPTCAtIC0gKExJKSsgICAgICAgICAgICAgICAgIC0tIG9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBPTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tIFVub3JkZXJlZCBMaXN0cyAoVUwpIGJ1bGxldCBzdHlsZXMgLS0+Ci08IUVMRU1FTlQgVUwgLSAtIChMSSkrICAgICAgICAgICAgICAgICAtLSB1bm9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBVTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi0KLQotPCFFTEVNRU5UIExJIC0gTyAoJWZsb3c7KSogICAgICAgICAgICAgLS0gbGlzdCBpdGVtIC0tPgotPCFBVFRMSVNUIExJCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IEZvcm1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IUVMRU1FTlQgRk9STSAtIC0gKCVibG9jazt8U0NSSVBUKSsgLShGT1JNKSAtLSBpbnRlcmFjdGl2ZSBmb3JtIC0tPgotPCFBVFRMSVNUIEZPUk0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFjdGlvbiAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRCAtLSBzZXJ2ZXItc2lkZSBmb3JtIGhhbmRsZXIgLS0KLSAgbWV0aG9kICAgICAgKEdFVHxQT1NUKSAgICAgR0VUICAgICAgIC0tIEhUVFAgbWV0aG9kIHVzZWQgdG8gc3VibWl0IHRoZSBmb3JtLS0KLSAgZW5jdHlwZSAgICAgJUNvbnRlbnRUeXBlOyAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgTUlNRSB0eXBlcyBmb3IgZmlsZSB1cGxvYWQgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWUgb2YgZm9ybSBmb3Igc2NyaXB0aW5nIC0tCi0gIG9uc3VibWl0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZm9ybSB3YXMgc3VibWl0dGVkIC0tCi0gIG9ucmVzZXQgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZm9ybSB3YXMgcmVzZXQgLS0KLSAgYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAgI0lNUExJRUQgIC0tIGxpc3Qgb2Ygc3VwcG9ydGVkIGNoYXJzZXRzIC0tCi0gID4KLQotPCEtLSBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZCAtLT4KLTwhRUxFTUVOVCBMQUJFTCAtIC0gKCVpbmxpbmU7KSogLShMQUJFTCkgLS0gZm9ybSBmaWVsZCBsYWJlbCB0ZXh0IC0tPgotPCFBVFRMSVNUIExBQkVMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBmb3IgICAgICAgICBJRFJFRiAgICAgICAgICAjSU1QTElFRCAgLS0gbWF0Y2hlcyBmaWVsZCBJRCB2YWx1ZSAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICA+Ci0KLTwhRU5USVRZICUgSW5wdXRUeXBlCi0gICIoVEVYVCB8IFBBU1NXT1JEIHwgQ0hFQ0tCT1ggfAotICAgIFJBRElPIHwgU1VCTUlUIHwgUkVTRVQgfAotICAgIEZJTEUgfCBISURERU4gfCBJTUFHRSB8IEJVVFRPTikiCi0gICA+Ci0KLTwhLS0gYXR0cmlidXRlIG5hbWUgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0IGFuZCByZXNldCAtLT4KLTwhRUxFTUVOVCBJTlBVVCAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBJTlBVVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUlucHV0VHlwZTsgICAgVEVYVCAgICAgIC0tIHdoYXQga2luZCBvZiB3aWRnZXQgaXMgbmVlZGVkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBTcGVjaWZ5IGZvciByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzIC0tCi0gIGNoZWNrZWQgICAgIChjaGVja2VkKSAgICAgICNJTVBMSUVEICAtLSBmb3IgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2sgYm94ZXMgLS0KLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRCAgLS0gZm9yIHRleHQgYW5kIHBhc3N3ZCAtLQotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc3BlY2lmaWMgdG8gZWFjaCB0eXBlIG9mIGZpZWxkIC0tCi0gIG1heGxlbmd0aCAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBtYXggY2hhcnMgZm9yIHRleHQgZmllbGRzIC0tCi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBmb3IgZmllbGRzIHdpdGggaW1hZ2VzIC0tCi0gIGFsdCAgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRCAgLS0gdXNlIHNlcnZlci1zaWRlIGltYWdlIG1hcCAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gc29tZSB0ZXh0IHdhcyBzZWxlY3RlZCAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQgIC0tIGxpc3Qgb2YgTUlNRSB0eXBlcyBmb3IgZmlsZSB1cGxvYWQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIFNFTEVDVCAtIC0gKE9QVEdST1VQfE9QVElPTikrIC0tIG9wdGlvbiBzZWxlY3RvciAtLT4KLTwhQVRUTElTVCBTRUxFQ1QKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBmaWVsZCBuYW1lIC0tCi0gIHNpemUgICAgICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSByb3dzIHZpc2libGUgLS0KLSAgbXVsdGlwbGUgICAgKG11bHRpcGxlKSAgICAgI0lNUExJRUQgIC0tIGRlZmF1bHQgaXMgc2luZ2xlIHNlbGVjdGlvbiAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgdmFsdWUgd2FzIGNoYW5nZWQgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIE9QVEdST1VQIC0gLSAoT1BUSU9OKSsgLS0gb3B0aW9uIGdyb3VwIC0tPgotPCFBVFRMSVNUIE9QVEdST1VQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBmb3IgdXNlIGluIGhpZXJhcmNoaWNhbCBtZW51cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBPUFRJT04gLSBPICgjUENEQVRBKSAgICAgICAgIC0tIHNlbGVjdGFibGUgY2hvaWNlIC0tPgotPCFBVFRMSVNUIE9QVElPTgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc2VsZWN0ZWQgICAgKHNlbGVjdGVkKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQgIC0tIHVuYXZhaWxhYmxlIGluIHRoaXMgY29udGV4dCAtLQotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gZm9yIHVzZSBpbiBoaWVyYXJjaGljYWwgbWVudXMgLS0KLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGRlZmF1bHRzIHRvIGVsZW1lbnQgY29udGVudCAtLQotICA+Ci0KLTwhRUxFTUVOVCBURVhUQVJFQSAtIC0gKCNQQ0RBVEEpICAgICAgIC0tIG11bHRpLWxpbmUgdGV4dCBmaWVsZCAtLT4KLTwhQVRUTElTVCBURVhUQVJFQQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgcm93cyAgICAgICAgTlVNQkVSICAgICAgICAgI1JFUVVJUkVECi0gIGNvbHMgICAgICAgIE5VTUJFUiAgICAgICAgICNSRVFVSVJFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBzb21lIHRleHQgd2FzIHNlbGVjdGVkIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IS0tCi0gICNQQ0RBVEEgaXMgdG8gc29sdmUgdGhlIG1peGVkIGNvbnRlbnQgcHJvYmxlbSwKLSAgcGVyIHNwZWNpZmljYXRpb24gb25seSB3aGl0ZXNwYWNlIGlzIGFsbG93ZWQgdGhlcmUhCi0gLS0+Ci08IUVMRU1FTlQgRklFTERTRVQgLSAtICgjUENEQVRBLExFR0VORCwoJWZsb3c7KSopIC0tIGZvcm0gY29udHJvbCBncm91cCAtLT4KLTwhQVRUTElTVCBGSUVMRFNFVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IUVMRU1FTlQgTEVHRU5EIC0gLSAoJWlubGluZTspKiAgICAgICAtLSBmaWVsZHNldCBsZWdlbmQgLS0+Ci0KLTwhQVRUTElTVCBMRUdFTkQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgPgotCi08IUVMRU1FTlQgQlVUVE9OIC0gLQotICAgICAoJWZsb3c7KSogLShBfCVmb3JtY3RybDt8Rk9STXxGSUVMRFNFVCkKLSAgICAgLS0gcHVzaCBidXR0b24gLS0+Ci08IUFUVExJU1QgQlVUVE9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VudCB0byBzZXJ2ZXIgd2hlbiBzdWJtaXR0ZWQgLS0KLSAgdHlwZSAgICAgICAgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpIHN1Ym1pdCAtLSBmb3IgdXNlIGFzIGZvcm0gYnV0dG9uIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09IFRhYmxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBJRVRGIEhUTUwgdGFibGUgc3RhbmRhcmQsIHNlZSBbUkZDMTk0Ml0gLS0+Ci0KLTwhLS0KLSBUaGUgQk9SREVSIGF0dHJpYnV0ZSBzZXRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGZyYW1lIGFyb3VuZCB0aGUKLSB0YWJsZS4gVGhlIGRlZmF1bHQgdW5pdHMgYXJlIHNjcmVlbiBwaXhlbHMuCi0KLSBUaGUgRlJBTUUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgZnJhbWUgYXJvdW5kCi0gdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gQ0FMUyB0byBhdm9pZCBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgVkFMSUdOIGF0dHJpYnV0ZS4KLQotIFRoZSB2YWx1ZSAiYm9yZGVyIiBpcyBpbmNsdWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAotIDxUQUJMRSBCT1JERVI+IHdoaWNoIHlpZWxkcyBmcmFtZT1ib3JkZXIgYW5kIGJvcmRlcj1pbXBsaWVkCi0gRm9yIDxUQUJMRSBCT1JERVI9MT4geW91IGdldCBib3JkZXI9MSBhbmQgZnJhbWU9aW1wbGllZC4gSW4gdGhpcwotIGNhc2UsIGl0IGlzIGFwcHJvcHJpYXRlIHRvIHRyZWF0IHRoaXMgYXMgZnJhbWU9Ym9yZGVyIGZvciBiYWNrd2FyZHMKLSBjb21wYXRpYmlsaXR5IHdpdGggZGVwbG95ZWQgYnJvd3NlcnMuCi0tLT4KLTwhRU5USVRZICUgVEZyYW1lICIodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikiPgotCi08IS0tCi0gVGhlIFJVTEVTIGF0dHJpYnV0ZSBkZWZpbmVzIHdoaWNoIHJ1bGVzIHRvIGRyYXcgYmV0d2VlbiBjZWxsczoKLQotIElmIFJVTEVTIGlzIGFic2VudCB0aGVuIGFzc3VtZToKLSAgICAgIm5vbmUiIGlmIEJPUkRFUiBpcyBhYnNlbnQgb3IgQk9SREVSPTAgb3RoZXJ3aXNlICJhbGwiCi0tLT4KLQotPCFFTlRJVFkgJSBUUnVsZXMgIihub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpIj4KLSAgCi08IS0tIGhvcml6b250YWwgcGxhY2VtZW50IG9mIHRhYmxlIHJlbGF0aXZlIHRvIGRvY3VtZW50IC0tPgotPCFFTlRJVFkgJSBUQWxpZ24gIihsZWZ0fGNlbnRlcnxyaWdodCkiPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGxoYWxpZ24KLSAgImFsaWduICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQKLSAgIGNoYXIgICAgICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFsaWdubWVudCBjaGFyLCBlLmcuIGNoYXI9JzonIC0tCi0gICBjaGFyb2ZmICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvZmZzZXQgZm9yIGFsaWdubWVudCBjaGFyIC0tIgotICA+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGx2YWxpZ24KLSAgInZhbGlnbiAgICAgKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCIKLSAgPgotCi08IUVMRU1FTlQgVEFCTEUgLSAtCi0gICAgIChDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKyk+Ci08IUVMRU1FTlQgQ0FQVElPTiAgLSAtICglaW5saW5lOykqICAgICAtLSB0YWJsZSBjYXB0aW9uIC0tPgotPCFFTEVNRU5UIFRIRUFEICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgaGVhZGVyIC0tPgotPCFFTEVNRU5UIFRGT09UICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgZm9vdGVyIC0tPgotPCFFTEVNRU5UIFRCT0RZICAgIE8gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgYm9keSAtLT4KLTwhRUxFTUVOVCBDT0xHUk9VUCAtIE8gKENPTCkqICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiBncm91cCAtLT4KLTwhRUxFTUVOVCBDT0wgICAgICAtIE8gRU1QVFkgICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiAtLT4KLTwhRUxFTUVOVCBUUiAgICAgICAtIE8gKFRIfFREKSsgICAgICAgIC0tIHRhYmxlIHJvdyAtLT4KLTwhRUxFTUVOVCAoVEh8VEQpICAtIE8gKCVmbG93OykqICAgICAgIC0tIHRhYmxlIGhlYWRlciBjZWxsLCB0YWJsZSBkYXRhIGNlbGwtLT4KLQotPCFBVFRMSVNUIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGFibGUgZWxlbWVudCAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3VtbWFyeSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIHB1cnBvc2Uvc3RydWN0dXJlIGZvciBzcGVlY2ggb3V0cHV0LS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHRhYmxlIHdpZHRoIC0tCi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBjb250cm9scyBmcmFtZSB3aWR0aCBhcm91bmQgdGFibGUgLS0KLSAgZnJhbWUgICAgICAgJVRGcmFtZTsgICAgICAgI0lNUExJRUQgIC0tIHdoaWNoIHBhcnRzIG9mIGZyYW1lIHRvIHJlbmRlciAtLQotICBydWxlcyAgICAgICAlVFJ1bGVzOyAgICAgICAjSU1QTElFRCAgLS0gcnVsaW5ncyBiZXR3ZWVuIHJvd3MgYW5kIGNvbHMgLS0KLSAgY2VsbHNwYWNpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHNwYWNpbmcgYmV0d2VlbiBjZWxscyAtLQotICBjZWxscGFkZGluZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gc3BhY2luZyB3aXRoaW4gY2VsbHMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gIGRhdGFwYWdlc2l6ZSBDREFUQSAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLQotPCFBVFRMSVNUIENBUFRJT04KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLQotQ09MR1JPVVAgZ3JvdXBzIGEgc2V0IG9mIENPTCBlbGVtZW50cy4gSXQgYWxsb3dzIHlvdSB0byBncm91cAotc2V2ZXJhbCBzZW1hbnRpY2FsbHkgcmVsYXRlZCBjb2x1bW5zIHRvZ2V0aGVyLgotLS0+Ci08IUFUVExJU1QgQ09MR1JPVVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNwYW4gICAgICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBkZWZhdWx0IG51bWJlciBvZiBjb2x1bW5zIGluIGdyb3VwIC0tCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVEICAtLSBkZWZhdWx0IHdpZHRoIGZvciBlbmNsb3NlZCBDT0xzIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotPCEtLQotIENPTCBlbGVtZW50cyBkZWZpbmUgdGhlIGFsaWdubWVudCBwcm9wZXJ0aWVzIGZvciBjZWxscyBpbgotIG9uZSBvciBtb3JlIGNvbHVtbnMuCi0KLSBUaGUgV0lEVEggYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbnMsIGUuZy4KLQotICAgICB3aWR0aD02NCAgICAgICAgd2lkdGggaW4gc2NyZWVuIHBpeGVscwotICAgICB3aWR0aD0wLjUqICAgICAgcmVsYXRpdmUgd2lkdGggb2YgMC41Ci0KLSBUaGUgU1BBTiBhdHRyaWJ1dGUgY2F1c2VzIHRoZSBhdHRyaWJ1dGVzIG9mIG9uZQotIENPTCBlbGVtZW50IHRvIGFwcGx5IHRvIG1vcmUgdGhhbiBvbmUgY29sdW1uLgotLS0+Ci08IUFUVExJU1QgQ09MICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBjb2x1bW4gZ3JvdXBzIGFuZCBwcm9wZXJ0aWVzIC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzcGFuICAgICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gQ09MIGF0dHJpYnV0ZXMgYWZmZWN0IE4gY29sdW1ucyAtLQotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRCAgLS0gY29sdW1uIHdpZHRoIHNwZWNpZmljYXRpb24gLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi08IS0tCi0gICAgVXNlIFRIRUFEIHRvIGR1cGxpY2F0ZSBoZWFkZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGhlYWRlcnMgd2hlbgotICAgIFRCT0RZIHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgVEZPT1QgdG8gZHVwbGljYXRlIGZvb3RlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgZm9vdGVycyB3aGVuCi0gICAgVEJPRFkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBtdWx0aXBsZSBUQk9EWSBzZWN0aW9ucyB3aGVuIHJ1bGVzIGFyZSBuZWVkZWQKLSAgICBiZXR3ZWVuIGdyb3VwcyBvZiB0YWJsZSByb3dzLgotLS0+Ci08IUFUVExJU1QgKFRIRUFEfFRCT0RZfFRGT09UKSAgICAgICAgICAtLSB0YWJsZSBzZWN0aW9uIC0tCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLTwhQVRUTElTVCBUUiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHRhYmxlIHJvdyAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi0KLTwhLS0gU2NvcGUgaXMgc2ltcGxlciB0aGFuIGhlYWRlcnMgYXR0cmlidXRlIGZvciBjb21tb24gdGFibGVzIC0tPgotPCFFTlRJVFkgJSBTY29wZSAiKHJvd3xjb2x8cm93Z3JvdXB8Y29sZ3JvdXApIj4KLQotPCEtLSBUSCBpcyBmb3IgaGVhZGVycywgVEQgZm9yIGRhdGEsIGJ1dCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggdXNlIFREIC0tPgotPCFBVFRMSVNUIChUSHxURCkgICAgICAgICAgICAgICAgICAgICAgLS0gaGVhZGVyIG9yIGRhdGEgY2VsbCAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgYWJiciAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGFiYnJldmlhdGlvbiBmb3IgaGVhZGVyIGNlbGwgLS0KLSAgYXhpcyAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlbGF0ZWQgaGVhZGVycy0tCi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVEICAtLSBsaXN0IG9mIGlkJ3MgZm9yIGhlYWRlciBjZWxscyAtLQotICBzY29wZSAgICAgICAlU2NvcGU7ICAgICAgICAjSU1QTElFRCAgLS0gc2NvcGUgY292ZXJlZCBieSBoZWFkZXIgY2VsbHMgLS0KLSAgcm93c3BhbiAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIG51bWJlciBvZiByb3dzIHNwYW5uZWQgYnkgY2VsbCAtLQotICBjb2xzcGFuICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gbnVtYmVyIG9mIGNvbHMgc3Bhbm5lZCBieSBjZWxsIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBIZWFkID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSAlaGVhZC5taXNjOyBkZWZpbmVkIGVhcmxpZXIgb24gYXMgIlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUIiAtLT4KLTwhRU5USVRZICUgaGVhZC5jb250ZW50ICJUSVRMRSAmIEJBU0U/Ij4KLQotPCFFTEVNRU5UIEhFQUQgTyBPICglaGVhZC5jb250ZW50OykgKyglaGVhZC5taXNjOykgLS0gZG9jdW1lbnQgaGVhZCAtLT4KLTwhQVRUTElTVCBIRUFECi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIgLS0KLSAgcHJvZmlsZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIG5hbWVkIGRpY3Rpb25hcnkgb2YgbWV0YSBpbmZvIC0tCi0gID4KLQotPCEtLSBUaGUgVElUTEUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgICAgSXQgc2hvdWxkIGJlIGRpc3BsYXllZCwgZm9yIGV4YW1wbGUgYXMgdGhlIHBhZ2UgaGVhZGVyIG9yCi0gICAgICAgd2luZG93IHRpdGxlLiBFeGFjdGx5IG9uZSB0aXRsZSBpcyByZXF1aXJlZCBwZXIgZG9jdW1lbnQuCi0gICAgLS0+Ci08IUVMRU1FTlQgVElUTEUgLSAtICgjUENEQVRBKSAtKCVoZWFkLm1pc2M7KSAtLSBkb2N1bWVudCB0aXRsZSAtLT4KLTwhQVRUTElTVCBUSVRMRSAlaTE4bj4KLQotCi08IUVMRU1FTlQgQkFTRSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBkb2N1bWVudCBiYXNlIFVSSSAtLT4KLTwhQVRUTElTVCBCQVNFCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRCAtLSBVUkkgdGhhdCBhY3RzIGFzIGJhc2UgVVJJIC0tCi0gID4KLQotPCFFTEVNRU5UIE1FVEEgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gZ2VuZXJpYyBtZXRhaW5mb3JtYXRpb24gLS0+Ci08IUFUVExJU1QgTUVUQQotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyLCBmb3IgdXNlIHdpdGggY29udGVudCAtLQotICBodHRwLWVxdWl2ICBOQU1FICAgICAgICAgICAjSU1QTElFRCAgLS0gSFRUUCByZXNwb25zZSBoZWFkZXIgbmFtZSAgLS0KLSAgbmFtZSAgICAgICAgTkFNRSAgICAgICAgICAgI0lNUExJRUQgIC0tIG1ldGFpbmZvcm1hdGlvbiBuYW1lIC0tCi0gIGNvbnRlbnQgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIC0tCi0gIHNjaGVtZSAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzZWxlY3QgZm9ybSBvZiBjb250ZW50IC0tCi0gID4KLQotPCFFTEVNRU5UIFNUWUxFIC0gLSAlU3R5bGVTaGVldCAgICAgICAgLS0gc3R5bGUgaW5mbyAtLT4KLTwhQVRUTElTVCBTVFlMRQotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyLCBmb3IgdXNlIHdpdGggdGl0bGUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVEIC0tIGNvbnRlbnQgdHlwZSBvZiBzdHlsZSBsYW5ndWFnZSAtLQotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRCAgLS0gZGVzaWduZWQgZm9yIHVzZSB3aXRoIHRoZXNlIG1lZGlhIC0tCi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBhZHZpc29yeSB0aXRsZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBTQ1JJUFQgLSAtICVTY3JpcHQ7ICAgICAgICAgIC0tIHNjcmlwdCBzdGF0ZW1lbnRzIC0tPgotPCFBVFRMSVNUIFNDUklQVAotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRCAgLS0gY2hhciBlbmNvZGluZyBvZiBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVEIC0tIGNvbnRlbnQgdHlwZSBvZiBzY3JpcHQgbGFuZ3VhZ2UgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgYW4gZXh0ZXJuYWwgc2NyaXB0IC0tCi0gIGRlZmVyICAgICAgIChkZWZlcikgICAgICAgICNJTVBMSUVEICAtLSBVQSBtYXkgZGVmZXIgZXhlY3V0aW9uIG9mIHNjcmlwdCAtLQotICBldmVudCAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgZm9yICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCFFTEVNRU5UIE5PU0NSSVBUIC0gLSAoJWJsb2NrOykrCi0gIC0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIHNjcmlwdC1iYXNlZCByZW5kZXJpbmcgLS0+Ci08IUFUVExJU1QgTk9TQ1JJUFQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgU3RydWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICJIRUFELCBCT0RZIj4KLQotPCFFTEVNRU5UIEhUTUwgTyBPICglaHRtbC5jb250ZW50OykgICAgLS0gZG9jdW1lbnQgcm9vdCBlbGVtZW50IC0tPgotPCFBVFRMSVNUIEhUTUwKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciAtLQotICA+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL3N0cmljdDQwMC5kdGQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZHRkL3N0cmljdDQwMC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGVkNWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2R0ZC9zdHJpY3Q0MDAuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsODY4ICswLDAgQEAKLTwhLS0KLSAgICBUaGlzIGlzIEhUTUwgNC4wIFN0cmljdCBEVEQsIHdoaWNoIGV4Y2x1ZGVzIHRoZSBwcmVzZW50YXRpb24gCi0gICAgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgdGhhdCBXM0MgZXhwZWN0cyB0byBwaGFzZSBvdXQgYXMgCi0gICAgc3VwcG9ydCBmb3Igc3R5bGUgc2hlZXRzIG1hdHVyZXMuIEF1dGhvcnMgc2hvdWxkIHVzZSB0aGUgU3RyaWN0Ci0gICAgRFREIHdoZW4gcG9zc2libGUsIGJ1dCBtYXkgdXNlIHRoZSBUcmFuc2l0aW9uYWwgRFREIHdoZW4gc3VwcG9ydAotICAgIGZvciBwcmVzZW50YXRpb24gYXR0cmlidXRlIGFuZCBlbGVtZW50cyBpcyByZXF1aXJlZC4KLSAgICAKLSAgICBIVE1MIDQuMCBpbmNsdWRlcyBtZWNoYW5pc21zIGZvciBzdHlsZSBzaGVldHMsIHNjcmlwdGluZywKLSAgICBlbWJlZGRpbmcgb2JqZWN0cywgaW1wcm92ZWQgc3VwcG9ydCBmb3IgcmlnaHQgdG8gbGVmdCBhbmQgbWl4ZWQKLSAgICBkaXJlY3Rpb24gdGV4dCwgYW5kIGVuaGFuY2VtZW50cyB0byBmb3JtcyBmb3IgaW1wcm92ZWQKLSAgICBhY2Nlc3NpYmlsaXR5IGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMuCi0KLSAgICAgICAgICBEcmFmdDogJERhdGU6IDE5OTgvMDQvMDIgMDA6MTc6MDAgJAotCi0gICAgICAgICAgQXV0aG9yczoKLSAgICAgICAgICAgICAgRGF2ZSBSYWdnZXR0IDxkc3JAdzMub3JnPgotICAgICAgICAgICAgICBBcm5hdWQgTGUgSG9ycyA8bGVob3JzQHczLm9yZz4KLSAgICAgICAgICAgICAgSWFuIEphY29icyA8aWpAdzMub3JnPgotCi0gICAgRnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBIVE1MIDQuMCBpcyBhdmFpbGFibGUgYXQ6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MAotLS0+Ci08IS0tCi0gICAgVHlwaWNhbCB1c2FnZToKLQotICAgIDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvc3RyaWN0LmR0ZCI+Ci0gICAgPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgLi4uCi0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgIC4uLgotICAgIDwvYm9keT4KLSAgICA8L2h0bWw+Ci0KLSAgICBUaGUgVVJJIHVzZWQgYXMgYSBzeXN0ZW0gaWRlbnRpZmllciB3aXRoIHRoZSBwdWJsaWMgaWRlbnRpZmllciBhbGxvd3MKLSAgICB0aGUgdXNlciBhZ2VudCB0byBkb3dubG9hZCB0aGUgRFREIGFuZCBlbnRpdHkgc2V0cyBhcyBuZWVkZWQuCi0KLSAgICBUaGUgRlBJIGZvciB0aGUgVHJhbnNpdGlvbmFsIEhUTUwgNC4wIERURCBpczoKLQotICAgICAgICAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiIKLQotICAgIGFuZCBpdHMgVVJJIGlzOgotCi0gICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvbG9vc2UuZHRkCi0KLSAgICBJZiB5b3UgYXJlIHdyaXRpbmcgYSBkb2N1bWVudCB0aGF0IGluY2x1ZGVzIGZyYW1lcywgdXNlIAotICAgIHRoZSBmb2xsb3dpbmcgRlBJOgotCi0gICAgICAgICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iCi0KLSAgICB3aXRoIHRoZSBVUkk6Ci0KLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9mcmFtZXNldC5kdGQKLQotICAgIFRoZSBmb2xsb3dpbmcgVVJJcyBhcmUgc3VwcG9ydGVkIGluIHJlbGF0aW9uIHRvIEhUTUwgNC4wCi0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9zdHJpY3QuZHRkIiAoU3RyaWN0IERURCkKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9sb29zZS5kdGQiIChMb29zZSBEVEQpCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvZnJhbWVzZXQuZHRkIiAoRnJhbWVzZXQgRFREKQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL0hUTUxsYXQxLmVudCIgKExhdGluLTEgZW50aXRpZXMpCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvSFRNTHN5bWJvbC5lbnQiIChTeW1ib2wgZW50aXRpZXMpCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvSFRNTHNwZWNpYWwuZW50IiAoU3BlY2lhbCBlbnRpdGllcykKLQotICAgIFRoZXNlIFVSSXMgcG9pbnQgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggZmlsZS4gVG8gcmVmZXJlbmNlCi0gICAgdGhpcyBzcGVjaWZpYyByZXZpc2lvbiB1c2UgdGhlIGZvbGxvd2luZyBVUklzOgotCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLWh0bWw0MC0xOTk4MDQyNC9zdHJpY3QuZHRkIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvbG9vc2UuZHRkIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvZnJhbWVzZXQuZHRkIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvSFRNTGxhdDEuZW50IgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvSFRNTHN5bWJvbC5lbnQiCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLWh0bWw0MC0xOTk4MDQyNC9IVE1Mc3BlY2lhbC5lbnQiCi0KLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEltcG9ydGVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlICJDREFUQSIKLSAgICAtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGVzICJDREFUQSIKLSAgICAtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIENoYXJzZXQgIkNEQVRBIgotICAgIC0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldHMgIkNEQVRBIgotICAgIC0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XQotICAgIC0tPgotCi08IUVOVElUWSAlIExhbmd1YWdlQ29kZSAiTkFNRSIKLSAgICAtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0KLSAgICAtLT4KLQotPCFFTlRJVFkgJSBDaGFyYWN0ZXIgIkNEQVRBIgotICAgIC0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTGlua1R5cGVzICJDREFUQSIKLSAgICAtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzCi0gICAgLS0+Ci0KLTwhRU5USVRZICUgTWVkaWFEZXNjICJDREFUQSIKLSAgICAtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMKLSAgICAtLT4KLQotPCFFTlRJVFkgJSBVUkkgIkNEQVRBIgotICAgIC0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLAotICAgICAgIHNlZSBbVVJJXQotICAgIC0tPgotCi08IUVOVElUWSAlIERhdGV0aW1lICJDREFUQSIgLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotCi0KLTwhRU5USVRZICUgU2NyaXB0ICJDREFUQSIgLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci0KLTwhRU5USVRZICUgU3R5bGVTaGVldCAiQ0RBVEEiIC0tIHN0eWxlIHNoZWV0IGRhdGEgLS0+Ci0KLQotCi08IUVOVElUWSAlIFRleHQgIkNEQVRBIj4KLQotCi08IS0tIFBhcmFtZXRlciBFbnRpdGllcyAtLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUIiAtLSByZXBlYXRhYmxlIGhlYWQgZWxlbWVudHMgLS0+Ci0KLTwhRU5USVRZICUgaGVhZGluZyAiSDF8SDJ8SDN8SDR8SDV8SDYiPgotCi08IUVOVElUWSAlIGxpc3QgIlVMIHwgT0wiPgotCi08IUVOVElUWSAlIHByZWZvcm1hdHRlZCAiUFJFIj4KLQotCi08IS0tPT09PT09PT09PT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4xLy9FTi8vSFRNTCIKLSAgICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy1odG1sNDAtMTk5ODA0MjQvSFRNTGxhdDEuZW50Ij4KLSVIVE1MbGF0MTsKLQotPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scy8vRU4vL0hUTUwiCi0gICAiaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMtaHRtbDQwLTE5OTgwNDI0L0hUTUxzeW1ib2wuZW50Ij4KLSVIVE1Mc3ltYm9sOwotCi08IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbC8vRU4vL0hUTUwiCi0gICAiaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMtaHRtbDQwLTE5OTgwNDI0L0hUTUxzcGVjaWFsLmVudCI+Ci0lSFRNTHNwZWNpYWw7Ci08IS0tPT09PT09PT09PT09PT09PT09PSBHZW5lcmljIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGNvcmVhdHRycwotICJpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRCAgLS0gZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQgLS0KLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMgLS0KLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQgIC0tIGFzc29jaWF0ZWQgc3R5bGUgaW5mbyAtLQotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgdGl0bGUvYW1wbGlmaWNhdGlvbiAtLSIKLSAgPgotCi08IUVOVElUWSAlIGkxOG4KLSAibGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI0lNUExJRUQgIC0tIGRpcmVjdGlvbiBmb3Igd2Vhay9uZXV0cmFsIHRleHQgLS0iCi0gID4KLQotPCFFTlRJVFkgJSBldmVudHMKLSAib25jbGljayAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGNsaWNrZWQgLS0KLSAgb25kYmxjbGljayAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIGRvdWJsZSBjbGlja2VkLS0KLSAgb25tb3VzZWRvd24gJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciBidXR0b24gd2FzIHByZXNzZWQgZG93biAtLQotICBvbm1vdXNldXAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIGJ1dHRvbiB3YXMgcmVsZWFzZWQgLS0KLSAgb25tb3VzZW92ZXIgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgb250byAtLQotICBvbm1vdXNlbW92ZSAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBwb2ludGVyIHdhcyBtb3ZlZCB3aXRoaW4gLS0KLSAgb25tb3VzZW91dCAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIGEgcG9pbnRlciB3YXMgbW92ZWQgYXdheSAtLQotICBvbmtleXByZXNzICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gYSBrZXkgd2FzIHByZXNzZWQgYW5kIHJlbGVhc2VkIC0tCi0gIG9ua2V5ZG93biAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcHJlc3NlZCBkb3duIC0tCi0gIG9ua2V5dXAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBhIGtleSB3YXMgcmVsZWFzZWQgLS0iCi0gID4KLQotPCEtLSBSZXNlcnZlZCBGZWF0dXJlIFN3aXRjaCAtLT4KLTwhRU5USVRZICUgSFRNTC5SZXNlcnZlZCAiSUdOT1JFIj4KLQotPCEtLSBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tPgotPCFbICVIVE1MLlJlc2VydmVkOyBbCi08IUVOVElUWSAlIHJlc2VydmVkCi0gImRhdGFzcmMgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBhIHNpbmdsZSBvciB0YWJ1bGFyIERhdGEgU291cmNlIC0tCi0gIGRhdGFmbGQgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSB0aGUgcHJvcGVydHkgb3IgY29sdW1uIG5hbWUgLS0KLSAgZGF0YWZvcm1hdGFzIChwbGFpbnRleHR8aHRtbCkgcGxhaW50ZXh0IC0tIHRleHQgb3IgaHRtbCAtLSIKLSAgPgotXV0+Ci0KLTwhRU5USVRZICUgcmVzZXJ2ZWQgIiI+Ci0KLTwhRU5USVRZICUgYXR0cnMgIiVjb3JlYXR0cnM7ICVpMThuOyAlZXZlbnRzOyI+Ci0KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gVGV4dCBNYXJrdXAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBmb250c3R5bGUKLSAiVFQgfCBJIHwgQiB8IEJJRyB8IFNNQUxMIj4KLQotPCFFTlRJVFkgJSBwaHJhc2UgIkVNIHwgU1RST05HIHwgREZOIHwgQ09ERSB8Ci0gICAgICAgICAgICAgICAgICAgU0FNUCB8IEtCRCB8IFZBUiB8IENJVEUgfCBBQkJSIHwgQUNST05ZTSIgPgotCi08IUVOVElUWSAlIHNwZWNpYWwKLSAgICJBIHwgSU1HIHwgT0JKRUNUIHwgQlIgfCBTQ1JJUFQgfCBNQVAgfCBRIHwgU1VCIHwgU1VQIHwgU1BBTiB8IEJETyI+Ci0KLTwhRU5USVRZICUgZm9ybWN0cmwgIklOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEgfCBMQUJFTCB8IEJVVFRPTiI+Ci0KLTwhLS0gJWlubGluZTsgY292ZXJzIGlubGluZSBvciAidGV4dC1sZXZlbCIgZWxlbWVudHMgLS0+Ci08IUVOVElUWSAlIGlubGluZSAiI1BDREFUQSB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlc3BlY2lhbDsgfCAlZm9ybWN0cmw7Ij4KLQotPCFFTEVNRU5UICglZm9udHN0eWxlO3wlcGhyYXNlOykgLSAtICglaW5saW5lOykqPgotPCFBVFRMSVNUICglZm9udHN0eWxlO3wlcGhyYXNlOykKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIChTVUJ8U1VQKSAtIC0gKCVpbmxpbmU7KSogICAgLS0gc3Vic2NyaXB0LCBzdXBlcnNjcmlwdCAtLT4KLTwhQVRUTElTVCAoU1VCfFNVUCkKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIFNQQU4gLSAtICglaW5saW5lOykqICAgICAgICAgLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1QgU1BBTgotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJXJlc2VydmVkOwkJCSAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBCRE8gLSAtICglaW5saW5lOykqICAgICAgICAgIC0tIEkxOE4gQmlEaSBvdmVyLXJpZGUgLS0+Ci08IUFUVExJU1QgQkRPCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICBsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCAgLS0gbGFuZ3VhZ2UgY29kZSAtLQotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjUkVRVUlSRUQgLS0gZGlyZWN0aW9uYWxpdHkgLS0KLSAgPgotCi0KLTwhRUxFTUVOVCBCUiAtIE8gRU1QVFkgICAgICAgICAgICAgICAgIC0tIGZvcmNlZCBsaW5lIGJyZWFrIC0tPgotPCFBVFRMSVNUIEJSCi0gICVjb3JlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBpZCwgY2xhc3MsIHN0eWxlLCB0aXRsZSAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSFRNTCBjb250ZW50IG1vZGVscyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgICBIVE1MIGhhcyB0d28gYmFzaWMgY29udGVudCBtb2RlbHM6Ci0KLSAgICAgICAgJWlubGluZTsgICAgIGNoYXJhY3RlciBsZXZlbCBlbGVtZW50cyBhbmQgdGV4dCBzdHJpbmdzCi0gICAgICAgICVibG9jazsgICAgICBibG9jay1saWtlIGVsZW1lbnRzIGUuZy4gcGFyYWdyYXBocyBhbmQgbGlzdHMKLS0tPgotCi08IUVOVElUWSAlIGJsb2NrCi0gICAgICJQIHwgJWhlYWRpbmc7IHwgJWxpc3Q7IHwgJXByZWZvcm1hdHRlZDsgfCBETCB8IERJViB8IE5PU0NSSVBUIHwKLSAgICAgIEJMT0NLUVVPVEUgfCBGT1JNIHwgSFIgfCBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUyI+Ci0KLTwhRU5USVRZICUgZmxvdyAiJWJsb2NrOyB8ICVpbmxpbmU7Ij4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEJPRFkgTyBPICglYmxvY2s7fFNDUklQVCkrICsoSU5TfERFTCkgLS0gZG9jdW1lbnQgYm9keSAtLT4KLTwhQVRUTElTVCBCT0RZCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBvbmxvYWQgICAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIGxvYWRlZCAtLQotICBvbnVubG9hZCAgICAgICAgJVNjcmlwdDsgICAjSU1QTElFRCAgLS0gdGhlIGRvY3VtZW50IGhhcyBiZWVuIHJlbW92ZWQgLS0KLSAgPgotCi08IUVMRU1FTlQgQUREUkVTUyAtIC0gKCVpbmxpbmU7KSogLS0gaW5mb3JtYXRpb24gb24gYXV0aG9yIC0tPgotPCFBVFRMSVNUIEFERFJFU1MKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCFFTEVNRU5UIERJViAtIC0gKCVmbG93OykqICAgICAgICAgICAgLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1QgRElWCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgU2hhcGUgIihyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpIj4KLTwhRU5USVRZICUgQ29vcmRzICJDREFUQSIgLS0gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLT4KLQotPCFFTEVNRU5UIEEgLSAtICglaW5saW5lOykqIC0oQSkgICAgICAgLS0gYW5jaG9yIC0tPgotPCFBVFRMSVNUIEEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gYWR2aXNvcnkgY29udGVudCB0eXBlIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lZCBsaW5rIGVuZCAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQgIC0tIGZvcndhcmQgbGluayB0eXBlcyAtLQotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gcmV2ZXJzZSBsaW5rIHR5cGVzIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgc2hhcGUgICAgICAgJVNoYXBlOyAgICAgICAgcmVjdCAgICAgIC0tIGZvciB1c2Ugd2l0aCBjbGllbnQtc2lkZSBpbWFnZSBtYXBzIC0tCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVEICAtLSBmb3IgdXNlIHdpdGggY2xpZW50LXNpZGUgaW1hZ2UgbWFwcyAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENsaWVudC1zaWRlIGltYWdlIG1hcHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFRoZXNlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgb3IgZ3JvdXBlZCBpbiBhCi0gICAgIHNlcGFyYXRlIGRvY3VtZW50IGFsdGhvdWdoIHRoaXMgaXNuJ3QgeWV0IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBNQVAgLSAtICgoJWJsb2NrOykrIHwgQVJFQSspIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLT4KLTwhQVRUTElTVCBNQVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRCAtLSBmb3IgcmVmZXJlbmNlIGJ5IHVzZW1hcCAtLQotICA+Ci0KLTwhRUxFTUVOVCBBUkVBIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGNsaWVudC1zaWRlIGltYWdlIG1hcCBhcmVhIC0tPgotPCFBVFRMSVNUIEFSRUEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgIHJlY3QgICAgICAtLSBjb250cm9scyBpbnRlcnByZXRhdGlvbiBvZiBjb29yZHMgLS0KLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQgIC0tIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGxlbmd0aHMgLS0KLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3IgbGlua2VkIHJlc291cmNlIC0tCi0gIG5vaHJlZiAgICAgIChub2hyZWYpICAgICAgICNJTVBMSUVEICAtLSB0aGlzIHJlZ2lvbiBoYXMgbm8gYWN0aW9uIC0tCi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICB0YWJpbmRleCAgICBOVU1CRVIgICAgICAgICAjSU1QTElFRCAgLS0gcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlciAtLQotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRCAgLS0gYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyIC0tCi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzIC0tCi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIExJTksgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgUmVsYXRpb25zaGlwIHZhbHVlcyBjYW4gYmUgdXNlZCBpbiBwcmluY2lwbGU6Ci0KLSAgIGEpIGZvciBkb2N1bWVudCBzcGVjaWZpYyB0b29sYmFycy9tZW51cyB3aGVuIHVzZWQKLSAgICAgIHdpdGggdGhlIExJTksgZWxlbWVudCBpbiBkb2N1bWVudCBoZWFkIGUuZy4KLSAgICAgICAgc3RhcnQsIGNvbnRlbnRzLCBwcmV2aW91cywgbmV4dCwgaW5kZXgsIGVuZCwgaGVscAotICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9c3R5bGVzaGVldCkKLSAgIGMpIHRvIG1ha2UgYSBsaW5rIHRvIGEgc2NyaXB0IChyZWw9c2NyaXB0KQotICAgZCkgYnkgc3R5bGVzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YKLSAgICAgIGh0bWwgbm9kZXMgYXJlIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgZS5nLiBhIHBvc3RzY3JpcHQgb3IgcGRmIHZlcnNpb24gKHJlbD1hbHRlcm5hdGUgbWVkaWE9cHJpbnQpCi0tLT4KLQotPCFFTEVNRU5UIExJTksgLSBPIEVNUFRZICAgICAgICAgICAgICAgLS0gYSBtZWRpYS1pbmRlcGVuZGVudCBsaW5rIC0tPgotPCFBVFRMSVNUIExJTksKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBsaW5rZWQgcmVzb3VyY2UgLS0KLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQgIC0tIGxhbmd1YWdlIGNvZGUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IGNvbnRlbnQgdHlwZSAtLQotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRCAgLS0gZm9yd2FyZCBsaW5rIHR5cGVzIC0tCi0gIHJldiAgICAgICAgICVMaW5rVHlwZXM7ICAgICNJTVBMSUVEICAtLSByZXZlcnNlIGxpbmsgdHlwZXMgLS0KLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQgIC0tIGZvciByZW5kZXJpbmcgb24gdGhlc2UgbWVkaWEgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGluIHN0cmljdCBEVEQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIiAtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIE11bHRpTGVuZ3RoICJDREFUQSIgLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotCi08IUVOVElUWSAlIE11bHRpTGVuZ3RocyAiQ0RBVEEiIC0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIE11bHRpTGVuZ3RoIC0tPgotCi08IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiIC0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci0KLQotPCEtLSBUbyBhdm9pZCBwcm9ibGVtcyB3aXRoIHRleHQtb25seSBVQXMgYXMgd2VsbCBhcyAKLSAgIHRvIG1ha2UgaW1hZ2UgY29udGVudCB1bmRlcnN0YW5kYWJsZSBhbmQgbmF2aWdhYmxlIAotICAgdG8gdXNlcnMgb2Ygbm9uLXZpc3VhbCBVQXMsIHlvdSBuZWVkIHRvIHByb3ZpZGUKLSAgIGEgZGVzY3JpcHRpb24gd2l0aCBBTFQsIGFuZCBhdm9pZCBzZXJ2ZXItc2lkZSBpbWFnZSBtYXBzIC0tPgotPCFFTEVNRU5UIElNRyAtIE8gRU1QVFkgICAgICAgICAgICAgICAgLS0gRW1iZWRkZWQgaW1hZ2UgLS0+Ci08IUFUVExJU1QgSU1HCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQgLS0gVVJJIG9mIGltYWdlIHRvIGVtYmVkIC0tCi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRCAtLSBzaG9ydCBkZXNjcmlwdGlvbiAtLQotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gbGluayB0byBsb25nIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcGxlbWVudHMgYWx0KSAtLQotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gb3ZlcnJpZGUgaGVpZ2h0IC0tCi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSB3aWR0aCAtLQotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gdXNlIGNsaWVudC1zaWRlIGltYWdlIG1hcCAtLQotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRCAgLS0gdXNlIHNlcnZlci1zaWRlIGltYWdlIG1hcCAtLQotICA+Ci0KLTwhLS0gVVNFTUFQIHBvaW50cyB0byBhIE1BUCBlbGVtZW50IHdoaWNoIG1heSBiZSBpbiB0aGlzIGRvY3VtZW50Ci0gIG9yIGFuIGV4dGVybmFsIGRvY3VtZW50LCBhbHRob3VnaCB0aGUgbGF0dGVyIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT0gT0JKRUNUID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIE9CSkVDVCBpcyB1c2VkIHRvIGVtYmVkIG9iamVjdHMgYXMgcGFydCBvZiBIVE1MIHBhZ2VzIAotICBQQVJBTSBlbGVtZW50cyBzaG91bGQgcHJlY2VkZSBvdGhlciBjb250ZW50LiBTR01MIG1peGVkIGNvbnRlbnQKLSAgbW9kZWwgdGVjaG5pY2FsaXR5IHByZWNsdWRlcyBzcGVjaWZ5aW5nIHRoaXMgZm9ybWFsbHkgLi4uCi0tLT4KLQotPCFFTEVNRU5UIE9CSkVDVCAtIC0gKFBBUkFNIHwgJWZsb3c7KSoKLSAtLSBnZW5lcmljIGVtYmVkZGVkIG9iamVjdCAtLT4KLTwhQVRUTElTVCBPQkpFQ1QKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGRlY2xhcmUgICAgIChkZWNsYXJlKSAgICAgICNJTVBMSUVEICAtLSBkZWNsYXJlIGJ1dCBkb24ndCBpbnN0YW50aWF0ZSBmbGFnIC0tCi0gIGNsYXNzaWQgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBpZGVudGlmaWVzIGFuIGltcGxlbWVudGF0aW9uIC0tCi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBiYXNlIFVSSSBmb3IgY2xhc3NpZCwgZGF0YSwgYXJjaGl2ZS0tCi0gIGRhdGEgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSByZWZlcmVuY2UgdG8gb2JqZWN0J3MgZGF0YSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRCAgLS0gY29udGVudCB0eXBlIGZvciBkYXRhIC0tCi0gIGNvZGV0eXBlICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVEICAtLSBjb250ZW50IHR5cGUgZm9yIGNvZGUgLS0KLSAgYXJjaGl2ZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIHNwYWNlIHNlcGFyYXRlZCBhcmNoaXZlIGxpc3QgLS0KLSAgc3RhbmRieSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIG1lc3NhZ2UgdG8gc2hvdyB3aGlsZSBsb2FkaW5nIC0tCi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvdmVycmlkZSBoZWlnaHQgLS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIG92ZXJyaWRlIHdpZHRoIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRUxFTUVOVCBQQVJBTSAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIG5hbWVkIHByb3BlcnR5IHZhbHVlIC0tPgotPCFBVFRMSVNUIFBBUkFNCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVEICAtLSBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZCAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQgLS0gcHJvcGVydHkgbmFtZSAtLQotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gcHJvcGVydHkgdmFsdWUgLS0KLSAgdmFsdWV0eXBlICAgKERBVEF8UkVGfE9CSkVDVCkgREFUQSAgIC0tIEhvdyB0byBpbnRlcnByZXQgdmFsdWUgLS0KLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQgIC0tIGNvbnRlbnQgdHlwZSBmb3IgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdmFsdWV0eXBlPXJlZiAtLQotICA+Ci0KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIEhSIC0gTyBFTVBUWSAtLSBob3Jpem9udGFsIHJ1bGUgLS0+Ci08IUFUVExJU1QgSFIKLSAgJWNvcmVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGlkLCBjbGFzcywgc3R5bGUsIHRpdGxlIC0tCi0gICVldmVudHM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUGFyYWdyYXBocyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIFAgLSBPICglaW5saW5lOykqICAgICAgICAgICAgLS0gcGFyYWdyYXBoIC0tPgotPCFBVFRMSVNUIFAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSGVhZGluZ3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICBUaGVyZSBhcmUgc2l4IGxldmVscyBvZiBoZWFkaW5ncyBmcm9tIEgxICh0aGUgbW9zdCBpbXBvcnRhbnQpCi0gIHRvIEg2ICh0aGUgbGVhc3QgaW1wb3J0YW50KS4KLS0tPgotCi08IUVMRU1FTlQgKCVoZWFkaW5nOykgIC0gLSAoJWlubGluZTspKiAtLSBoZWFkaW5nIC0tPgotPCFBVFRMSVNUICglaGVhZGluZzspCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gZXhjbHVkZXMgbWFya3VwIGZvciBpbWFnZXMgYW5kIGNoYW5nZXMgaW4gZm9udCBzaXplIC0tPgotPCFFTlRJVFkgJSBwcmUuZXhjbHVzaW9uICJJTUd8T0JKRUNUfEJJR3xTTUFMTHxTVUJ8U1VQIj4KLQotPCFFTEVNRU5UIFBSRSAtIC0gKCVpbmxpbmU7KSogLSglcHJlLmV4Y2x1c2lvbjspIC0tIHByZWZvcm1hdHRlZCB0ZXh0IC0tPgotPCFBVFRMSVNUIFBSRQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09IElubGluZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgUSAtIC0gKCVpbmxpbmU7KSogICAgICAgICAgICAtLSBzaG9ydCBpbmxpbmUgcXVvdGF0aW9uIC0tPgotPCFBVFRMSVNUIFEKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSBVUkkgZm9yIHNvdXJjZSBkb2N1bWVudCBvciBtc2cgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBCbG9jay1saWtlIFF1b3RlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgQkxPQ0tRVU9URSAtIC0gKCVibG9jazt8U0NSSVBUKSsgLS0gbG9uZyBxdW90YXRpb24gLS0+Ci08IUFUVExJU1QgQkxPQ0tRVU9URQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIFVSSSBmb3Igc291cmNlIGRvY3VtZW50IG9yIG1zZyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEluc2VydGVkL0RlbGV0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLQotPCEtLSBJTlMvREVMIGFyZSBoYW5kbGVkIGJ5IGluY2x1c2lvbiBvbiBCT0RZIC0tPgotPCFFTEVNRU5UIChJTlN8REVMKSAtIC0gKCVmbG93OykqICAgICAgLS0gaW5zZXJ0ZWQgdGV4dCwgZGVsZXRlZCB0ZXh0IC0tPgotPCFBVFRMSVNUIChJTlN8REVMKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGluZm8gb24gcmVhc29uIGZvciBjaGFuZ2UgLS0KLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQgIC0tIGRhdGUgYW5kIHRpbWUgb2YgY2hhbmdlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gTGlzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBkZWZpbml0aW9uIGxpc3RzIC0gRFQgZm9yIHRlcm0sIEREIGZvciBpdHMgZGVmaW5pdGlvbiAtLT4KLQotPCFFTEVNRU5UIERMIC0gLSAoRFR8REQpKyAgICAgICAgICAgICAgLS0gZGVmaW5pdGlvbiBsaXN0IC0tPgotPCFBVFRMSVNUIERMCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBEVCAtIE8gKCVpbmxpbmU7KSogICAgICAgICAgIC0tIGRlZmluaXRpb24gdGVybSAtLT4KLTwhRUxFTUVOVCBERCAtIE8gKCVmbG93OykqICAgICAgICAgICAgIC0tIGRlZmluaXRpb24gZGVzY3JpcHRpb24gLS0+Ci08IUFUVExJU1QgKERUfEREKQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi0KLTwhRUxFTUVOVCBPTCAtIC0gKExJKSsgICAgICAgICAgICAgICAgIC0tIG9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBPTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tIFVub3JkZXJlZCBMaXN0cyAoVUwpIGJ1bGxldCBzdHlsZXMgLS0+Ci08IUVMRU1FTlQgVUwgLSAtIChMSSkrICAgICAgICAgICAgICAgICAtLSB1bm9yZGVyZWQgbGlzdCAtLT4KLTwhQVRUTElTVCBVTAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi0KLQotPCFFTEVNRU5UIExJIC0gTyAoJWZsb3c7KSogICAgICAgICAgICAgLS0gbGlzdCBpdGVtIC0tPgotPCFBVFRMSVNUIExJCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IEZvcm1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IUVMRU1FTlQgRk9STSAtIC0gKCVibG9jazt8U0NSSVBUKSsgLShGT1JNKSAtLSBpbnRlcmFjdGl2ZSBmb3JtIC0tPgotPCFBVFRMSVNUIEZPUk0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFjdGlvbiAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRCAtLSBzZXJ2ZXItc2lkZSBmb3JtIGhhbmRsZXIgLS0KLSAgbWV0aG9kICAgICAgKEdFVHxQT1NUKSAgICAgR0VUICAgICAgIC0tIEhUVFAgbWV0aG9kIHVzZWQgdG8gc3VibWl0IHRoZSBmb3JtLS0KLSAgZW5jdHlwZSAgICAgJUNvbnRlbnRUeXBlOyAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgb25zdWJtaXQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBmb3JtIHdhcyBzdWJtaXR0ZWQgLS0KLSAgb25yZXNldCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBmb3JtIHdhcyByZXNldCAtLQotICBhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7ICAjSU1QTElFRCAgLS0gbGlzdCBvZiBzdXBwb3J0ZWQgY2hhcnNldHMgLS0KLSAgPgotCi08IS0tIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkIC0tPgotPCFFTEVNRU5UIExBQkVMIC0gLSAoJWlubGluZTspKiAtKExBQkVMKSAtLSBmb3JtIGZpZWxkIGxhYmVsIHRleHQgLS0+Ci08IUFUVExJU1QgTEFCRUwKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGZvciAgICAgICAgIElEUkVGICAgICAgICAgICNJTVBMSUVEICAtLSBtYXRjaGVzIGZpZWxkIElEIHZhbHVlIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gID4KLQotPCFFTlRJVFkgJSBJbnB1dFR5cGUKLSAgIihURVhUIHwgUEFTU1dPUkQgfCBDSEVDS0JPWCB8Ci0gICAgUkFESU8gfCBTVUJNSVQgfCBSRVNFVCB8Ci0gICAgRklMRSB8IEhJRERFTiB8IElNQUdFIHwgQlVUVE9OKSIKLSAgID4KLQotPCEtLSBhdHRyaWJ1dGUgbmFtZSByZXF1aXJlZCBmb3IgYWxsIGJ1dCBzdWJtaXQgJiByZXNldCAtLT4KLTwhRUxFTUVOVCBJTlBVVCAtIE8gRU1QVFkgICAgICAgICAgICAgIC0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBJTlBVVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgdHlwZSAgICAgICAgJUlucHV0VHlwZTsgICAgVEVYVCAgICAgIC0tIHdoYXQga2luZCBvZiB3aWRnZXQgaXMgbmVlZGVkIC0tCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzdWJtaXQgYXMgcGFydCBvZiBmb3JtIC0tCi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSByZXF1aXJlZCBmb3IgcmFkaW8gYW5kIGNoZWNrYm94ZXMgLS0KLSAgY2hlY2tlZCAgICAgKGNoZWNrZWQpICAgICAgI0lNUExJRUQgIC0tIGZvciByYWRpbyBidXR0b25zIGFuZCBjaGVjayBib3hlcyAtLQotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVEICAtLSBmb3IgdGV4dCBhbmQgcGFzc3dkIC0tCi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBzcGVjaWZpYyB0byBlYWNoIHR5cGUgb2YgZmllbGQgLS0KLSAgbWF4bGVuZ3RoICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIG1heCBjaGFycyBmb3IgdGV4dCBmaWVsZHMgLS0KLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQgIC0tIGZvciBmaWVsZHMgd2l0aCBpbWFnZXMgLS0KLSAgYWx0ICAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNob3J0IGRlc2NyaXB0aW9uIC0tCi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVEICAtLSB1c2UgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIC0tCi0gIHRhYmluZGV4ICAgIE5VTUJFUiAgICAgICAgICNJTVBMSUVEICAtLSBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSBzb21lIHRleHQgd2FzIHNlbGVjdGVkIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRCAgLS0gbGlzdCBvZiBNSU1FIHR5cGVzIGZvciBmaWxlIHVwbG9hZCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgU0VMRUNUIC0gLSAoT1BUR1JPVVB8T1BUSU9OKSsgLS0gb3B0aW9uIHNlbGVjdG9yIC0tPgotPCFBVFRMSVNUIFNFTEVDVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIGZpZWxkIG5hbWUgLS0KLSAgc2l6ZSAgICAgICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHJvd3MgdmlzaWJsZSAtLQotICBtdWx0aXBsZSAgICAobXVsdGlwbGUpICAgICAjSU1QTElFRCAgLS0gZGVmYXVsdCBpcyBzaW5nbGUgc2VsZWN0aW9uIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMgLS0KLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzIC0tCi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEICAtLSB0aGUgZWxlbWVudCB2YWx1ZSB3YXMgY2hhbmdlZCAtLQotICAlcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgT1BUR1JPVVAgLSAtIChPUFRJT04pKyAtLSBvcHRpb24gZ3JvdXAgLS0+Ci08IUFUVExJU1QgT1BUR1JPVVAKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVEIC0tIGZvciB1c2UgaW4gaGllcmFyY2hpY2FsIG1lbnVzIC0tCi0gID4KLQotPCFFTEVNRU5UIE9QVElPTiAtIE8gKCNQQ0RBVEEpICAgICAgICAgLS0gc2VsZWN0YWJsZSBjaG9pY2UgLS0+Ci08IUFUVExJU1QgT1BUSU9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzZWxlY3RlZCAgICAoc2VsZWN0ZWQpICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRCAgLS0gdW5hdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0IC0tCi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBmb3IgdXNlIGluIGhpZXJhcmNoaWNhbCBtZW51cyAtLQotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gZGVmYXVsdHMgdG8gZWxlbWVudCBjb250ZW50IC0tCi0gID4KLQotPCFFTEVNRU5UIFRFWFRBUkVBIC0gLSAoI1BDREFUQSkgICAgICAgLS0gbXVsdGktbGluZSB0ZXh0IGZpZWxkIC0tPgotPCFBVFRMSVNUIFRFWFRBUkVBCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICByb3dzICAgICAgICBOVU1CRVIgICAgICAgICAjUkVRVUlSRUQKLSAgY29scyAgICAgICAgTlVNQkVSICAgICAgICAgI1JFUVVJUkVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgcmVhZG9ubHkgICAgKHJlYWRvbmx5KSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgb25zZWxlY3QgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHNvbWUgdGV4dCB3YXMgc2VsZWN0ZWQgLS0KLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQgIC0tIHRoZSBlbGVtZW50IHZhbHVlIHdhcyBjaGFuZ2VkIC0tCi0gICVyZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhLS0KLSAgI1BDREFUQSBpcyB0byBzb2x2ZSB0aGUgbWl4ZWQgY29udGVudCBwcm9ibGVtLAotICBwZXIgc3BlY2lmaWNhdGlvbiBvbmx5IHdoaXRlc3BhY2UgaXMgYWxsb3dlZCB0aGVyZSEKLSAtLT4KLTwhRUxFTUVOVCBGSUVMRFNFVCAtIC0gKCNQQ0RBVEEsTEVHRU5ELCglZmxvdzspKikgLS0gZm9ybSBjb250cm9sIGdyb3VwIC0tPgotPCFBVFRMSVNUIEZJRUxEU0VUCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhRUxFTUVOVCBMRUdFTkQgLSAtICglaW5saW5lOykqICAgICAgIC0tIGZpZWxkc2V0IGxlZ2VuZCAtLT4KLTwhRU5USVRZICUgTEFsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBMRUdFTkQKLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVEICAtLSBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIgLS0KLSAgPgotCi08IUVMRU1FTlQgQlVUVE9OIC0gLQotICAgICAoJWZsb3c7KSogLShBfCVmb3JtY3RybDt8Rk9STXxGSUVMRFNFVCkKLSAgICAgLS0gcHVzaCBidXR0b24gLS0+Ci08IUFUVExJU1QgQlVUVE9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRCAgLS0gc2VudCB0byBzZXJ2ZXIgd2hlbiBzdWJtaXR0ZWQgLS0KLSAgdHlwZSAgICAgICAgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpIHN1Ym1pdCAtLSBmb3IgdXNlIGFzIGZvcm0gYnV0dG9uIC0tCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVEICAtLSB1bmF2YWlsYWJsZSBpbiB0aGlzIGNvbnRleHQgLS0KLSAgdGFiaW5kZXggICAgTlVNQkVSICAgICAgICAgI0lNUExJRUQgIC0tIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIgLS0KLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlciAtLQotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cyAtLQotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCAgLS0gdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PT09IFRhYmxlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBJRVRGIEhUTUwgdGFibGUgc3RhbmRhcmQsIHNlZSBbUkZDMTk0Ml0gLS0+Ci0KLTwhLS0KLSBUaGUgQk9SREVSIGF0dHJpYnV0ZSBzZXRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGZyYW1lIGFyb3VuZCB0aGUKLSB0YWJsZS4gVGhlIGRlZmF1bHQgdW5pdHMgYXJlIHNjcmVlbiBwaXhlbHMuCi0KLSBUaGUgRlJBTUUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgZnJhbWUgYXJvdW5kCi0gdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gQ0FMUyB0byBhdm9pZCBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgVkFMSUdOIGF0dHJpYnV0ZS4KLQotIFRoZSB2YWx1ZSAiYm9yZGVyIiBpcyBpbmNsdWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAotIDxUQUJMRSBCT1JERVI+IHdoaWNoIHlpZWxkcyBmcmFtZT1ib3JkZXIgYW5kIGJvcmRlcj1pbXBsaWVkCi0gRm9yIDxUQUJMRSBCT1JERVI9MT4geW91IGdldCBib3JkZXI9MSBhbmQgZnJhbWU9aW1wbGllZC4gSW4gdGhpcwotIGNhc2UsIGl0IGlzIGFwcHJvcHJpYXRlIHRvIHRyZWF0IHRoaXMgYXMgZnJhbWU9Ym9yZGVyIGZvciBiYWNrd2FyZHMKLSBjb21wYXRpYmlsaXR5IHdpdGggZGVwbG95ZWQgYnJvd3NlcnMuCi0tLT4KLTwhRU5USVRZICUgVEZyYW1lICIodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikiPgotCi08IS0tCi0gVGhlIFJVTEVTIGF0dHJpYnV0ZSBkZWZpbmVzIHdoaWNoIHJ1bGVzIHRvIGRyYXcgYmV0d2VlbiBjZWxsczoKLQotIElmIFJVTEVTIGlzIGFic2VudCB0aGVuIGFzc3VtZToKLSAgICAgIm5vbmUiIGlmIEJPUkRFUiBpcyBhYnNlbnQgb3IgQk9SREVSPTAgb3RoZXJ3aXNlICJhbGwiCi0tLT4KLQotPCFFTlRJVFkgJSBUUnVsZXMgIihub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpIj4KLSAgCi08IS0tIGhvcml6b250YWwgcGxhY2VtZW50IG9mIHRhYmxlIHJlbGF0aXZlIHRvIGRvY3VtZW50IC0tPgotPCFFTlRJVFkgJSBUQWxpZ24gIihsZWZ0fGNlbnRlcnxyaWdodCkiPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGxoYWxpZ24KLSAgImFsaWduICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQKLSAgIGNoYXIgICAgICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQgIC0tIGFsaWdubWVudCBjaGFyLCBlLmcuIGNoYXI9JzonIC0tCi0gICBjaGFyb2ZmICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVEICAtLSBvZmZzZXQgZm9yIGFsaWdubWVudCBjaGFyIC0tIgotICA+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMgLS0+Ci08IUVOVElUWSAlIGNlbGx2YWxpZ24KLSAgInZhbGlnbiAgICAgKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCIKLSAgPgotCi08IUVMRU1FTlQgVEFCTEUgLSAtCi0gICAgIChDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKyk+Ci08IUVMRU1FTlQgQ0FQVElPTiAgLSAtICglaW5saW5lOykqICAgICAtLSB0YWJsZSBjYXB0aW9uIC0tPgotPCFFTEVNRU5UIFRIRUFEICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgaGVhZGVyIC0tPgotPCFFTEVNRU5UIFRGT09UICAgIC0gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgZm9vdGVyIC0tPgotPCFFTEVNRU5UIFRCT0RZICAgIE8gTyAoVFIpKyAgICAgICAgICAgLS0gdGFibGUgYm9keSAtLT4KLTwhRUxFTUVOVCBDT0xHUk9VUCAtIE8gKGNvbCkqICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiBncm91cCAtLT4KLTwhRUxFTUVOVCBDT0wgICAgICAtIE8gRU1QVFkgICAgICAgICAgIC0tIHRhYmxlIGNvbHVtbiAtLT4KLTwhRUxFTUVOVCBUUiAgICAgICAtIE8gKFRIfFREKSsgICAgICAgIC0tIHRhYmxlIHJvdyAtLT4KLTwhRUxFTUVOVCAoVEh8VEQpICAtIE8gKCVmbG93OykqICAgICAgIC0tIHRhYmxlIGhlYWRlciBjZWxsLCB0YWJsZSBkYXRhIGNlbGwtLT4KLQotPCFBVFRMSVNUIFRBQkxFICAgICAgICAgICAgICAgICAgICAgICAgLS0gdGFibGUgZWxlbWVudCAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3VtbWFyeSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIHB1cnBvc2Uvc3RydWN0dXJlIGZvciBzcGVlY2ggb3V0cHV0LS0KLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHRhYmxlIHdpZHRoIC0tCi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVEICAtLSBjb250cm9scyBmcmFtZSB3aWR0aCBhcm91bmQgdGFibGUgLS0KLSAgZnJhbWUgICAgICAgJVRGcmFtZTsgICAgICAgI0lNUExJRUQgIC0tIHdoaWNoIHBhcnRzIG9mIGZyYW1lIHRvIHJlbmRlciAtLQotICBydWxlcyAgICAgICAlVFJ1bGVzOyAgICAgICAjSU1QTElFRCAgLS0gcnVsaW5ncyBiZXR3ZWVuIHJvd3MgYW5kIGNvbHMgLS0KLSAgY2VsbHNwYWNpbmcgJUxlbmd0aDsgICAgICAgI0lNUExJRUQgIC0tIHNwYWNpbmcgYmV0d2VlbiBjZWxscyAtLQotICBjZWxscGFkZGluZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCAgLS0gc3BhY2luZyB3aXRoaW4gY2VsbHMgLS0KLSAgJXJlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlIC0tCi0gIGRhdGFwYWdlc2l6ZSBDREFUQSAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICA+Ci0KLTwhRU5USVRZICUgQ0FsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBDQVBUSU9OCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICA+Ci0KLTwhLS0KLUNPTEdST1VQIGdyb3VwcyBhIHNldCBvZiBDT0wgZWxlbWVudHMuIEl0IGFsbG93cyB5b3UgdG8gZ3JvdXAKLXNldmVyYWwgc2VtYW50aWNhbGx5IHJlbGF0ZWQgY29sdW1ucyB0b2dldGhlci4KLS0tPgotPCFBVFRMSVNUIENPTEdST1VQCi0gICVhdHRyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAlY29yZWF0dHJzLCAlaTE4biwgJWV2ZW50cyAtLQotICBzcGFuICAgICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gZGVmYXVsdCBudW1iZXIgb2YgY29sdW1ucyBpbiBncm91cCAtLQotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRCAgLS0gZGVmYXVsdCB3aWR0aCBmb3IgZW5jbG9zZWQgQ09McyAtLQotICAlY2VsbGhhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgJWNlbGx2YWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIHZlcnRpY2FsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICA+Ci0KLTwhLS0KLSBDT0wgZWxlbWVudHMgZGVmaW5lIHRoZSBhbGlnbm1lbnQgcHJvcGVydGllcyBmb3IgY2VsbHMgaW4KLSBvbmUgb3IgbW9yZSBjb2x1bW5zLgotCi0gVGhlIFdJRFRIIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW5zLCBlLmcuCi0KLSAgICAgd2lkdGg9NjQgICAgICAgIHdpZHRoIGluIHNjcmVlbiBwaXhlbHMKLSAgICAgd2lkdGg9MC41KiAgICAgIHJlbGF0aXZlIHdpZHRoIG9mIDAuNQotCi0gVGhlIFNQQU4gYXR0cmlidXRlIGNhdXNlcyB0aGUgYXR0cmlidXRlcyBvZiBvbmUKLSBDT0wgZWxlbWVudCB0byBhcHBseSB0byBtb3JlIHRoYW4gb25lIGNvbHVtbi4KLS0tPgotPCFBVFRMSVNUIENPTCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gY29sdW1uIGdyb3VwcyBhbmQgcHJvcGVydGllcyAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgc3BhbiAgICAgICAgTlVNQkVSICAgICAgICAgMSAgICAgICAgIC0tIENPTCBhdHRyaWJ1dGVzIGFmZmVjdCBOIGNvbHVtbnMgLS0KLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQgIC0tIGNvbHVtbiB3aWR0aCBzcGVjaWZpY2F0aW9uIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotPCEtLQotICAgIFVzZSBUSEVBRCB0byBkdXBsaWNhdGUgaGVhZGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBoZWFkZXJzIHdoZW4KLSAgICBUQk9EWSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIFRGT09UIHRvIGR1cGxpY2F0ZSBmb290ZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGZvb3RlcnMgd2hlbgotICAgIFRCT0RZIHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgbXVsdGlwbGUgVEJPRFkgc2VjdGlvbnMgd2hlbiBydWxlcyBhcmUgbmVlZGVkCi0gICAgYmV0d2VlbiBncm91cHMgb2YgdGFibGUgcm93cy4KLS0tPgotPCFBVFRMSVNUIChUSEVBRHxUQk9EWXxURk9PVCkgICAgICAgICAgLS0gdGFibGUgc2VjdGlvbiAtLQotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi08IUFUVExJU1QgVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSB0YWJsZSByb3cgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gICVjZWxsaGFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBob3Jpem9udGFsIGFsaWdubWVudCBpbiBjZWxscyAtLQotICAlY2VsbHZhbGlnbjsgICAgICAgICAgICAgICAgICAgICAgICAgLS0gdmVydGljYWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gID4KLQotCi08IS0tIFNjb3BlIGlzIHNpbXBsZXIgdGhhbiBheGVzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcyAtLT4KLTwhRU5USVRZICUgU2NvcGUgIihyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKSI+Ci0KLTwhLS0gVEggaXMgZm9yIGhlYWRlcnMsIFREIGZvciBkYXRhLCBidXQgZm9yIGNlbGxzIGFjdGluZyBhcyBib3RoIHVzZSBURCAtLT4KLTwhQVRUTElTVCAoVEh8VEQpICAgICAgICAgICAgICAgICAgICAgIC0tIGhlYWRlciBvciBkYXRhIGNlbGwgLS0KLSAgJWF0dHJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tICVjb3JlYXR0cnMsICVpMThuLCAlZXZlbnRzIC0tCi0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEICAtLSBhYmJyZXZpYXRpb24gZm9yIGhlYWRlciBjZWxsIC0tCi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSBuYW1lcyBncm91cHMgb2YgcmVsYXRlZCBoZWFkZXJzLS0KLSAgaGVhZGVycyAgICAgSURSRUZTICAgICAgICAgI0lNUExJRUQgIC0tIGxpc3Qgb2YgaWQncyBmb3IgaGVhZGVyIGNlbGxzIC0tCi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVEICAtLSBzY29wZSBjb3ZlcmVkIGJ5IGhlYWRlciBjZWxscyAtLQotICByb3dzcGFuICAgICBOVU1CRVIgICAgICAgICAxICAgICAgICAgLS0gbnVtYmVyIG9mIHJvd3Mgc3Bhbm5lZCBieSBjZWxsIC0tCi0gIGNvbHNwYW4gICAgIE5VTUJFUiAgICAgICAgIDEgICAgICAgICAtLSBudW1iZXIgb2YgY29scyBzcGFubmVkIGJ5IGNlbGwgLS0KLSAgJWNlbGxoYWxpZ247ICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGhvcml6b250YWwgYWxpZ25tZW50IGluIGNlbGxzIC0tCi0gICVjZWxsdmFsaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gY2VsbHMgLS0KLSAgPgotCi0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IEhlYWQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tICVoZWFkLm1pc2M7IGRlZmluZWQgZWFybGllciBvbiBhcyAiU0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1QiIC0tPgotPCFFTlRJVFkgJSBoZWFkLmNvbnRlbnQgIlRJVExFICYgQkFTRT8iPgotCi08IUVMRU1FTlQgSEVBRCBPIE8gKCVoZWFkLmNvbnRlbnQ7KSArKCVoZWFkLm1pc2M7KSAtLSBkb2N1bWVudCBoZWFkIC0tPgotPCFBVFRMSVNUIEhFQUQKLSAgJWkxOG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGxhbmcsIGRpciAtLQotICBwcm9maWxlICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gbmFtZWQgZGljdGlvbmFyeSBvZiBtZXRhIGluZm8gLS0KLSAgPgotCi08IS0tIFRoZSBUSVRMRSBlbGVtZW50IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGZsb3cgb2YgdGV4dC4KLSAgICAgICBJdCBzaG91bGQgYmUgZGlzcGxheWVkLCBmb3IgZXhhbXBsZSBhcyB0aGUgcGFnZSBoZWFkZXIgb3IKLSAgICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLSAgICAtLT4KLTwhRUxFTUVOVCBUSVRMRSAtIC0gKCNQQ0RBVEEpIC0oJWhlYWQubWlzYzspIC0tIGRvY3VtZW50IHRpdGxlIC0tPgotPCFBVFRMSVNUIFRJVExFICVpMThuPgotCi0KLTwhRUxFTUVOVCBCQVNFIC0gTyBFTVBUWSAgICAgICAgICAgICAgIC0tIGRvY3VtZW50IGJhc2UgVVJJIC0tPgotPCFBVFRMSVNUIEJBU0UKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVEIC0tIFVSSSB0aGF0IGFjdHMgYXMgYmFzZSBVUkkgLS0KLSAgPgotCi08IUVMRU1FTlQgTUVUQSAtIE8gRU1QVFkgICAgICAgICAgICAgICAtLSBnZW5lcmljIG1ldGFpbmZvcm1hdGlvbiAtLT4KLTwhQVRUTElTVCBNRVRBCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIsIGZvciB1c2Ugd2l0aCBjb250ZW50IC0tCi0gIGh0dHAtZXF1aXYgIE5BTUUgICAgICAgICAgICNJTVBMSUVEICAtLSBIVFRQIHJlc3BvbnNlIGhlYWRlciBuYW1lICAtLQotICBuYW1lICAgICAgICBOQU1FICAgICAgICAgICAjSU1QTElFRCAgLS0gbWV0YWluZm9ybWF0aW9uIG5hbWUgLS0KLSAgY29udGVudCAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVEIC0tIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gLS0KLSAgc2NoZW1lICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQgIC0tIHNlbGVjdCBmb3JtIG9mIGNvbnRlbnQgLS0KLSAgPgotCi08IUVMRU1FTlQgU1RZTEUgLSAtICVTdHlsZVNoZWV0ICAgICAgICAtLSBzdHlsZSBpbmZvIC0tPgotPCFBVFRMSVNUIFNUWUxFCi0gICVpMThuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBsYW5nLCBkaXIsIGZvciB1c2Ugd2l0aCB0aXRsZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQgLS0gY29udGVudCB0eXBlIG9mIHN0eWxlIGxhbmd1YWdlIC0tCi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVEICAtLSBkZXNpZ25lZCBmb3IgdXNlIHdpdGggdGhlc2UgbWVkaWEgLS0KLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQgIC0tIGFkdmlzb3J5IHRpdGxlIC0tCi0gID4KLQotPCFFTEVNRU5UIFNDUklQVCAtIC0gJVNjcmlwdDsgICAgICAgICAgLS0gc2NyaXB0IHN0YXRlbWVudHMgLS0+Ci08IUFUVExJU1QgU0NSSVBUCi0gIGNoYXJzZXQgICAgICVDaGFyc2V0OyAgICAgICNJTVBMSUVEICAtLSBjaGFyIGVuY29kaW5nIG9mIGxpbmtlZCByZXNvdXJjZSAtLQotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQgLS0gY29udGVudCB0eXBlIG9mIHNjcmlwdCBsYW5ndWFnZSAtLQotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gVVJJIGZvciBhbiBleHRlcm5hbCBzY3JpcHQgLS0KLSAgZGVmZXIgICAgICAgKGRlZmVyKSAgICAgICAgI0lNUExJRUQgIC0tIFVBIG1heSBkZWZlciBleGVjdXRpb24gb2Ygc2NyaXB0IC0tCi0gIGV2ZW50ICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVEICAtLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZSAtLQotICBmb3IgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRCAgLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UgLS0KLSAgPgotCi08IUVMRU1FTlQgTk9TQ1JJUFQgLSAtICglYmxvY2s7KSsKLSAgLS0gYWx0ZXJuYXRlIGNvbnRlbnQgY29udGFpbmVyIGZvciBub24gc2NyaXB0LWJhc2VkIHJlbmRlcmluZyAtLT4KLTwhQVRUTElTVCBOT1NDUklQVAotICAlYXR0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gJWNvcmVhdHRycywgJWkxOG4sICVldmVudHMgLS0KLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBTdHJ1Y3R1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgIkhFQUQsIEJPRFkiPgotCi08IUVMRU1FTlQgSFRNTCBPIE8gKCVodG1sLmNvbnRlbnQ7KSAgICAtLSBkb2N1bWVudCByb290IGVsZW1lbnQgLS0+Ci08IUFUVExJU1QgSFRNTAotICAlaTE4bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbGFuZywgZGlyIC0tCi0gID4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvQW5jaG9yVW5kZXJBbmNob3JIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL0FuY2hvclVuZGVyQW5jaG9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTc0YTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvQW5jaG9yVW5kZXJBbmNob3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuZXJyb3JoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSUVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MQW5jaG9yRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogQSBzYW1wbGUgaW1wbGVtZW50YXRpb24gb2YgRXJyb3JIYW5kbGVyLgotICovCi1wdWJsaWMgY2xhc3MgQW5jaG9yVW5kZXJBbmNob3JIYW5kbGVyIGltcGxlbWVudHMgSUVycm9ySGFuZGxlciB7Ci0JcHJpdmF0ZSBib29sZWFuIGlzQW5jaG9yKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50Ci0JCQkJfHwgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmIG5vZGUuZ2V0Tm9kZU5hbWUoKQotCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoIkEiKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlRXJyb3IoaW50IGNvZGUsIElQYXJzZXIgcGFyc2VyLCBOb2RlIGVycm9yTm9kZSkKLQkJCXRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChjb2RlID09IElQYXJzZXJFcnJvci5JTExFR0FMX0NISUxEICYmIGlzQW5jaG9yKGVycm9yTm9kZSkpIHsKLQkJCWZvciAoTm9kZSBub2RlID0gcGFyc2VyLmdldENvbnRleHQoKTsgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7IG5vZGUgPSBub2RlCi0JCQkJCS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAoaXNBbmNob3Iobm9kZSkpIHsKLQkJCQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShlcnJvck5vZGUsIG51bGwpOwotCQkJCQlwYXJzZXIuc2V0Q29udGV4dCgoRWxlbWVudCkgZXJyb3JOb2RlKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvRm9ybUV4cGFuZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL0Zvcm1FeHBhbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWU0NmY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvRm9ybUV4cGFuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmVycm9yaGFuZGxlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JSFRNTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLk5vZGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwucGFyc2VyLkhUTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5pbXBsLkVuZFRhZzsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIEVycm9ySGFuZGxlciBpbXBsZW1lbnRhdGlvbiBmb3IgaWxsZWdhbGx5IGNsb3NlZCBmb3JtIGNvbnRleHQuIFVzdWFsbHkgdG8gYWRkCi0gKiBhbiBlcnJvciBoYW5kbGVyLCB5b3UgdXNlcyB7QGxpbmsgSVBhcnNlciNhZGRFcnJvckhhbmRsZXIoSUVycm9ySGFuZGxlcil9LgotICogSG93ZXZlciwgdGhpcyBlcnJvciBoYW5kbGVyIGNvbmZsaWN0cyB3aXRoIHtAbGluayBIVE1MRXJyb3JIYW5kbGVyfSBpbnN0YWxsZWQKLSAqIHRvIHBhcnNlcnMgYnkgZGVmYXVsdC4gVGh1cywgaW5zdGVhZCBvZiB0aGF0IG1ldGhvZCB1c2Uge0BsaW5rIAotICogI2FkZFRvKElIVE1MUGFyc2VyKX0uIEFuZCB0byByZW1vdmUgdGhpcywgdXNlIHtAbGluayAjcmVtb3ZlKCl9LiBOb3RlOiBUaGlzCi0gKiBlcnJvciBoYW5kbGVyIGlzIDxlbT5leHBlcmltZW50YWw8L2VtPi4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRm9ybUV4cGFuZGVyIGltcGxlbWVudHMgSUVycm9ySGFuZGxlciB7Ci0JcHJpdmF0ZSBIVE1MRXJyb3JIYW5kbGVyIGh0bWxFcnJvckhhbmRsZXI7Ci0KLQlwcml2YXRlIEhUTUxQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQWRkIHRoaXMgZXJyb3IgaGFuZGxlciB0byA8Y29kZT5wYXJzZXI8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgYWRkVG8oSUhUTUxQYXJzZXIgcGFyc2VyKSB7Ci0JCUlFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyc1tdID0gcGFyc2VyLmdldEVycm9ySGFuZGxlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvckhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZXJyb3JIYW5kbGVyc1tpXSBpbnN0YW5jZW9mIEhUTUxFcnJvckhhbmRsZXIpIHsKLQkJCQlodG1sRXJyb3JIYW5kbGVyID0gKEhUTUxFcnJvckhhbmRsZXIpIGVycm9ySGFuZGxlcnNbaV07Ci0JCQkJaHRtbEVycm9ySGFuZGxlci5zZXRLZWVwRm9ybShmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcGFyc2VyLmFkZEVycm9ySGFuZGxlcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhpcyBlcnJvciBoYW5kbGVyIGZyb20gdGhlIHBhcnNlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCWlmIChodG1sRXJyb3JIYW5kbGVyICE9IG51bGwpIHsKLQkJCWh0bWxFcnJvckhhbmRsZXIuc2V0S2VlcEZvcm0odHJ1ZSk7Ci0JCQlwYXJzZXIucmVtb3ZlRXJyb3JIYW5kbGVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZCB0aGUgbGFzdCA8Y29kZT5GT1JNPC9jb2RlPiBlbGVtZW50IGFuZCByZWxpbmsgaXQgdG8gdGhlIGxvd2VzdAotCSAqIHBvc2l0aW9uIHdoZXJlYXMgaXQgY292ZXJzIGl0cyBzdGFydCBhbmQgZW5kIHRhZy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVFcnJvcihpbnQgY29kZSwgSVBhcnNlciBwYXJzZXIsIE5vZGUgZXJyb3JOb2RlKQotCQkJdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG5vZGVOYW1lID0gZXJyb3JOb2RlLmdldE5vZGVOYW1lKCk7Ci0JCWlmIChjb2RlID09IElQYXJzZXJFcnJvci5GTE9BVElOR19FTkRUQUcgJiYgZXJyb3JOb2RlIGluc3RhbmNlb2YgRW5kVGFnCi0JCQkJJiYgbm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiRk9STSIpKSB7Ci0JCQkvLyBFbGVtZW50IGNvbnRleHQgPSBwYXJzZXIuZ2V0Q29udGV4dCgpOwotCQkJTm9kZUxpc3QgZm9ybXMgPSBwYXJzZXIuZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRk9STSIpOwotCQkJRWxlbWVudCB0YXJnZXRGb3JtID0gKEVsZW1lbnQpIGZvcm1zLml0ZW0oZm9ybXMuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCWlmICh0YXJnZXRGb3JtID09IG51bGwgfHwgcGFyc2VyLmhhc0VuZFRhZyh0YXJnZXRGb3JtKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBDaGVja3MgaWYgdGFyZ2V0IGZvcm0gaXMgdW5kZXIgdGhlIGNvbnRleHQuCi0JCQlFbGVtZW50IHRhcmdldEZpcnN0Tm9kZSA9IHRhcmdldEZvcm07Ci0JCQlFbGVtZW50IGNvbnRleHRzW10gPSBwYXJzZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JCQlvdXRlcjogd2hpbGUgKHRhcmdldEZpcnN0Tm9kZS5nZXRQYXJlbnROb2RlKCkgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudCkgdGFyZ2V0Rmlyc3ROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAodGFyZ2V0Rmlyc3ROb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGT1JNIikuZ2V0TGVuZ3RoKCkgPiAxKQotCQkJCQlicmVhazsKLQkJCQlmb3IgKGludCBjID0gY29udGV4dHMubGVuZ3RoIC0gMTsgYyA+PSAwOyBjLS0pIHsKLQkJCQkJaWYgKGNvbnRleHRzW2NdID09IHBhcmVudCkgewotCQkJCQkJZm9yIChOb2RlIGNoaWxkID0gdGFyZ2V0Rmlyc3ROb2RlLmdldE5leHRTaWJsaW5nKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQKLQkJCQkJCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50Ci0JCQkJCQkJCQkmJiAoKEVsZW1lbnQpIGNoaWxkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgKLQkJCQkJCQkJCQkJIkZPUk0iKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJYnJlYWsgb3V0ZXI7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJTm9kZVV0aWwucmVtb3ZlKHRhcmdldEZvcm0pOwotCQkJCQkJTm9kZVV0aWwuYWRkKHBhcmVudCwgdGFyZ2V0Rm9ybSwgdGFyZ2V0Rmlyc3ROb2RlLAotCQkJCQkJCQlwYXJlbnQuZ2V0TGFzdENoaWxkKCkpOwotCQkJCQkJaWYgKGMgIT0gY29udGV4dHMubGVuZ3RoIC0gMSkKLQkJCQkJCQlwYXJzZXIuc2V0Q29udGV4dChwYXJlbnQpOwotCQkJCQkJKChFbmRUYWcpIGVycm9yTm9kZSkuc2V0RWxlbWVudCh0YXJnZXRGb3JtKTsKLQkJCQkJCXBhcnNlci5zZXRIYXNFbmRUYWcodGFyZ2V0Rm9ybSk7Ci0JCQkJCQlwYXJzZXIuZXJyb3IoY29kZSwgIkV4cGFuZGVkICIgKyB0YXJnZXRGb3JtKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXRhcmdldEZpcnN0Tm9kZSA9IHBhcmVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9Gb3JtSW5zZXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvRm9ybUluc2VydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODdhNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9Gb3JtSW5zZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuZXJyb3JoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSUVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmltcGwuRW5kVGFnOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogRXJyb3JIYW5kbGVyIGltcGxlbWVudGF0aW9uIGZvciBpbGxlZ2FsbHkgY2xvc2VkIGZvcm0gY29udGV4dC4KLSAqLwotcHVibGljIGNsYXNzIEZvcm1JbnNlcnRlciBpbXBsZW1lbnRzIElFcnJvckhhbmRsZXIgewotCXB1YmxpYyBib29sZWFuIGhhbmRsZUVycm9yKGludCBjb2RlLCBJUGFyc2VyIHBhcnNlciwgTm9kZSBlcnJvck5vZGUpCi0JCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlpZiAoY29kZSAhPSBJUGFyc2VyRXJyb3IuRkxPQVRJTkdfRU5EVEFHKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZXJyb3JOb2RlIGluc3RhbmNlb2YgRW5kVGFnCi0JCQkJJiYgZXJyb3JOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiRk9STSIpKSB7Ci0JCQlFbGVtZW50IGNvbnRleHQgPSBwYXJzZXIuZ2V0Q29udGV4dCgpOwotCQkJVmVjdG9yPE5vZGU+IG5vZGVzID0gbmV3IFZlY3RvcjxOb2RlPigpOwotCQkJYm9vbGVhbiBpbmNsdWRlRm9ybUN0cmwgPSBmYWxzZTsKLQkJCWZvciAoTm9kZSBub2RlID0gY29udGV4dC5nZXRMYXN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZQotCQkJCQkuZ2V0UHJldmlvdXNTaWJsaW5nKCkpIHsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJCWlmIChoYXNFbGVtZW50KGVsZW1lbnQsIGZvcm1OYW1lKSkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSBpZiAoaGFzRm9ybUN0cmwoZWxlbWVudCkpIHsKLQkJCQkJCWluY2x1ZGVGb3JtQ3RybCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbm9kZXMuaW5zZXJ0RWxlbWVudEF0KG5vZGUsIDApOwotCQkJfQotCQkJaWYgKCFpbmNsdWRlRm9ybUN0cmwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJRWxlbWVudCBmb3JtID0gcGFyc2VyLmdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgKLQkJCQkJcGFyc2VyLmNoYW5nZURlZmF1bHRUYWdDYXNlKCJGT1JNIikpOwotCQkJZm9yIChFbnVtZXJhdGlvbjxOb2RlPiBlID0gbm9kZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlOb2RlIG5vZGUgPSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJY29udGV4dC5yZW1vdmVDaGlsZChub2RlKTsKLQkJCQlmb3JtLmluc2VydEJlZm9yZShub2RlLCBudWxsKTsKLQkJCX0KLQkJCWNvbnRleHQuaW5zZXJ0QmVmb3JlKGZvcm0sIG51bGwpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZvcm1OYW1lW10gPSB7ICJGT1JNIiB9OwotCi0JcHJpdmF0ZSBTdHJpbmcgZm9ybUN0cmxzW10gPSB7ICJJTlBVVCIsICJTRUxFQ1QiLCAiVEVYVEFSRUEiLCAiTEFCRUwiLAotCQkJIkJVVFRPTiIgfTsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNGb3JtQ3RybChFbGVtZW50IHRvcCkgewotCQlyZXR1cm4gaGFzRWxlbWVudCh0b3AsIGZvcm1DdHJscyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0VsZW1lbnQoRWxlbWVudCB0b3AsIFN0cmluZyBlbGVtZW50TmFtZXNbXSkgewotCQlOb2RlIHRtcDEsIHRtcDI7Ci0JCXRtcDEgPSB0b3A7Ci0JCXdoaWxlICh0bXAxICE9IG51bGwpIHsKLQkJCWlmICh0bXAxIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICh0bXAxLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50TmFtZXNbaV0pKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICgodG1wMiA9IHRtcDEuZ2V0Rmlyc3RDaGlsZCgpKSA9PSBudWxsKSB7Ci0JCQkJaWYgKHRtcDEgIT0gdG9wKSB7Ci0JCQkJCXRtcDIgPSB0bXAxLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXdoaWxlICh0bXAyID09IG51bGwgJiYgdG1wMSAhPSBudWxsKSB7Ci0JCQkJdG1wMSA9IHRtcDIgPSB0bXAxLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAodG1wMSAhPSB0b3ApIHsKLQkJCQkJdG1wMiA9IHRtcDEuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJdG1wMSA9IHRtcDI7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvRnJhbWVzZXRFcnJvckhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvRnJhbWVzZXRFcnJvckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwOGQ4ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL0ZyYW1lc2V0RXJyb3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuZXJyb3JoYW5kbGVyOwotCi0vKioKLSAqIElmIGEgcGFyc2VyIHVzaW5nIFN0cmljdCBvciBzb21lIERURCB3aGljaCBkb2VzIG5vdCBkZWZpbmUgRlJBTUVTRVQsIHRoaXMKLSAqIGVycm9yIGhhbmRsZXIgbWFrZSB0aGUgcGFyc2VyIHVzZSBGUkFNRVNFVCB3aGlsZSBwYXJzaW5nLgotICovCi1wdWJsaWMgY2xhc3MgRnJhbWVzZXRFcnJvckhhbmRsZXIgZXh0ZW5kcyBVbmtub3duRWxlbWVudEVycm9ySGFuZGxlciB7Ci0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvciBvZiB0aGUgY2xhc3MKLQkgKi8KLQlwdWJsaWMgRnJhbWVzZXRFcnJvckhhbmRsZXIoKSB7Ci0JCXN1cGVyKCJGUkFNRVNFVCIsICItLy9XM0MvL0RURCBIVE1MIDQuMDEgRnJhbWVzZXQvL0VOIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9IVE1MRXJyb3JIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL0hUTUxFcnJvckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjYjEyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL0hUTUxFcnJvckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuZXJyb3JoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSUVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLklTR01MUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbC5FbGVtZW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmltcGwuRW5kVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbC5TR01MVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgSUVycm9ySGFuZGxlciB7Ci0JLyoqCi0JICogU2VhcmNoZXMgcHJvcGVyIGEgcGFyZW50IG5vZGUgb2Ygbm9kZS4gQmVoYXZpb3IgaXMgZGVzY3JpYmVkIGFzIGZvbGxvd3MuCi0JICogPG9sPgotCSAqIDxsaT4gSWYgPGNvZGU+bm9kZTwvY29kZT4gaXMgTElOSywgU1RZTEUgQkFTRSwgSVNJTkRFWCBvciBNRVRBIGVsZW1lbnQsCi0JICogYWRkIGl0IHRvIGxhc3QgSEVBRCBlbGVtZW50LgotCSAqIDxsaT4gSWYgY29udGV4dCBhbmQgPGNvZGU+bm9kZTwvY29kZT4gYXJlIGVxdWFsIG5vZGVzLCBDaGFuZ2VzIENvbnRleHQKLQkgKiB0byBpdHMgcGFyZW50IGFuZCBhcHBlbmQgPGNvZGU+bm9kZTwvY29kZT4gdG8gY29udGV4dC4gPCEtLQotCSAqIDxsaT4gSWYgY29udGV4dCBpcyBIVE1MIGVsZW1lbnQsCi0JICogPG9sPgotCSAqIDxsaT5JZiA8Y29kZT5ub2RlPGNvZGU+IGlzIEJPRFkKLQkgKiBlbGVtZW50LCBhcHBlbmQgPGNvZGU+bm9kZTwvY29kZT4gdG8gY29udGV4dCBhbmQgY2hhbmdlIGl0IHRvCi0JICogPGNvZGU+bm9kZTwvY29kZT4gKFRoaXMgc3RyYW5nZSBjYXNlIG9jY3VycyB3aGVuIGZyYW1lc2V0IGR0ZCBpcyB1c2VkKS4KLQkgKiA8bGk+IElmIGNvbnRleHQgaGFzIG9ubHkgYSBIRUFEIGVsZW1lbnQsIG1ha2VzIEJPRFkgZWxlbWVudCBhcwotCSAqIGEgbmV4dCBzaWJsaW5nIG9mIHRoZSBIRUFEIGFuZCBhcHBlbmRzIDxjb2RlPm5vZGU8L2NvZGU+IGFuZCBjaGFuZ2VzIAotCSAqIGNvbnRleHQgdG8gaXQuCi0JICogPC9vbD4KLQkgKiAtLT4KLQkgKiA8L29sPgotCSAqIEBwYXJhbSBjb2RlIGVycm9yIHR5cGUKLQkgKiBAcGFyYW0gcGFyc2VyIGNhbGxlciBvZiB0aGlzIGhhbmRsZXIuIFRoaXMgcGFyc2VyJ3Mgc3RhdGUgaXMgZWFzaWx5IGNoYW5nZWQgYnkgdGhlIG1ldGhvZHMgYmVsb3cuCi0JZXJyb3JOb2RlIGEgbm9kZSB0aGF0IGNhdXNlcyB0aGUgZXJyb3IuCi0JICogQHBhcmFtIGVycm9yTm9kZSBpbGxlZ2FsIGNoaWxkIG5vZGUuCi0JICogQHJldHVybiB0cnVlIGlmIGZvdW5kLiAgT3RoZXJ3aXNlIGZhbHNlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyI2dldENvbnRleHQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyI3NldENvbnRleHQob3JnLnczYy5kb20uRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVFcnJvcihpbnQgY29kZSwgSVBhcnNlciBwYXJzZXIsIE5vZGUgZXJyb3JOb2RlKQotCQkJdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKGNvZGUgPT0gSVBhcnNlckVycm9yLklMTEVHQUxfQVRUUklCVVRFKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIG5vZGVOYW1lID0gZXJyb3JOb2RlLmdldE5vZGVOYW1lKCk7Ci0JCUVsZW1lbnQgY29udGV4dCA9IHBhcnNlci5nZXRDb250ZXh0KCk7Ci0JCU5vZGUgY29udGV4dFBhcmVudCA9IGNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlTdHJpbmcgY29udGV4dE5hbWUgPSBjb250ZXh0LmdldE5vZGVOYW1lKCk7Ci0JCU5vZGVMaXN0IGJvZGllczsKLQkJaWYgKGVycm9yTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCUVsZW1lbnREZWZpbml0aW9uIGVkID0gKChJU0dNTFBhcnNlcikgcGFyc2VyKS5nZXREVEQoKQotCQkJCQkuZ2V0RWxlbWVudERlZmluaXRpb24obm9kZU5hbWUpOwotCQkJaWYgKGVkID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAobm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiTElOSyIpCi0JCQkJCXx8IG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlNUWUxFIikKLQkJCQkJfHwgbm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiTUVUQSIpCi0JCQkJCXx8IG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkJBU0UiKQotCQkJCQl8fCBub2RlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJJU0lOREVYIikpIHsKLQkJCQlFbGVtZW50IGh0bWwgPSBwYXJzZXIuZ2V0RG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQlmb3IgKE5vZGUgY2hpbGQgPSBodG1sLmdldExhc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkCi0JCQkJCQkuZ2V0UHJldmlvdXNTaWJsaW5nKCkpIHsKLQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9ySGFuZGxlcjogIitjaGlsZC5nZXROb2RlTmFtZSgpKTsKLQotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50Ci0JCQkJCQkJJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJIRUFEIikpIHsKLQkJCQkJCWNoaWxkLmluc2VydEJlZm9yZShlcnJvck5vZGUsIG51bGwpOwotCQkJCQkJcGFyc2VyLmVycm9yKGNvZGUsIGVycm9yTm9kZSArICIgbXVzdCBiZSB1bmRlciAiCi0JCQkJCQkJCSsgY2hpbGQpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkJPRFkiKSkgewotCQkJCUVsZW1lbnQgdG9wID0gcGFyc2VyLmdldERvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJZm9yIChOb2RlIGNoaWxkID0gdG9wLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZAotCQkJCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudAotCQkJCQkJCSYmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoIkJPRFkiKSB8fCBjaGlsZAotCQkJCQkJCQkJLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiRlJBTUVTRVQiKSkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQl0b3AuaW5zZXJ0QmVmb3JlKGVycm9yTm9kZSwgbnVsbCk7Ci0JCQkJcGFyc2VyLnNldENvbnRleHQoKEVsZW1lbnQpIGVycm9yTm9kZSk7Ci0JCQkJcGFyc2VyLmVycm9yKGNvZGUsIGVycm9yTm9kZSArICIgbXVzdCBiZSB1bmRlciAiICsgdG9wKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiSEVBRCIpKSB7Ci0JCQkJRG9jdW1lbnQgZG9jID0gcGFyc2VyLmdldERvY3VtZW50KCk7Ci0JCQkJaWYgKGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkhFQUQiKS5nZXRMZW5ndGgoKSA9PSAwCi0JCQkJCQkmJiAoKGJvZGllcyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQk9EWSIpKQotCQkJCQkJCQkuZ2V0TGVuZ3RoKCkgPiAwIHx8IChib2RpZXMgPSBkb2MKLQkJCQkJCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJGUkFNRVNFVCIpKS5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQkJCUVsZW1lbnQgYm9keSA9IChFbGVtZW50KSBib2RpZXMuaXRlbSgwKTsKLQkJCQkJYm9keS5nZXRQYXJlbnROb2RlKCkuaW5zZXJ0QmVmb3JlKGVycm9yTm9kZSwgYm9keSk7Ci0JCQkJCXBhcnNlci5zZXRDb250ZXh0KChFbGVtZW50KSBlcnJvck5vZGUpOwotCQkJCQlwYXJzZXIuZXJyb3IoY29kZSwgZXJyb3JOb2RlICsgIiBtdXN0IGJlIGJlZm9yZSAiICsgYm9keSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkJPRFkiKS5nZXRMZW5ndGgoKSA+IDAKLQkJCQkJCQl8fCBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZSQU1FU0VUIikuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlwYXJzZXIuZXJyb3IoY29kZSwKLQkJCQkJCQkJIkhUTUxFcnJvckhhbmRsZXIgbWFrZXMgcGFyc2VyIGlnbm9yZSAiCi0JCQkJCQkJCQkJKyBlcnJvck5vZGUpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNvbnRleHROYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkhUTUwiKSkgewotCQkJCWZvciAoTm9kZSBjaGlsZCA9IGNvbnRleHQuZ2V0TGFzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQKLQkJCQkJCS5nZXRQcmV2aW91c1NpYmxpbmcoKSkgewotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50Ci0JCQkJCQkJJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJCT0RZIikpIHsKLQkJCQkJCXBhcnNlci5lcnJvcihjb2RlLAotCQkJCQkJCQkiQk9EWSBjb250ZXh0IGlzIGFscmVhZHkgY2xvc2VkLiAgUmVvcGVuIGl0LiIpOwotCQkJCQkJcGFyc2VyLnJlb3BlbkNvbnRleHQoMSk7Ci0JCQkJCQlwYXJzZXIuZ2V0Q29udGV4dCgpLmluc2VydEJlZm9yZShlcnJvck5vZGUsIG51bGwpOwotCQkJCQkJcGFyc2VyLnNldENvbnRleHQoKEVsZW1lbnQpIGVycm9yTm9kZSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIENvbW1lbnQKLQkJCQkJCQl8fCBjaGlsZCBpbnN0YW5jZW9mIFByb2Nlc3NpbmdJbnN0cnVjdGlvbgotCQkJCQkJCXx8IGNoaWxkIGluc3RhbmNlb2YgVGV4dAotCQkJCQkJCSYmIHdoaXRlc3BhY2VUZXh0KChUZXh0KSBjaGlsZCkpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoY29udGV4dE5hbWUpCi0JCQkJCSYmIGVkLmVuZFRhZ09taXR0YWJsZSgpICYmIGNvbnRleHRQYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJLy8gcGFyc2VyLnNldENvbnRleHQoKEVsZW1lbnQpY29udGV4dFBhcmVudCk7Ci0JCQkJY29udGV4dFBhcmVudC5pbnNlcnRCZWZvcmUoZXJyb3JOb2RlLCBudWxsKTsKLQkJCQlwYXJzZXIuc2V0Q29udGV4dCgoRWxlbWVudCkgZXJyb3JOb2RlKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjb2RlID09IElQYXJzZXJFcnJvci5TVURERU5fRU5EVEFHKSB7Ci0JCQl0cnkgewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJCVZlY3RvcjxFbmRUYWc+IG1pc3NlZEVuZHRhZ3MgPSAoVmVjdG9yPEVuZFRhZz4pIHBhcnNlcgotCQkJCQkJLmdldEV4dHJhRXJySW5mbygpOwotCQkJCWZvciAoRW51bWVyYXRpb248RW5kVGFnPiBlID0gbWlzc2VkRW5kdGFncy5lbGVtZW50cygpOyBlCi0JCQkJCQkuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJCUVuZFRhZyBtaXNzZWRFdGFnID0gZS5uZXh0RWxlbWVudCgpOwotCQkJCQlTdHJpbmcgbWlzc2VkRXRhZ05hbWUgPSBtaXNzZWRFdGFnLmdldE5vZGVOYW1lKCk7Ci0JCQkJCWlmIChtaXNzZWRFdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJUQUJMRSIpKSB7Ci0JCQkJCQkvLyBpZ25vcmUgdGhlIGVuZHRhZwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0gZWxzZSBpZiAoa2VlcEZvcm0KLQkJCQkJCQkmJiBtaXNzZWRFdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJGT1JNIikKLQkJCQkJCQkmJiAobm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiVEQiKSB8fCBub2RlTmFtZQotCQkJCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoIlRSIikpKSB7Ci0JCQkJCQkvLyBURCBpcyBub3QgYWJsZSB0byBjbG9zZSBGT1JNCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBrZWVwRm9ybSA9IHRydWU7Ci0KLQl2b2lkIHNldEtlZXBGb3JtKGJvb2xlYW4ga2VlcCkgewotCQl0aGlzLmtlZXBGb3JtID0ga2VlcDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gd2hpdGVzcGFjZVRleHQoVGV4dCB0ZXh0KSB7Ci0JCWlmICh0ZXh0IGluc3RhbmNlb2YgU0dNTFRleHQpIHsKLQkJCXJldHVybiAoKFNHTUxUZXh0KSB0ZXh0KS5nZXRJc1doaXRlc3BhY2VJbkVsZW1lbnRDb250ZW50KCk7Ci0JCX0KLQkJY2hhciBzdHJbXSA9IHRleHQuZ2V0RGF0YSgpLnRvQ2hhckFycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc3RyW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9JZ25vcmVGb250LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL0lnbm9yZUZvbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2MmUwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL0lnbm9yZUZvbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5lcnJvcmhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSVBhcnNlckVycm9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBJZiBhIHBhcnNlciB1c2luZyBTdHJpY3Qgb3Igc29tZSBEVEQgd2hpY2ggZG9lcyBub3QgZGVmaW5lIEZSQU1FU0VULCB0aGlzCi0gKiBlcnJvciBoYW5kbGVyIG1ha2VzIHRoZSBwYXJzZXIgdXNlIEZSQU1FU0VUIHdoaWxlIHBhcnNpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBJZ25vcmVGb250IGltcGxlbWVudHMgSUVycm9ySGFuZGxlciB7Ci0JcHVibGljIGJvb2xlYW4gaGFuZGxlRXJyb3IoaW50IGNvZGUsIElQYXJzZXIgcGFyc2VyLCBOb2RlIGVycm9yTm9kZSkgewotCQlpZiAoY29kZSA9PSBJUGFyc2VyRXJyb3IuSUxMRUdBTF9DSElMRCAmJiBlcnJvck5vZGUgaW5zdGFuY2VvZiBFbGVtZW50Ci0JCQkJJiYgZXJyb3JOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiRk9OVCIpKSB7Ci0JCQlwYXJzZXIuZXJyb3IoY29kZSwgZXJyb3JOb2RlICsgIiBpcyBpbGxlZ2FsIHVuZGVyICIKLQkJCQkJKyBwYXJzZXIuZ2V0Q29udGV4dCgpICsgIi4gIFNvIGlnbm9yZSBpdC4iKTsKLQkJCXJldHVybiB0cnVlOyAvLyBpZ25vcmUgdGhlIGVycm9yTm9kZS4KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvVFJFcnJvckhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vaHRtbC9lcnJvcmhhbmRsZXIvVFJFcnJvckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2YmFhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL1RSRXJyb3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuZXJyb3JoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSUVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLklTR01MUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbC5FbGVtZW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIElmIHN0YXJ0IHRhZyBvZiBUUiBpcyBtaXNzZWQgYW5kIG9ubHkgaXRzIGVuZCB0YWcgZXhpc3RzLCBwcm92aWRlIHN0YXJ0IHRhZy4KLSAqLwotcHVibGljIGNsYXNzIFRSRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgSUVycm9ySGFuZGxlciB7Ci0JcHVibGljIGJvb2xlYW4gaGFuZGxlRXJyb3IoaW50IGNvZGUsIElQYXJzZXIgcGFyc2VyLCBOb2RlIGVycm9yTm9kZSkKLQkJCXRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCUVsZW1lbnQgY29udGV4dDsKLQkJU3RyaW5nIGNvbnRleHROYW1lOwotCQlpZiAoY29kZSA9PSBJUGFyc2VyRXJyb3IuSUxMRUdBTF9DSElMRCAmJiBlcnJvck5vZGUgaW5zdGFuY2VvZiBFbGVtZW50Ci0JCQkJJiYgZXJyb3JOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiVEQiKSkgewotCQkJY29udGV4dCA9IHBhcnNlci5nZXRDb250ZXh0KCk7Ci0JCQljb250ZXh0TmFtZSA9IGNvbnRleHQuZ2V0Tm9kZU5hbWUoKTsKLQkJCWlmIChjb250ZXh0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJUQk9EWSIpCi0JCQkJCXx8IGNvbnRleHROYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlRBQkxFIikpIHsKLQkJCQlFbGVtZW50IHRyID0gcGFyc2VyLmdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgKLQkJCQkJCXBhcnNlci5jaGFuZ2VEZWZhdWx0VGFnQ2FzZSgiVFIiKSk7Ci0JCQkJRWxlbWVudERlZmluaXRpb24gZWQgPSAoKElTR01MUGFyc2VyKSBwYXJzZXIpLmdldERURCgpCi0JCQkJCQkuZ2V0RWxlbWVudERlZmluaXRpb24oY29udGV4dE5hbWUpOwotCQkJCWlmIChlZC5jb250ZW50TWF0Y2goKChJU0dNTFBhcnNlcikgcGFyc2VyKSwgY29udGV4dCwgdHIpKSB7Ci0JCQkJCXRyLmluc2VydEJlZm9yZShlcnJvck5vZGUsIG51bGwpOwotCQkJCQlwYXJzZXIuc2V0Q29udGV4dCgoRWxlbWVudCkgZXJyb3JOb2RlKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL1Vua25vd25FbGVtZW50RXJyb3JIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL2h0bWwvZXJyb3JoYW5kbGVyL1Vua25vd25FbGVtZW50RXJyb3JIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZDM0NjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9odG1sL2Vycm9yaGFuZGxlci9Vbmtub3duRWxlbWVudEVycm9ySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmVycm9yaGFuZGxlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSVBhcnNlckVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5JU0dNTFBhcnNlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogSWYgYSBwYXJzZXIgdXNpbmcgYSBEVEQgd2hpY2ggZG9lcyBub3QgZGVmaW5lIHNvbWUgZWxlbWVudC4gdGhpcyBlcnJvcgotICogaGFuZGxlciBtYWtlIHRoZSBwYXJzZXIgdXNlIHNwZWNpZmllZCBkdGQgd2hpY2ggZGVmaW5lcyBpdC4KLSAqLwotcHVibGljIGNsYXNzIFVua25vd25FbGVtZW50RXJyb3JIYW5kbGVyIGltcGxlbWVudHMgSUVycm9ySGFuZGxlciB7Ci0JcHJpdmF0ZSBTdHJpbmcgdW5rbm93bkVsZW1lbnRzW107Ci0KLQlwcml2YXRlIFN0cmluZyBwdWJsaWNJRDsKLQotCS8qKgotCSAqIEBwYXJhbSB1bmtub3duRWxlbWVudAotCSAqICAgICAgICAgICAgTm9kZSBuYW1lIG9mIHRhcmdldCB1bmtub3duIGVsZW1lbnQKLQkgKiBAcGFyYW0gcHVibGljSUQKLQkgKiAgICAgICAgICAgIHB1YmxpYyBJRCB3aGljaCBkZWZpbmVzIDxjb2RlPnVua25vd25FbGVtZW50PC9jb2RlPgotCSAqLwotCXB1YmxpYyBVbmtub3duRWxlbWVudEVycm9ySGFuZGxlcihTdHJpbmcgdW5rbm93bkVsZW1lbnQsIFN0cmluZyBwdWJsaWNJRCkgewotCQl0aGlzLnVua25vd25FbGVtZW50cyA9IG5ldyBTdHJpbmdbMV07Ci0JCXVua25vd25FbGVtZW50c1swXSA9IHVua25vd25FbGVtZW50OwotCQl0aGlzLnB1YmxpY0lEID0gcHVibGljSUQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHVua25vd25FbGVtZW50cwotCSAqICAgICAgICAgICAgYXJyYXkgb2YgTm9kZSBuYW1lcyBvZiB0YXJnZXQgdW5rbm93biBlbGVtZW50cwotCSAqIEBwYXJhbSBwdWJsaWNJRAotCSAqICAgICAgICAgICAgcHVibGljIElEIHdoaWNoIGRlZmluZXMgPGNvZGU+dW5rbm93bkVsZW1lbnQ8L2NvZGU+Ci0JICovCi0JcHVibGljIFVua25vd25FbGVtZW50RXJyb3JIYW5kbGVyKFN0cmluZyB1bmtub3duRWxlbWVudHNbXSwgU3RyaW5nIHB1YmxpY0lEKSB7Ci0JCXRoaXMudW5rbm93bkVsZW1lbnRzID0gdW5rbm93bkVsZW1lbnRzOwotCQl0aGlzLnB1YmxpY0lEID0gcHVibGljSUQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlRXJyb3IoaW50IGNvZGUsIElQYXJzZXIgcGFyc2VyLCBOb2RlIGVycm9yTm9kZSkKLQkJCXRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoY29kZSA9PSBJUGFyc2VyRXJyb3IuVU5LTk9XTl9FTEVNRU5UCi0JCQkJJiYgZXJyb3JOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZXJyb3JOb2RlLmdldE5vZGVOYW1lKCkKLQkJCQkJCS5lcXVhbHNJZ25vcmVDYXNlKHVua25vd25FbGVtZW50c1tpXSkpIHsKLQkJCQkJcGFyc2VyLmVycm9yKElQYXJzZXJFcnJvci5VTktOT1dOX0VMRU1FTlQsCi0JCQkJCQkJKChJU0dNTFBhcnNlcikgcGFyc2VyKS5nZXREVEQoKQotCQkJCQkJCQkJKyAiIGRvZXMgbm90IGRlZmluZSBGUkFNRVNFVC4gIgotCQkJCQkJCQkJKyAiIFRyeSB0byBjaGFuZ2UgRFREIHRvICIgKyBwdWJsaWNJRCk7Ci0JCQkJCSgoSVNHTUxQYXJzZXIpIHBhcnNlcikuc2V0dXBEVEQocHVibGljSUQpOwotCQkJCQlwYXJzZXIucHVzaEJhY2tOb2RlKGVycm9yTm9kZSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvQ29uc3RydWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL0NvbnN0cnVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMjhkNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvQ29uc3RydWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnN0cnVjdG9yIHsKLQlhYnN0cmFjdCBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIQUxpbmtFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEFMaW5rRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmQ3NzU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIQUxpbmtFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotCi1hYnN0cmFjdCBjbGFzcyBTSEFMaW5rRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCB7Ci0JU0hBTGlua0VsZW1lbnQoU3RyaW5nIG5hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKG5hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBY2Nlc3NLZXkoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFjY2Vzc2tleSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc0tleShTdHJpbmcgYWNjZXNzS2V5KSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWNjZXNza2V5IiwgYWNjZXNzS2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvb3JkcygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiY29vcmRzIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29vcmRzKFN0cmluZyBjb29yZHMpIHsKLQkJc2V0QXR0cmlidXRlKCJjb29yZHMiLCBjb29yZHMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiaHJlZiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpIHsKLQkJc2V0QXR0cmlidXRlKCJocmVmIiwgaHJlZik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaGFwZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgic2hhcGUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaGFwZShTdHJpbmcgc2hhcGUpIHsKLQkJc2V0QXR0cmlidXRlKCJzaGFwZSIsIHNoYXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFiSW5kZXgoKSB7Ci0JCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFiSW5kZXgoaW50IHRhYkluZGV4KSB7Ci0JCXNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCBJbnRlZ2VyLnRvU3RyaW5nKHRhYkluZGV4KSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInRhcmdldCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldChTdHJpbmcgdGFyZ2V0KSB7Ci0JCXNldEF0dHJpYnV0ZSgidGFyZ2V0IiwgdGFyZ2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEFuY2hvckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIQW5jaG9yRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTc4ODNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIQW5jaG9yRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxBbmNob3JFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hBbmNob3JFbGVtZW50IGV4dGVuZHMgU0hBTGlua0VsZW1lbnQgaW1wbGVtZW50cwotCQlIVE1MQW5jaG9yRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIQW5jaG9yRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENoYXJzZXQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNoYXJzZXQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGFyc2V0KFN0cmluZyBjaGFyc2V0KSB7Ci0JCXNldEF0dHJpYnV0ZSgiY2hhcnNldCIsIGNoYXJzZXQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHJlZmxhbmcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImhyZWZsYW5nIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SHJlZmxhbmcoU3RyaW5nIGhyZWZsYW5nKSB7Ci0JCXNldEF0dHJpYnV0ZSgiaHJlZmxhbmciLCBocmVmbGFuZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlbCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgicmVsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVsKFN0cmluZyByZWwpIHsKLQkJc2V0QXR0cmlidXRlKCJyZWwiLCByZWwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmV2KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJyZXYiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXYoU3RyaW5nIHJldikgewotCQlzZXRBdHRyaWJ1dGUoInJldiIsIHJldik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlzZXRBdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBibHVyKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGZvY3VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIQXBwbGV0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hBcHBsZXRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MDU4NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hBcHBsZXRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxBcHBsZXRFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hBcHBsZXRFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTEFwcGxldEVsZW1lbnQgewotCXByb3RlY3RlZCBTSEFwcGxldEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbGlnbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWxpZ24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGlnbihTdHJpbmcgYWxpZ24pIHsKLQkJc2V0QXR0cmlidXRlKCJhbGlnbiIsIGFsaWduKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFsdCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWx0Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWx0KFN0cmluZyBhbHQpIHsKLQkJc2V0QXR0cmlidXRlKCJhbHQiLCBhbHQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYXJjaGl2ZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoU3RyaW5nIGFyY2hpdmUpIHsKLQkJc2V0QXR0cmlidXRlKCJhcmNoaXZlIiwgYXJjaGl2ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2RlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjb2RlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29kZShTdHJpbmcgY29kZSkgewotCQlzZXRBdHRyaWJ1dGUoImNvZGUiLCBjb2RlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvZGVCYXNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjb2RlYmFzZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvZGVCYXNlKFN0cmluZyBjb2RlQmFzZSkgewotCQlzZXRBdHRyaWJ1dGUoImNvZGViYXNlIiwgY29kZUJhc2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJoZWlnaHQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoU3RyaW5nIGhlaWdodCkgewotCQlzZXRBdHRyaWJ1dGUoImhlaWdodCIsIGhlaWdodCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIc3BhY2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImhzcGFjZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhzcGFjZShTdHJpbmcgaHNwYWNlKSB7Ci0JCXNldEF0dHJpYnV0ZSgiaHNwYWNlIiwgaHNwYWNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJvYmplY3QiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoU3RyaW5nIG9iamVjdCkgewotCQlzZXRBdHRyaWJ1dGUoIm9iamVjdCIsIG9iamVjdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWc3BhY2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInZzcGFjZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZzcGFjZShTdHJpbmcgdnNwYWNlKSB7Ci0JCXNldEF0dHJpYnV0ZSgidnNwYWNlIiwgdnNwYWNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ3aWR0aCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdpZHRoKFN0cmluZyB3aWR0aCkgewotCQlzZXRBdHRyaWJ1dGUoIndpZHRoIiwgd2lkdGgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIQXJlYUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIQXJlYUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1YjFmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEFyZWFFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEFyZWFFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hBcmVhRWxlbWVudCBleHRlbmRzIFNIQUxpbmtFbGVtZW50IGltcGxlbWVudHMgSFRNTEFyZWFFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hBcmVhRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFsdCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWx0Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWx0KFN0cmluZyBhbHQpIHsKLQkJc2V0QXR0cmlidXRlKCJhbHQiLCBhbHQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldE5vSHJlZigpIHsKLQkJU3RyaW5nIG5vaHJlZiA9IGdldEF0dHJpYnV0ZSgibm9ocmVmIik7Ci0JCXJldHVybiBub2hyZWYgIT0gbnVsbCAmJiBub2hyZWYuZXF1YWxzKCJub2hyZWYiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb0hyZWYoYm9vbGVhbiBub0hyZWYpIHsKLQkJc2V0QXR0cmlidXRlKCJub2hyZWYiLCAobm9IcmVmID8gIm5vaHJlZiIgOiBudWxsKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hCUkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIQlJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NDMwOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hCUkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MQlJFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hCUkVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MQlJFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hCUkVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGVhcigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiY2xlYXIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGVhcihTdHJpbmcgY2xlYXIpIHsKLQkJc2V0QXR0cmlidXRlKCJjbGVhciIsIGNsZWFyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEJhc2VFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEJhc2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMjY2MzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hCYXNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxCYXNlRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIQmFzZUVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MQmFzZUVsZW1lbnQgewotCXByb3RlY3RlZCBTSEJhc2VFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiaHJlZiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpIHsKLQkJc2V0QXR0cmlidXRlKCJocmVmIiwgaHJlZik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInRhcmdldCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldChTdHJpbmcgdGFyZ2V0KSB7Ci0JCXNldEF0dHJpYnV0ZSgidGFyZ2V0IiwgdGFyZ2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEJhc2VGb250RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hCYXNlRm9udEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0MzMxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEJhc2VGb250RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxCYXNlRm9udEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSEJhc2VGb250RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxCYXNlRm9udEVsZW1lbnQgewotCXByb3RlY3RlZCBTSEJhc2VGb250RWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbG9yKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjb2xvciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbG9yKFN0cmluZyBjb2xvcikgewotCQlzZXRBdHRyaWJ1dGUoImNvbG9yIiwgY29sb3IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiZmFjZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZhY2UoU3RyaW5nIGZhY2UpIHsKLQkJc2V0QXR0cmlidXRlKCJmYWNlIiwgZmFjZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaXplKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJzaXplIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2l6ZShTdHJpbmcgc2l6ZSkgewotCQlzZXRBdHRyaWJ1dGUoInNpemUiLCBzaXplKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEJvZHlFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEJvZHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZjBhMjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hCb2R5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxCb2R5RWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIQm9keUVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MQm9keUVsZW1lbnQgewotCXByb3RlY3RlZCBTSEJvZHlFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QUxpbmsoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaW5rIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJiYWNrZ3JvdW5kIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCZ0NvbG9yKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJiZ2NvbG9yIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaW5rKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJsaW5rIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0ZXh0Iik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWTGluaygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidmxpbmsiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBTGluayhTdHJpbmcgYUxpbmspIHsKLQkJc2V0QXR0cmlidXRlKCJhbGluayIsIGFMaW5rKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kKFN0cmluZyBiYWNrZ3JvdW5kKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYmFja2dyb3VuZCIsIGJhY2tncm91bmQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJnQ29sb3IoU3RyaW5nIGJnQ29sb3IpIHsKLQkJc2V0QXR0cmlidXRlKCJiZ2NvbG9yIiwgYmdDb2xvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluayhTdHJpbmcgbGluaykgewotCQlzZXRBdHRyaWJ1dGUoImxpbmsiLCBsaW5rKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldEF0dHJpYnV0ZSgidGV4dCIsIHRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZMaW5rKFN0cmluZyB2TGluaykgewotCQlzZXRBdHRyaWJ1dGUoInZsaW5rIiwgdkxpbmspOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIQnV0dG9uRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hCdXR0b25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YzU2ZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hCdXR0b25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MQnV0dG9uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxGb3JtRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIQnV0dG9uRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxCdXR0b25FbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hCdXR0b25FbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBIVE1MRm9ybUVsZW1lbnQgZ2V0Rm9ybSgpIHsKLQkJZm9yIChOb2RlIHJldCA9IGdldFBhcmVudE5vZGUoKTsgcmV0ICE9IG51bGw7IHJldCA9IHJldC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChyZXQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpCi0JCQkJcmV0dXJuIChIVE1MRm9ybUVsZW1lbnQpIHJldDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc0tleSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWNjZXNza2V5Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzS2V5KFN0cmluZyBhY2Nlc3NLZXkpIHsKLQkJc2V0QXR0cmlidXRlKCJhY2Nlc3NrZXkiLCBhY2Nlc3NLZXkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldERpc2FibGVkKCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpOwotCQlyZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsLmxlbmd0aCgpICE9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZWQoYm9vbGVhbiBkaXNhYmxlZCkgewotCQlzZXRBdHRyaWJ1dGUoImRpc2FibGVkIiwgZGlzYWJsZWQgPyAiZGlzYWJsZWQiIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFiSW5kZXgoKSB7Ci0JCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFiSW5kZXgoaW50IHRhYkluZGV4KSB7Ci0JCXNldEF0dHJpYnV0ZSgidGFiSW5kZXgiLCBJbnRlZ2VyLnRvU3RyaW5nKHRhYkluZGV4KSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidmFsdWUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSERMaXN0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hETGlzdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjYjk3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSERMaXN0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxETGlzdEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSERMaXN0RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxETGlzdEVsZW1lbnQgewotCXByb3RlY3RlZCBTSERMaXN0RWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb21wYWN0KCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJjb21wYWN0Iik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wYWN0KGJvb2xlYW4gY29tcGFjdCkgewotCQlzZXRBdHRyaWJ1dGUoImNvbXBhY3QiLCBjb21wYWN0ID8gImNvbXBhY3QiIDogbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hET01JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSERPTUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1YzZlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSERPTUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5pbXBsLlNHTUxET01JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbC5TR01MRG9jVHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTERvY3VtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBTSERPTUltcGwgZXh0ZW5kcyBTR01MRE9NSW1wbCB7Ci0JLyoqCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBhbHdheXMgaWdub3JlZC4KLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50IGNyZWF0ZUhUTUxEb2N1bWVudChTdHJpbmcgdGl0bGUpIHsKLQkJcmV0dXJuIG5ldyBTSERvY3VtZW50KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLQkgKiAgICAgICAgICAgIGFsd2F5cyBpZ25vcmVkLgotCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lCi0JICogICAgICAgICAgICBhbHdheXMgaWdub3JlZC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUsCi0JCQlEb2N1bWVudFR5cGUgZG9jdHlwZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChkb2N0eXBlID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU0hEb2N1bWVudCh0aGlzKTsKLQkJfSBlbHNlIGlmIChkb2N0eXBlLmdldE93bmVyRG9jdW1lbnQoKSAhPSBudWxsCi0JCQkJfHwgIShkb2N0eXBlIGluc3RhbmNlb2YgU0dNTERvY1R5cGUpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5XUk9OR19ET0NVTUVOVF9FUlIsIGRvY3R5cGUKLQkJCQkJKyAiIGhhcyBiZWVuIGFscmVhZHkgb3duZWQuIikgewotCQkJfTsKLQkJfSBlbHNlIHsKLQkJCURvY3VtZW50IHJldCA9IGNyZWF0ZUhUTUxEb2N1bWVudChudWxsKTsKLQkJCWlmIChkb2N0eXBlICE9IG51bGwpIHsKLQkJCQlyZXQuaW5zZXJ0QmVmb3JlKGRvY3R5cGUsIG51bGwpOwotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTSERPTUltcGwoKSB7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU0hET01JbXBsIGluc3RhbmNlID0gbmV3IFNIRE9NSW1wbCgpOwotCi0JcHVibGljIHN0YXRpYyBET01JbXBsZW1lbnRhdGlvbiBnZXRET01JbXBsZW1lbnRhdGlvbigpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIRGlyZWN0b3J5RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hEaXJlY3RvcnlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZTRkNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hEaXJlY3RvcnlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTERpcmVjdG9yeUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSERpcmVjdG9yeUVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cwotCQlIVE1MRGlyZWN0b3J5RWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIRGlyZWN0b3J5RWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb21wYWN0KCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJjb21wYWN0Iik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wYWN0KGJvb2xlYW4gY29tcGFjdCkgewotCQlzZXRBdHRyaWJ1dGUoImNvbXBhY3QiLCBjb21wYWN0ID8gImNvbXBhY3QiIDogbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hEaXZFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSERpdkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5ZWQxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSERpdkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRGl2RWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIRGl2RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxEaXZFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hEaXZFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpZ24iLCBhbGlnbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hEb2N1bWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzZkNTExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLnV0aWwuVW5zeW5jaHJvbml6ZWRIYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5pbXBsLkVsZW1lbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbC5TR01MRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxEb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFRpdGxlRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIRG9jdW1lbnQgZXh0ZW5kcyBTR01MRG9jdW1lbnQgaW1wbGVtZW50cyBIVE1MRG9jdW1lbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzIwNDA2NjMyOTAyOTIzNzU3OEw7Ci0KLQlwdWJsaWMgU0hEb2N1bWVudCgpIHsKLQkJdGhpcygoU0hET01JbXBsKSBTSERPTUltcGwuZ2V0RE9NSW1wbGVtZW50YXRpb24oKSk7Ci0JfQotCi0JU0hEb2N1bWVudChTSERPTUltcGwgaW1wbGUpIHsKLQkJc3VwZXIoaW1wbGUpOwotCX0KLQotCS8qKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjb29raWU7Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsgLyogZG8gbm90IHN1cHBvcnQgKi8KLQl9Ci0KLQlIVE1MQ29sbGVjdGlvbiBjcmVhdGVDb2xsZWN0aW9uKGZpbmFsIE5vZGVMaXN0IGxpc3QpIHsKLQkJcmV0dXJuIG5ldyBIVE1MQ29sbGVjdGlvbigpIHsKLQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJCXJldHVybiBsaXN0LmdldExlbmd0aCgpOwotCQkJfQotCi0JCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJCXJldHVybiBsaXN0Lml0ZW0oaW5kZXgpOwotCQkJfQotCi0JCQlwdWJsaWMgTm9kZSBuYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQkJCWlmICghKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCgoRWxlbWVudCkgbm9kZSkKLQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJpZCIpKSkgewotCQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOwotCQkJCQlpZiAoIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgoKEVsZW1lbnQpIG5vZGUpCi0JCQkJCQkJLmdldEF0dHJpYnV0ZSgibmFtZSIpKSkgewotCQkJCQkJRWxlbWVudERlZmluaXRpb24gZGVmID0gZ2V0RFREKCkuZ2V0RWxlbWVudERlZmluaXRpb24oCi0JCQkJCQkJCW5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCQlpZiAoZGVmICE9IG51bGwgJiYgZGVmLmdldEF0dHJpYnV0ZURlZigibmFtZSIpICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gbGlzdC50b1N0cmluZygpOwotCQkJfQotCQl9OwotCX0KLQotCUhUTUxDb2xsZWN0aW9uIGNyZWF0ZUNvbGxlY3Rpb24oZmluYWwgTm9kZSBub2Rlc1tdLCBmaW5hbCBpbnQgbGVuKSB7Ci0JCXJldHVybiBuZXcgSFRNTENvbGxlY3Rpb24oKSB7Ci0JCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCQlyZXR1cm4gbGVuOwotCQkJfQotCi0JCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJCXJldHVybiAwIDw9IGluZGV4ICYmIGluZGV4IDwgbGVuID8gbm9kZXNbaW5kZXhdIDogbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIE5vZGUgbmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCQlOb2RlIG5vZGUgPSBub2Rlc1tpXTsKLQkJCQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoKChFbGVtZW50KSBub2RlKQotCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImlkIikpKSB7Ci0JCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IG5vZGVzW2ldOwotCQkJCQlpZiAoIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgoKEVsZW1lbnQpIG5vZGUpCi0JCQkJCQkJLmdldEF0dHJpYnV0ZSgibmFtZSIpKSkgewotCQkJCQkJRWxlbWVudERlZmluaXRpb24gZGVmID0gZ2V0RFREKCkuZ2V0RWxlbWVudERlZmluaXRpb24oCi0JCQkJCQkJCW5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCQlpZiAoZGVmICE9IG51bGwgJiYgZGVmLmdldEF0dHJpYnV0ZURlZigibmFtZSIpICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBVbnN5bmNocm9uaXplZEhhc2h0YWJsZSBjb25zdHJ1Y3RvcnM7Ci0Jc3RhdGljIHsKLQkJY29uc3RydWN0b3JzID0gbmV3IFVuc3luY2hyb25pemVkSGFzaHRhYmxlKCk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkNPTCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSFRhYmxlQ29sRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiQ09MR1JPVVAiLCBjb25zdHJ1Y3RvcnMuZ2V0KCJDT0wiKSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIlRIRUFEIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIVGFibGVTZWN0aW9uRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiVEZPT1QiLCBjb25zdHJ1Y3RvcnMuZ2V0KCJUSEVBRCIpKTsKLQkJY29uc3RydWN0b3JzLnB1dCgiQ0FQVElPTiIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSFRhYmxlQ2FwdGlvbkVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIlRIIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIVGFibGVDZWxsRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiSFRNTCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSEh0bWxFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJCQVNFIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIQmFzZUVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIlNUWUxFIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIU3R5bGVFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJUSVRMRSIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSFRpdGxlRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiQk9EWSIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSEJvZHlFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJINiIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSEhlYWRpbmdFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJIRUFEIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNISGVhZEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIlNDUklQVCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSFNjcmlwdEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkxJTksiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hMaW5rRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiRlJBTUVTRVQiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hGcmFtZVNldEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkJBU0VGT05UIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIQmFzZUZvbnRFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJJTlMiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hNb2RFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJERUwiLCBjb25zdHJ1Y3RvcnMuZ2V0KCJJTlMiKSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIklGUkFNRSIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSElGcmFtZUVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkZJRUxEU0VUIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIRmllbGRTZXRFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJESVIiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hEaXJlY3RvcnlFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJNRVRBIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNITWV0YUVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkhSIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNISFJFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJNRU5VIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNITWVudUVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIk9CSkVDVCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSE9iamVjdEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkFQUExFVCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSEFwcGxldEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIlBBUkFNIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIUGFyYW1FbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJNQVAiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hNYXBFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJBUkVBIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIQXJlYUVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkxFR0VORCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSExlZ2VuZEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIklTSU5ERVgiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hJc0luZGV4RWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiT1BUR1JPVVAiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hPcHRHcm91cEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIlRFWFRBUkVBIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIVGV4dEFyZWFFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJGT1JNIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIRm9ybUVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIlNFTEVDVCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSFNlbGVjdEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkxBQkVMIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNITGFiZWxFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJINSIsIGNvbnN0cnVjdG9ycy5nZXQoIkg2IikpOwotCQljb25zdHJ1Y3RvcnMucHV0KCJCVVRUT04iLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hCdXR0b25FbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJJTlBVVCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSElucHV0RWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiT1BUSU9OIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIT3B0aW9uRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiUVVPVEUiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hRdW90ZUVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkg0IiwgY29uc3RydWN0b3JzLmdldCgiSDYiKSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIlBSRSIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSFByZUVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkgzIiwgY29uc3RydWN0b3JzLmdldCgiSDYiKSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIkJSIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIQlJFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJUQUJMRSIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSFRhYmxlRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiVEJPRFkiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hUYWJsZVNlY3Rpb25FbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJETCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSERMaXN0RWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiSDIiLCBjb25zdHJ1Y3RvcnMuZ2V0KCJINiIpKTsKLQkJY29uc3RydWN0b3JzLnB1dCgiVUwiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hVTGlzdEVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIk9MIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIT0xpc3RFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJUUiIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSFRhYmxlUm93RWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiTEkiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hMSUVsZW1lbnQodGFnTmFtZSwgZG9jKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnN0cnVjdG9ycy5wdXQoIklNRyIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSEltYWdlRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQotCQljb25zdHJ1Y3RvcnMucHV0KCJESVYiLCBuZXcgQ29uc3RydWN0b3IoKSB7Ci0JCQlwdWJsaWMgU0hFbGVtZW50IG5ld0luc3RhbmNlKFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQkJCXJldHVybiBuZXcgU0hEaXZFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJIMSIsIGNvbnN0cnVjdG9ycy5nZXQoIkg2IikpOwotCQljb25zdHJ1Y3RvcnMucHV0KCJQIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIUGFyYWdyYXBoRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiRk9OVCIsIG5ldyBDb25zdHJ1Y3RvcigpIHsKLQkJCXB1YmxpYyBTSEVsZW1lbnQgbmV3SW5zdGFuY2UoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCQkJcmV0dXJuIG5ldyBTSEZvbnRFbGVtZW50KHRhZ05hbWUsIGRvYyk7Ci0JCQl9Ci0JCX0pOwotCQljb25zdHJ1Y3RvcnMucHV0KCJBIiwgbmV3IENvbnN0cnVjdG9yKCkgewotCQkJcHVibGljIFNIRWxlbWVudCBuZXdJbnN0YW5jZShTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJCQlyZXR1cm4gbmV3IFNIQW5jaG9yRWxlbWVudCh0YWdOYW1lLCBkb2MpOwotCQkJfQotCQl9KTsKLQkJY29uc3RydWN0b3JzLnB1dCgiVEQiLCBjb25zdHJ1Y3RvcnMuZ2V0KCJUSCIpKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyB0YWdOYW1lKSB7Ci0JCUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gY29uc3RydWN0b3JzLmdldCh0YWdOYW1lKTsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yICE9IG51bGwgPyBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSh0YWdOYW1lLCB0aGlzKQotCQkJCTogbmV3IFNIRWxlbWVudCh0YWdOYW1lLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTENvbGxlY3Rpb24gZ2V0TGlua3MoKSB7Ci0JCWludCBsZW4gPSAwOwotCQlOb2RlIGxpbmtzW10gPSBuZXcgTm9kZVszMl07Ci0JCU5vZGUgdG1wMSwgdG1wMjsKLQkJTm9kZSByb290ID0gZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCXRtcDEgPSByb290OwotCQlvdXRlcjogd2hpbGUgKHRtcDEgIT0gbnVsbCkgewotCQkJaWYgKHRtcDEgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSB0bXAxLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQVJFQSIpCi0JCQkJCQl8fCAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJBIikgJiYgKChFbGVtZW50KSB0bXAxKQotCQkJCQkJCQkuZ2V0QXR0cmlidXRlTm9kZSgiaHJlZiIpICE9IG51bGwpKSB7Ci0JCQkJCWlmIChsZW4gPT0gbGlua3MubGVuZ3RoKSB7Ci0JCQkJCQlOb2RlIGJ1ZltdID0gbmV3IE5vZGVbbGVuICogMl07Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGxpbmtzLCAwLCBidWYsIDAsIGxlbik7Ci0JCQkJCQlsaW5rcyA9IGJ1ZjsKLQkJCQkJfQotCQkJCQlsaW5rc1tsZW4rK10gPSB0bXAxOwotCQkJCX0KLQkJCX0KLQkJCWlmICgodG1wMiA9IHRtcDEuZ2V0Rmlyc3RDaGlsZCgpKSA9PSBudWxsKSB7Ci0JCQkJaWYgKHRtcDEgPT0gcm9vdCkgewotCQkJCQlicmVhayBvdXRlcjsKLQkJCQl9IGVsc2UgewotCQkJCQl0bXAyID0gdG1wMS5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCX0KLQkJCXdoaWxlICh0bXAyID09IG51bGwgJiYgdG1wMSAhPSBudWxsKSB7Ci0JCQkJdG1wMSA9IHRtcDIgPSB0bXAxLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAodG1wMSAhPSByb290KSB7Ci0JCQkJCXRtcDIgPSB0bXAxLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnJlYWsgb3V0ZXI7Ci0JCQkJfQotCQkJfQotCQkJdG1wMSA9IHRtcDI7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZUNvbGxlY3Rpb24obGlua3MsIGxlbik7Ci0JfQotCi0JcHVibGljIEhUTUxDb2xsZWN0aW9uIGdldEFwcGxldHMoKSB7Ci0JCXJldHVybiBjcmVhdGVDb2xsZWN0aW9uKGdldEVsZW1lbnRzQnlUYWdOYW1lKCJBUFBMRVQiKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb29raWUoKSB7Ci0JCXJldHVybiBjb29raWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREb21haW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnRCeUlkKFN0cmluZyBlbGVtZW50SWQpIHsKLQkJTm9kZSB0bXAxLCB0bXAyOwotCQlOb2RlIHJvb3QgPSBnZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJdG1wMSA9IHJvb3Q7Ci0JCXdoaWxlICh0bXAxICE9IG51bGwpIHsKLQkJCWlmICh0bXAxIGluc3RhbmNlb2YgRWxlbWVudAotCQkJCQkmJiBlbGVtZW50SWQuZXF1YWxzKCgoRWxlbWVudCkgdG1wMSkuZ2V0QXR0cmlidXRlKCJpZCIpKSkgewotCQkJCXJldHVybiAoRWxlbWVudCkgdG1wMTsKLQkJCX0KLQkJCWlmICgodG1wMiA9IHRtcDEuZ2V0Rmlyc3RDaGlsZCgpKSA9PSBudWxsKSB7Ci0JCQkJaWYgKHRtcDEgPT0gcm9vdCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9IGVsc2UgewotCQkJCQl0bXAyID0gdG1wMS5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCX0KLQkJCXdoaWxlICh0bXAyID09IG51bGwgJiYgdG1wMSAhPSBudWxsKSB7Ci0JCQkJdG1wMSA9IHRtcDIgPSB0bXAxLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAodG1wMSAhPSByb290KSB7Ci0JCQkJCXRtcDIgPSB0bXAxLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJdG1wMSA9IHRtcDI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlOYW1lKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKCIqIikpIHsKLQkJCXJldHVybiBuZXcgTm9kZUxpc3QoKSB7Ci0JCQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQotCQkJCXB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0RWxlbWVudHNCeVRhZ05hbWUoZWxlbWVudE5hbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIEhUTUxDb2xsZWN0aW9uIGdldEZvcm1zKCkgewotCQlyZXR1cm4gY3JlYXRlQ29sbGVjdGlvbihnZXRFbGVtZW50c0J5TmFtZSgiRk9STSIpKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTENvbGxlY3Rpb24gZ2V0SW1hZ2VzKCkgewotCQlyZXR1cm4gY3JlYXRlQ29sbGVjdGlvbihnZXRFbGVtZW50c0J5TmFtZSgiSU1HIikpOwotCX0KLQotCXB1YmxpYyBIVE1MQ29sbGVjdGlvbiBnZXRBbmNob3JzKCkgewotCQlpbnQgbGVuID0gMDsKLQkJTm9kZSBsaW5rc1tdID0gbmV3IE5vZGVbMzJdOwotCQlOb2RlIHRtcDEsIHRtcDI7Ci0JCU5vZGUgcm9vdCA9IGdldERvY3VtZW50RWxlbWVudCgpOwotCQl0bXAxID0gcm9vdDsKLQkJb3V0ZXI6IHdoaWxlICh0bXAxICE9IG51bGwpIHsKLQkJCWlmICh0bXAxIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCVN0cmluZyBuYW1lID0gdG1wMS5nZXROb2RlTmFtZSgpOwotCQkJCWlmICgobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJBIikgJiYgKChFbGVtZW50KSB0bXAxKQotCQkJCQkJLmdldEF0dHJpYnV0ZU5vZGUoIm5hbWUiKSAhPSBudWxsKSkgewotCQkJCQlpZiAobGVuID09IGxpbmtzLmxlbmd0aCkgewotCQkJCQkJTm9kZSBidWZbXSA9IG5ldyBOb2RlW2xlbiAqIDJdOwotCQkJCQkJU3lzdGVtLmFycmF5Y29weShsaW5rcywgMCwgYnVmLCAwLCBsZW4pOwotCQkJCQkJbGlua3MgPSBidWY7Ci0JCQkJCX0KLQkJCQkJbGlua3NbbGVuKytdID0gdG1wMTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoKHRtcDIgPSB0bXAxLmdldEZpcnN0Q2hpbGQoKSkgPT0gbnVsbCkgewotCQkJCWlmICh0bXAxID09IHJvb3QpIHsKLQkJCQkJYnJlYWsgb3V0ZXI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdG1wMiA9IHRtcDEuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAodG1wMiA9PSBudWxsICYmIHRtcDEgIT0gbnVsbCkgewotCQkJCXRtcDEgPSB0bXAyID0gdG1wMS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHRtcDEgIT0gcm9vdCkgewotCQkJCQl0bXAyID0gdG1wMS5nZXROZXh0U2libGluZygpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJyZWFrIG91dGVyOwotCQkJCX0KLQkJCX0KLQkJCXRtcDEgPSB0bXAyOwotCQl9Ci0JCXJldHVybiBjcmVhdGVDb2xsZWN0aW9uKGxpbmtzLCBsZW4pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJyZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCWlmIChudWxsID09IGdldERvY3VtZW50RWxlbWVudCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGVMaXN0IHRpdGxlcyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJUSVRMRSIpOwotCQlpZiAodGl0bGVzLmdldExlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJSFRNTFRpdGxlRWxlbWVudCB0ZSA9IChIVE1MVGl0bGVFbGVtZW50KSB0aXRsZXMuaXRlbSgwKTsKLQkJTm9kZSB0aXRsZSA9IHRlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKHRpdGxlID09IG51bGwgfHwgISh0aXRsZSBpbnN0YW5jZW9mIFRleHQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0aXRsZS5nZXROb2RlVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIFVSTCB1cmw7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybCAhPSBudWxsID8gdXJsLnRvU3RyaW5nKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFVSTCBvZiB0aGlzIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSTChVUkwgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7IC8qIGRvIG5vdCBzdXBwb3J0ICovCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBpZiB0aGlzIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgPGNvZGU+Qk9EWTwvY29kZT4gb3IKLQkgKiAgICAgICAgIDxjb2RlPkZSQU1FU0VUCi0JICogPC9jb2RlPiwgbnVsbC4KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnQgZ2V0Qm9keSgpIHsKLQkJaWYgKGdldERvY3VtZW50RWxlbWVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZUxpc3QgYm9kaWVzID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZSQU1FU0VUIik7Ci0JCWlmIChib2RpZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJYm9kaWVzID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkJPRFkiKTsKLQkJfQotCQlpZiAoYm9kaWVzLmdldExlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRWxlbWVudCkgYm9kaWVzLml0ZW0oMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Qm9keShIVE1MRWxlbWVudCBib2R5KSB7Ci0JCUhUTUxFbGVtZW50IG9sZEJvZHkgPSBnZXRCb2R5KCk7Ci0JCWlmIChvbGRCb2R5ID09IG51bGwpIHsKLQkJCWdldERvY3VtZW50RWxlbWVudCgpLmluc2VydEJlZm9yZShib2R5LCBudWxsKTsKLQkJfSBlbHNlIHsKLQkJCW9sZEJvZHkuZ2V0UGFyZW50Tm9kZSgpLnJlcGxhY2VDaGlsZChib2R5LCBvbGRCb2R5KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvb2tpZShTdHJpbmcgY29va2llKSB7Ci0JCXRoaXMuY29va2llID0gY29va2llOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSkgewotCQlOb2RlTGlzdCB0aXRsZXMgPSBnZXRFbGVtZW50c0J5VGFnTmFtZSgiVElUTEUiKTsKLQkJaWYgKHRpdGxlcy5nZXRMZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCQlIVE1MVGl0bGVFbGVtZW50IHRlID0gKEhUTUxUaXRsZUVsZW1lbnQpIHRpdGxlcy5pdGVtKDApOwotCQl0ZS5zZXRUZXh0KHRpdGxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgdGV4dCkgeyAvKiBkbyBub3Qgc3VwcG9ydCAqLwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlbG4oU3RyaW5nIHRleHQpIHsgLyogZG8gbm90IHN1cHBvcnQgKi8KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgdGhpcyBkb2N1bWVudCBhcyBYSFRNTCBmb3JtYXQuIEF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50Ci0JICogdGhpcyBtZXRob2QgZ2VuZXJhdGVzIGlzIGEgRE9DVFlQRSBkZWNsYXJhdGlvbi4gSXRzIGNvbnRlbnRzIGlzCi0JICogZGV0ZXJtaW5lZCBhcyBmb2xsb3dzLgotCSAqIDx1bD4KLQkgKiA8bGk+IGlmIHRoaXMgZG9jdW1lbnQncyBkb2N0eXBlIGlzICItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iLAotCSAqIHRoZW4gIi0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iCi0JICogPGxpPiBlbHNlIGlmICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iIHRoZW4gIi0vL1czQy8vRFREIFhIVE1MIDEuMAotCSAqIFN0cmljdC8vRU4iCi0JICogPGxpPiBPdGhlcndpc2UsICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLQkgKiA8L3VsPgotCSAqIAotCSAqIEBwYXJhbSBwdwotCSAqICAgICAgICAgICAgUHJpbnRXcml0ZXIgdG8gd3JpdGUKLQkgKiBAcGFyYW0gaW5kZW50Ci0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgaW5kZW50cwotCSAqIEBwYXJhbSBlbmMKLQkgKiAgICAgICAgICAgIGVuY29kaW5nIG9mIG91dHB1dAotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50QXNYSFRNTChQcmludFdyaXRlciBwdywgYm9vbGVhbiBpbmRlbnQsIFN0cmluZyBlbmMpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgZHRkSUQgPSBnZXREVEQoKS50b1N0cmluZygpOwotCQlpZiAoZHRkSUQuZXF1YWxzKCItLy9XM0MvL0RURCBIVE1MIDQuMCBGcmFtZXNldC8vRU4iKSkgewotCQkJcHJpbnRBc1hNTCgiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiIsIG5ldyBVUkwoCi0JCQkJCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1mcmFtZXNldC5kdGQiKSwgcHcsCi0JCQkJCWluZGVudCwgZW5jKTsKLQkJfSBlbHNlIGlmIChkdGRJRC5lcXVhbHMoIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiIpKSB7Ci0JCQlwcmludEFzWE1MKCItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIsIG5ldyBVUkwoCi0JCQkJCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIiksIHB3LAotCQkJCQlpbmRlbnQsIGVuYyk7Ci0JCX0gZWxzZSB7Ci0JCQlwcmludEFzWE1MKCItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIsIG5ldyBVUkwoCi0JCQkJCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiksCi0JCQkJCXB3LCBpbmRlbnQsIGVuYyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmY4YjZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmltcGwuU0dNTEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgU0hFbGVtZW50IGV4dGVuZHMgU0dNTEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIRWxlbWVudChTdHJpbmcgbmFtZSwgRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKG5hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNsYXNzIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImRpciIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYW5nKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJsYW5nIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidGl0bGUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoImNsYXNzIiwgY2xhc3NOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXIoU3RyaW5nIGRpcikgewotCQlzZXRBdHRyaWJ1dGUoImRpciIsIGRpcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXNldEF0dHJpYnV0ZSgiaWQiLCBpZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFuZyhTdHJpbmcgbGFuZykgewotCQlzZXRBdHRyaWJ1dGUoImxhbmciLCBsYW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJc2V0QXR0cmlidXRlKCJ0aXRsZSIsIHRpdGxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEZpZWxkU2V0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hGaWVsZFNldEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEzYmRhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEZpZWxkU2V0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEZpZWxkU2V0RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxGb3JtRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIRmllbGRTZXRFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTEZpZWxkU2V0RWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIRmllbGRTZXRFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBIVE1MRm9ybUVsZW1lbnQgZ2V0Rm9ybSgpIHsKLQkJZm9yIChOb2RlIHJldCA9IGdldFBhcmVudE5vZGUoKTsgcmV0ICE9IG51bGw7IHJldCA9IHJldC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChyZXQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpCi0JCQkJcmV0dXJuIChIVE1MRm9ybUVsZW1lbnQpIHJldDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEZvbnRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEZvbnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YWU5YTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hGb250RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxGb250RWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIRm9udEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MRm9udEVsZW1lbnQgewotCXByb3RlY3RlZCBTSEZvbnRFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNvbG9yIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sb3IoU3RyaW5nIGNvbG9yKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY29sb3IiLCBjb2xvcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGYWNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJmYWNlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmFjZShTdHJpbmcgZmFjZSkgewotCQlzZXRBdHRyaWJ1dGUoImZhY2UiLCBmYWNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNpemUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInNpemUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaXplKFN0cmluZyBzaXplKSB7Ci0JCXNldEF0dHJpYnV0ZSgic2l6ZSIsIHNpemUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIRm9ybUN0cmxFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEZvcm1DdHJsRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWY2Y2U0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIRm9ybUN0cmxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRm9ybUVsZW1lbnQ7Ci0KLWFic3RyYWN0IGNsYXNzIFNIRm9ybUN0cmxFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IHsKLQlTSEZvcm1DdHJsRWxlbWVudChTdHJpbmcgbmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIobmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTEZvcm1FbGVtZW50IGdldEZvcm0oKSB7Ci0JCWZvciAoTm9kZSByZXQgPSBnZXRQYXJlbnROb2RlKCk7IHJldCAhPSBudWxsOyByZXQgPSByZXQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocmV0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KQotCQkJCXJldHVybiAoSFRNTEZvcm1FbGVtZW50KSByZXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXREaXNhYmxlZCgpIHsKLQkJU3RyaW5nIHZhbCA9IGdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKTsKLQkJcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGgoKSAhPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpc2FibGVkKGJvb2xlYW4gZGlzYWJsZWQpIHsKLQkJc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsIGRpc2FibGVkID8gImRpc2FibGVkIiA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRUYWJJbmRleCgpIHsKLQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWJJbmRleChpbnQgdGFiSW5kZXgpIHsKLQkJc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIEludGVnZXIudG9TdHJpbmcodGFiSW5kZXgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEZvcm1FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEZvcm1FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1N2NjNGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hGb3JtRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxGb3JtRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIRm9ybUVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MRm9ybUVsZW1lbnQgewotCXByb3RlY3RlZCBTSEZvcm1FbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBIVE1MQ29sbGVjdGlvbiBnZXRFbGVtZW50cygpIHsKLQkJaW50IGxlbiA9IDA7Ci0JCUhUTUxFbGVtZW50IGVsZW1lbnRzW10gPSBuZXcgSFRNTEVsZW1lbnRbOF07Ci0JCU5vZGUgdG1wMSwgdG1wMjsKLQkJdG1wMSA9IHRoaXM7Ci0JCW91dGVyOiB3aGlsZSAodG1wMSAhPSBudWxsKSB7Ci0JCQlpZiAodG1wMSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHRtcDEuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJJTlBVVCIpCi0JCQkJCQl8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlNFTEVDVCIpCi0JCQkJCQl8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlRFWFRBUkVBIikKLQkJCQkJCXx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiTEFCRUwiKQotCQkJCQkJfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJCVVRUT04iKSkgewotCQkJCQlpZiAobGVuID09IGVsZW1lbnRzLmxlbmd0aCkgewotCQkJCQkJSFRNTEVsZW1lbnQgYnVmW10gPSBuZXcgSFRNTEVsZW1lbnRbbGVuICogMl07Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGVsZW1lbnRzLCAwLCBidWYsIDAsIGxlbik7Ci0JCQkJCQllbGVtZW50cyA9IGJ1ZjsKLQkJCQkJfQotCQkJCQllbGVtZW50c1tsZW4rK10gPSAoSFRNTEVsZW1lbnQpIHRtcDE7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCh0bXAyID0gdG1wMS5nZXRGaXJzdENoaWxkKCkpID09IG51bGwpIHsKLQkJCQlpZiAodG1wMSA9PSB0aGlzKSB7Ci0JCQkJCWJyZWFrIG91dGVyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRtcDIgPSB0bXAxLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJfQotCQkJd2hpbGUgKHRtcDIgPT0gbnVsbCAmJiB0bXAxICE9IG51bGwpIHsKLQkJCQl0bXAxID0gdG1wMiA9IHRtcDEuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmICh0bXAxICE9IHRoaXMpIHsKLQkJCQkJdG1wMiA9IHRtcDEuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlicmVhayBvdXRlcjsKLQkJCQl9Ci0JCQl9Ci0JCQl0bXAxID0gdG1wMjsKLQkJfQotCQlyZXR1cm4gKChTSERvY3VtZW50KSBnZXRPd25lckRvY3VtZW50KCkpCi0JCQkJLmNyZWF0ZUNvbGxlY3Rpb24oZWxlbWVudHMsIGxlbik7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50cygpLmdldExlbmd0aCgpOwotCX07Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXB0Q2hhcnNldCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWNjZXB0LWNoYXJzZXQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY2NlcHRDaGFyc2V0KFN0cmluZyBhY2NlcHRDaGFyc2V0KSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWNjZXB0LWNoYXJzZXQiLCBhY2NlcHRDaGFyc2V0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWN0aW9uIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKLQkJc2V0QXR0cmlidXRlKCJhY3Rpb24iLCBhY3Rpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jdHlwZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiZW5jdHlwZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuY3R5cGUoU3RyaW5nIGVuY3R5cGUpIHsKLQkJc2V0QXR0cmlidXRlKCJlbmN0eXBlIiwgZW5jdHlwZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm1ldGhvZCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKSB7Ci0JCXNldEF0dHJpYnV0ZSgibWV0aG9kIiwgbWV0aG9kKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidGFyZ2V0Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0KFN0cmluZyB0YXJnZXQpIHsKLQkJc2V0QXR0cmlidXRlKCJ0YXJnZXQiLCB0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIGRvIG5vdGhpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdWJtaXQoKSB7IC8qIGRvIG5vdGhpbmc7ICovCi0JfQotCi0JLyoqCi0JICogZG8gbm90aGluZwotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgeyAvKiBkbyBub3RoaW5nOyAqLwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIRnJhbWVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEZyYW1lRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzBkY2NjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIRnJhbWVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEZyYW1lRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIRnJhbWVFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTEZyYW1lRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIRnJhbWVFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnJhbWVCb3JkZXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImZyYW1lYm9yZGVyIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RnJhbWVCb3JkZXIoU3RyaW5nIGZyYW1lQm9yZGVyKSB7Ci0JCXNldEF0dHJpYnV0ZSgiZnJhbWVib3JkZXIiLCBmcmFtZUJvcmRlcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb25nRGVzYygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgibG9uZ2Rlc2MiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb25nRGVzYyhTdHJpbmcgbG9uZ0Rlc2MpIHsKLQkJc2V0QXR0cmlidXRlKCJsb25nZGVzYyIsIGxvbmdEZXNjKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpbkhlaWdodCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgibWFyZ2luaGVpZ2h0Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luSGVpZ2h0KFN0cmluZyBtYXJnaW5IZWlnaHQpIHsKLQkJc2V0QXR0cmlidXRlKCJtYXJnaW5oZWlnaHQiLCBtYXJnaW5IZWlnaHQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luV2lkdGgoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm1hcmdpbndpZHRoIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luV2lkdGgoU3RyaW5nIG1hcmdpbldpZHRoKSB7Ci0JCXNldEF0dHJpYnV0ZSgibWFyZ2lud2lkdGgiLCBtYXJnaW5XaWR0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXROb1Jlc2l6ZSgpIHsKLQkJU3RyaW5nIHZhbCA9IGdldEF0dHJpYnV0ZSgibm9yZXNpemUiKTsKLQkJcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGgoKSAhPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vUmVzaXplKGJvb2xlYW4gbm9SZXNpemUpIHsKLQkJc2V0QXR0cmlidXRlKCJub3Jlc2l6ZSIsIG5vUmVzaXplID8gIm5vcmVzaXplIiA6IG51bGwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2Nyb2xsaW5nKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJzY3JvbGxpbmciKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY3JvbGxpbmcoU3RyaW5nIHNjcm9sbGluZykgewotCQlzZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIHNjcm9sbGluZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcmMoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInNyYyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNyYyhTdHJpbmcgc3JjKSB7Ci0JCXNldEF0dHJpYnV0ZSgic3JjIiwgc3JjKTsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IGNvbnRlbnREb2M7Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0Q29udGVudERvY3VtZW50KCkgewotCQlyZXR1cm4gY29udGVudERvYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250ZW50IGRvY3VtZW50IHRoaXMgZnJhbWUgY29udGFpbnMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudERvY3VtZW50KERvY3VtZW50IGNvbnRlbnREb2MpIHsKLQkJdGhpcy5jb250ZW50RG9jID0gY29udGVudERvYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEZyYW1lU2V0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hGcmFtZVNldEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5ZmM4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEZyYW1lU2V0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxGcmFtZVNldEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSEZyYW1lU2V0RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxGcmFtZVNldEVsZW1lbnQgewotCXByb3RlY3RlZCBTSEZyYW1lU2V0RWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHMoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNvbHMiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJvd3MoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInJvd3MiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb2xzKFN0cmluZyBjb2xzKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY29scyIsIGNvbHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvd3MoU3RyaW5nIHJvd3MpIHsKLQkJc2V0QXR0cmlidXRlKCJyb3dzIiwgcm93cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hIUkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NISFJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3M2E4N2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hIUkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MSFJFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hIUkVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MSFJFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hIUkVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbGlnbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWxpZ24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGlnbihTdHJpbmcgYWxpZ24pIHsKLQkJc2V0QXR0cmlidXRlKCJhbGlnbiIsIGFsaWduKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXROb1NoYWRlKCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJub3NoYWRlIik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb1NoYWRlKGJvb2xlYW4gbm9TaGFkZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5vc2hhZGUiLCBub1NoYWRlID8gIm5vc2hhZGUiIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaXplKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJzaXplIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2l6ZShTdHJpbmcgc2l6ZSkgewotCQlzZXRBdHRyaWJ1dGUoInNpemUiLCBzaXplKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ3aWR0aCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdpZHRoKFN0cmluZyB3aWR0aCkgewotCQlzZXRBdHRyaWJ1dGUoIndpZHRoIiwgd2lkdGgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NISGVhZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NISGVhZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ2YWU4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEhlYWRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEhlYWRFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hIZWFkRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxIZWFkRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNISGVhZEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9maWxlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJwcm9maWxlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvZmlsZShTdHJpbmcgcHJvZmlsZSkgewotCQlzZXRBdHRyaWJ1dGUoInByb2ZpbGUiLCBwcm9maWxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEhlYWRpbmdFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSEhlYWRpbmdFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkY2ZjNmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hIZWFkaW5nRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxIZWFkaW5nRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNISGVhZGluZ0VsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MSGVhZGluZ0VsZW1lbnQgewotCXByb3RlY3RlZCBTSEhlYWRpbmdFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpZ24iLCBhbGlnbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hIdG1sRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hIdG1sRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzQ0OTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NISHRtbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MSHRtbEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSEh0bWxFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTEh0bWxFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hIdG1sRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInZlcnNpb24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXNldEF0dHJpYnV0ZSgidmVyc2lvbiIsIHZlcnNpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NISUZyYW1lRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hJRnJhbWVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MjgwYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hJRnJhbWVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxJRnJhbWVFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hJRnJhbWVFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTElGcmFtZUVsZW1lbnQgewotCXByb3RlY3RlZCBTSElGcmFtZUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbGlnbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWxpZ24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGlnbihTdHJpbmcgYWxpZ24pIHsKLQkJc2V0QXR0cmlidXRlKCJhbGlnbiIsIGFsaWduKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZyYW1lQm9yZGVyKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJmcmFtZWJvcmZlciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZyYW1lQm9yZGVyKFN0cmluZyBmcmFtZUJvcmRlcikgewotCQlzZXRBdHRyaWJ1dGUoImZyYW1lYm9yZGVyIiwgZnJhbWVCb3JkZXIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJoZWlnaHQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoU3RyaW5nIGhlaWdodCkgewotCQlzZXRBdHRyaWJ1dGUoImhlaWdodCIsIGhlaWdodCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb25nRGVzYygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgibG9uZ2Rlc2MiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb25nRGVzYyhTdHJpbmcgbG9uZ0Rlc2MpIHsKLQkJc2V0QXR0cmlidXRlKCJsb25nRGVzYyIsIGxvbmdEZXNjKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpbkhlaWdodCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgibWFyZ2luaGVpZ2h0Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luSGVpZ2h0KFN0cmluZyBtYXJnaW5IZWlnaHQpIHsKLQkJc2V0QXR0cmlidXRlKCJtYXJnaW5oZWlnaHQiLCBtYXJnaW5IZWlnaHQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luV2lkdGgoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm1hcmdpbndpZHRoIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luV2lkdGgoU3RyaW5nIG1hcmdpbldpZHRoKSB7Ci0JCXNldEF0dHJpYnV0ZSgibWFyZ2lud2lkdGgiLCBtYXJnaW5XaWR0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjcm9sbGluZygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2Nyb2xsaW5nKFN0cmluZyBzY3JvbGxpbmcpIHsKLQkJc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCBzY3JvbGxpbmcpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3JjKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJzcmMiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcmMoU3RyaW5nIHNyYykgewotCQlzZXRBdHRyaWJ1dGUoInNyYyIsIHNyYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgic3JjIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoU3RyaW5nIHdpZHRoKSB7Ci0JCXNldEF0dHJpYnV0ZSgid2lkdGgiLCB3aWR0aCk7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudCBjb250ZW50RG9jOwotCi0JcHVibGljIERvY3VtZW50IGdldENvbnRlbnREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnREb2M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGVudCBkb2N1bWVudCB0aGlzIGludGVybmFsIGZyYW1lIGNvbnRhaW5zLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnREb2N1bWVudChEb2N1bWVudCBjb250ZW50RG9jKSB7Ci0JCXRoaXMuY29udGVudERvYyA9IGNvbnRlbnREb2M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hJbWFnZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NISW1hZ2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTIyMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hJbWFnZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEltYWdlRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNISW1hZ2VFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTEltYWdlRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNISW1hZ2VFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG93U3JjKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJsb3dzcmMiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb3dTcmMoU3RyaW5nIGxvd1NyYykgewotCQlzZXRBdHRyaWJ1dGUoImxvd3NyYyIsIGxvd1NyYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWduKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJhbGlnbiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsaWduKFN0cmluZyBhbGlnbikgewotCQlzZXRBdHRyaWJ1dGUoImFsaWduIiwgYWxpZ24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJhbHQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbHQoU3RyaW5nIGFsdCkgewotCQlzZXRBdHRyaWJ1dGUoImFsdCIsIGFsdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImJvcmRlciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJvcmRlcihTdHJpbmcgYm9yZGVyKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYm9yZGVyIiwgYm9yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiaGVpZ2h0Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KFN0cmluZyBoZWlnaHQpIHsKLQkJc2V0QXR0cmlidXRlKCJoZWlnaHQiLCBoZWlnaHQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHNwYWNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJoc3BhY2UiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIc3BhY2UoU3RyaW5nIGhzcGFjZSkgewotCQlzZXRBdHRyaWJ1dGUoImhzcGFjZSIsIGhzcGFjZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0SXNNYXAoKSB7Ci0JCVN0cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGUoImlzbWFwIik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc01hcChib29sZWFuIGlzTWFwKSB7Ci0JCXNldEF0dHJpYnV0ZSgiaXNtYXAiLCBpc01hcCA/ICJpc21hcCIgOiBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvbmdEZXNjKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJsb25nZGVzYyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvbmdEZXNjKFN0cmluZyBsb25nRGVzYykgewotCQlzZXRBdHRyaWJ1dGUoImxvbmdkZXNjIiwgbG9uZ0Rlc2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3JjKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJzcmMiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcmMoU3RyaW5nIHNyYykgewotCQlzZXRBdHRyaWJ1dGUoInNyYyIsIHNyYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVc2VNYXAoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInVzZW1hcCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZU1hcChTdHJpbmcgdXNlTWFwKSB7Ci0JCXNldEF0dHJpYnV0ZSgidXNlbWFwIiwgdXNlTWFwKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZzcGFjZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidnNhcGNlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VnNwYWNlKFN0cmluZyB2c3BhY2UpIHsKLQkJc2V0QXR0cmlidXRlKCJ2c3BhY2UiLCB2c3BhY2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIndpZHRoIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoU3RyaW5nIHdpZHRoKSB7Ci0JCXNldEF0dHJpYnV0ZSgid2lkdGgiLCB3aWR0aCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hJbnB1dEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NISW5wdXRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDMyNGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hJbnB1dEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTElucHV0RWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNISW5wdXRFbGVtZW50IGV4dGVuZHMgU0hGb3JtQ3RybEVsZW1lbnQgaW1wbGVtZW50cwotCQlIVE1MSW5wdXRFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hJbnB1dEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlOwotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdENoZWNrZWQ7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0Q2hlY2tlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENoZWNrZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdENoZWNrZWQoYm9vbGVhbiBkZWZhdWx0Q2hlY2tlZCkgewotCQl0aGlzLmRlZmF1bHRDaGVja2VkID0gZGVmYXVsdENoZWNrZWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBY2NlcHQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFjY2VwdCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjY2VwdChTdHJpbmcgYWNjZXB0KSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWNjZXB0IiwgYWNjZXB0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc0tleSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWNjZXNza2V5Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzS2V5KFN0cmluZyBhY2Nlc3NLZXkpIHsKLQkJc2V0QXR0cmlidXRlKCJhY2Nlc3NrZXkiLCBhY2Nlc3NLZXkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpZ24iLCBhbGlnbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbHQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsdCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsdChTdHJpbmcgYWx0KSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWx0IiwgYWx0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDaGVja2VkKCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJjaGVja2VkIik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgewotCQlzZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCBjaGVja2VkID8gImNoZWNrZWQiIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heExlbmd0aCgpIHsKLQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZ2V0QXR0cmlidXRlKCJtYXhsZW5ndGgiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWF4TGVuZ3RoKGludCBtYXhMZW5ndGgpIHsKLQkJc2V0QXR0cmlidXRlKCJtYXhsZW5ndGgiLCBJbnRlZ2VyLnRvU3RyaW5nKG1heExlbmd0aCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFJlYWRPbmx5KCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJyZWFkb25seSIpOwotCQlyZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsLmxlbmd0aCgpICE9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQlzZXRBdHRyaWJ1dGUoInJlYWRvbmx5IiwgcmVhZE9ubHkgPyAicmVhZG9ubHkiIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaXplKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJzaXplIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2l6ZShTdHJpbmcgc2l6ZSkgewotCQlzZXRBdHRyaWJ1dGUoInNpemUiLCBzaXplKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNyYygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgic3JjIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3JjKFN0cmluZyBzcmMpIHsKLQkJc2V0QXR0cmlidXRlKCJzcmMiLCBzcmMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidHlwZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJc2V0QXR0cmlidXRlKCJ0eXBlIiwgdHlwZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVc2VNYXAoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInVzZW1hcCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZU1hcChTdHJpbmcgdXNlTWFwKSB7Ci0JCXNldEF0dHJpYnV0ZSgidXNlbWFwIiwgdXNlTWFwKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlzZXRBdHRyaWJ1dGUoInZhbHVlIiwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIGRvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBibHVyKCkgewotCX0KLQotCS8qKgotCSAqIGRvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmb2N1cygpIHsKLQl9Ci0KLQkvKioKLQkgKiBkb2VzIG5vdGhpbmcuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0KCkgewotCX0KLQotCS8qKgotCSAqIGRvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGljaygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSElzSW5kZXhFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSElzSW5kZXhFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNWQzMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hJc0luZGV4RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEZvcm1FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTElzSW5kZXhFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hJc0luZGV4RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxJc0luZGV4RWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNISXNJbmRleEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIEhUTUxGb3JtRWxlbWVudCBnZXRGb3JtKCkgewotCQlmb3IgKE5vZGUgcmV0ID0gZ2V0UGFyZW50Tm9kZSgpOyByZXQgIT0gbnVsbDsgcmV0ID0gcmV0LmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKHJldCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkKLQkJCQlyZXR1cm4gKEhUTUxGb3JtRWxlbWVudCkgcmV0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvbXB0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJwcm9tcHQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9tcHQoU3RyaW5nIHByb21wdCkgewotCQlzZXRBdHRyaWJ1dGUoInByb21wdCIsIHByb21wdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hMSUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NITElFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDMxMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hMSUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MTElFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hMSUVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MTElFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hMSUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlzZXRBdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldEF0dHJpYnV0ZSgidmFsdWUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IHZhbHVlKSB7Ci0JCXNldEF0dHJpYnV0ZSgidmFsdWUiLCBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hMYWJlbEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NITGFiZWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZjRmZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hMYWJlbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxGb3JtRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxMYWJlbEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSExhYmVsRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxMYWJlbEVsZW1lbnQgewotCXByb3RlY3RlZCBTSExhYmVsRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTEZvcm1FbGVtZW50IGdldEZvcm0oKSB7Ci0JCWZvciAoTm9kZSByZXQgPSBnZXRQYXJlbnROb2RlKCk7IHJldCAhPSBudWxsOyByZXQgPSByZXQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocmV0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KQotCQkJCXJldHVybiAoSFRNTEZvcm1FbGVtZW50KSByZXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBY2Nlc3NLZXkoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFjY2Vzc2tleSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc0tleShTdHJpbmcgYWNjZXNzS2V5KSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWNjZXNza2V5IiwgYWNjZXNzS2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEh0bWxGb3IoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImZvciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEh0bWxGb3IoU3RyaW5nIGh0bWxGb3IpIHsKLQkJc2V0QXR0cmlidXRlKCJmb3IiLCBodG1sRm9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSExlZ2VuZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NITGVnZW5kRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODk0MDRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NITGVnZW5kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEZvcm1FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTExlZ2VuZEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSExlZ2VuZEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MTGVnZW5kRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNITGVnZW5kRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTEZvcm1FbGVtZW50IGdldEZvcm0oKSB7Ci0JCWZvciAoTm9kZSByZXQgPSBnZXRQYXJlbnROb2RlKCk7IHJldCAhPSBudWxsOyByZXQgPSByZXQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocmV0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KQotCQkJCXJldHVybiAoSFRNTEZvcm1FbGVtZW50KSByZXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBY2Nlc3NLZXkoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFjY2Vzc2tleSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc0tleShTdHJpbmcgYWNjZXNzS2V5KSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWNjZXNza2V5IiwgYWNjZXNzS2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWduKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJhbGluZyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsaWduKFN0cmluZyBhbGlnbikgewotCQlzZXRBdHRyaWJ1dGUoImFsaWduIiwgYWxpZ24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NITGlua0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NITGlua0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzNjgzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSExpbmtFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTExpbmtFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hMaW5rRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxMaW5rRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNITGlua0VsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRpc2FibGVkOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZWQoKSB7Ci0JCXJldHVybiB0aGlzLmRpc2FibGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpc2FibGVkKGJvb2xlYW4gZGlzYWJsZWQpIHsKLQkJdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiY2hhcnNldCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoYXJzZXQoU3RyaW5nIGNoYXJzZXQpIHsKLQkJc2V0QXR0cmlidXRlKCJjaGFyc2V0IiwgY2hhcnNldCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIcmVmKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJocmVmIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcgaHJlZikgewotCQlzZXRBdHRyaWJ1dGUoImhyZWYiLCBocmVmKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWZsYW5nKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJocmVmbGFuZyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhyZWZsYW5nKFN0cmluZyBocmVmbGFuZykgewotCQlzZXRBdHRyaWJ1dGUoImhyZWZsYW5nIiwgaHJlZmxhbmcpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVkaWEoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm1lZGlhIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWVkaWEoU3RyaW5nIG1lZGlhKSB7Ci0JCXNldEF0dHJpYnV0ZSgibWVkaWEiLCBtZWRpYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZWwoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInJlbCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlbChTdHJpbmcgcmVsKSB7Ci0JCXNldEF0dHJpYnV0ZSgicmVsIiwgcmVsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJldigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgicmV2Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmV2KFN0cmluZyByZXYpIHsKLQkJc2V0QXR0cmlidXRlKCJyZXYiLCByZXYpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoU3RyaW5nIHRhcmdldCkgewotCQlzZXRBdHRyaWJ1dGUoInRhcmdldCIsIHRhcmdldCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlzZXRBdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSE1hcEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NITWFwRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2QzNDA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NITWFwRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTE1hcEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSE1hcEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MTWFwRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNITWFwRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTENvbGxlY3Rpb24gZ2V0QXJlYXMoKSB7Ci0JCXJldHVybiAoKFNIRG9jdW1lbnQpIGdldE93bmVyRG9jdW1lbnQoKSkKLQkJCQkuY3JlYXRlQ29sbGVjdGlvbihnZXRFbGVtZW50c0J5VGFnTmFtZSgiQVJFQSIpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NITWVudUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NITWVudUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhODA2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSE1lbnVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTE1lbnVFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hNZW51RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxNZW51RWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNITWVudUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29tcGFjdCgpIHsKLQkJU3RyaW5nIHZhbCA9IGdldEF0dHJpYnV0ZSgiY29tcGFjdCIpOwotCQlyZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsLmxlbmd0aCgpICE9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tcGFjdChib29sZWFuIGNvbXBhY3QpIHsKLQkJc2V0QXR0cmlidXRlKCJjb21wYWN0IiwgY29tcGFjdCA/ICJjb21wYWN0IiA6IG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NITWV0YUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NITWV0YUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3YzJlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSE1ldGFFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTE1ldGFFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hNZXRhRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxNZXRhRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNITWV0YUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjb250ZW50Iik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIdHRwRXF1aXYoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImh0dHAtZXF1aXYiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgic2NoZW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChTdHJpbmcgY29udGVudCkgewotCQlzZXRBdHRyaWJ1dGUoImNvbnRlbnQiLCBjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIdHRwRXF1aXYoU3RyaW5nIGh0dHBFcXVpdikgewotCQlzZXRBdHRyaWJ1dGUoImh0dHAtZXF1aXYiLCBodHRwRXF1aXYpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NoZW1lKFN0cmluZyBzY2hlbWUpIHsKLQkJc2V0QXR0cmlidXRlKCJzY2hlbWUiLCBzY2hlbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NITW9kRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hNb2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YWVmYTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hNb2RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTE1vZEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSE1vZEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MTW9kRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNITW9kRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENpdGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNpdGUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaXRlKFN0cmluZyBjaXRlKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY2l0ZSIsIGNpdGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0ZVRpbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImRhdGV0aW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0ZVRpbWUoU3RyaW5nIGRhdGVUaW1lKSB7Ci0JCXNldEF0dHJpYnV0ZSgiZGF0ZXRpbWUiLCBkYXRlVGltZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hPTGlzdEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIT0xpc3RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZjY3MGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hPTGlzdEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MT0xpc3RFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hPTGlzdEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MT0xpc3RFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hPTGlzdEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29tcGFjdCgpIHsKLQkJU3RyaW5nIHZhbCA9IGdldEF0dHJpYnV0ZSgiY29tcGFjdCIpOwotCQlyZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsLmxlbmd0aCgpICE9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tcGFjdChib29sZWFuIGNvbXBhY3QpIHsKLQkJc2V0QXR0cmlidXRlKCJjb21wYWN0IiwgY29tcGFjdCA/ICJjb21wYWN0IiA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZ2V0QXR0cmlidXRlKCJzdGFydCIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChpbnQgc3RhcnQpIHsKLQkJc2V0QXR0cmlidXRlKCJzdGFydCIsIEludGVnZXIudG9TdHJpbmcoc3RhcnQpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInR5cGUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXNldEF0dHJpYnV0ZSgidHlwZSIsIHR5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIT2JqZWN0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hPYmplY3RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMjQ1ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hPYmplY3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEZvcm1FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTE9iamVjdEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSE9iamVjdEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MT2JqZWN0RWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIT2JqZWN0RWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTEZvcm1FbGVtZW50IGdldEZvcm0oKSB7Ci0JCWZvciAoTm9kZSByZXQgPSBnZXRQYXJlbnROb2RlKCk7IHJldCAhPSBudWxsOyByZXQgPSByZXQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocmV0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KQotCQkJCXJldHVybiAoSFRNTEZvcm1FbGVtZW50KSByZXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2RlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjb2RlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29kZShTdHJpbmcgY29kZSkgewotCQlzZXRBdHRyaWJ1dGUoImNvZGUiLCBjb2RlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWduKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJhbGlnbiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsaWduKFN0cmluZyBhbGlnbikgewotCQlzZXRBdHRyaWJ1dGUoImFsaWduIiwgYWxpZ24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYXJjaGl2ZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFyY2hpdmUoU3RyaW5nIGFyY2hpdmUpIHsKLQkJc2V0QXR0cmlidXRlKCJhcmNoaXZlIiwgYXJjaGl2ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImJvcmRlciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJvcmRlcihTdHJpbmcgYm9yZGVyKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYm9yZGVyIiwgYm9yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvZGVCYXNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjb2RlYmFzZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvZGVCYXNlKFN0cmluZyBjb2RlQmFzZSkgewotCQlzZXRBdHRyaWJ1dGUoImNvZGViYXNlIiwgY29kZUJhc2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29kZVR5cGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNvZGV0eXBlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29kZVR5cGUoU3RyaW5nIGNvZGVUeXBlKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY29kZXR5cGUiLCBjb2RlVHlwZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJkYXRhIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgewotCQlzZXRBdHRyaWJ1dGUoImRhdGEiLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWNsYXJlKCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJkZWNsYXJlIik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWNsYXJlKGJvb2xlYW4gZGVjbGFyZSkgewotCQlzZXRBdHRyaWJ1dGUoImRlY2xhcmUiLCBkZWNsYXJlID8gImRlY2xhcmUiIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImhlaWdodCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlaWdodChTdHJpbmcgaGVpZ2h0KSB7Ci0JCXNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwgaGVpZ2h0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhzcGFjZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiaHNwYWNlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SHNwYWNlKFN0cmluZyBoc3BhY2UpIHsKLQkJc2V0QXR0cmlidXRlKCJoc3BhY2UiLCBoc3BhY2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgibmFtZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGFuZGJ5KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJzdGFuZGJ5Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhbmRieShTdHJpbmcgc3RhbmRieSkgewotCQlzZXRBdHRyaWJ1dGUoInN0YW5kYnkiLCBzdGFuZGJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZXhjZXB0aW9uIE51bWJlckZvcm1hdEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFiSW5kZXgoKSB7Ci0JCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFiSW5kZXgoaW50IHRhYkluZGV4KSB7Ci0JCXNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCBJbnRlZ2VyLnRvU3RyaW5nKHRhYkluZGV4KSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlzZXRBdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVzZU1hcCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidXNlbWFwIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXNlTWFwKFN0cmluZyB1c2VNYXApIHsKLQkJc2V0QXR0cmlidXRlKCJ1c2VtYXAiLCB1c2VNYXApOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VnNwYWNlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ2c2FwY2UiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWc3BhY2UoU3RyaW5nIHZzcGFjZSkgewotCQlzZXRBdHRyaWJ1dGUoInZzYXBjZSIsIHZzcGFjZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgid2lkdGgiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChTdHJpbmcgd2lkdGgpIHsKLQkJc2V0QXR0cmlidXRlKCJ3aWR0aCIsIHdpZHRoKTsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IGNvbnRlbnREb2M7Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0Q29udGVudERvY3VtZW50KCkgewotCQlyZXR1cm4gY29udGVudERvYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250ZW50IGRvY3VtZW50IHRoaXMgb2JqZWN0IGNvbnRhaW5zLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnREb2N1bWVudChEb2N1bWVudCBjb250ZW50RG9jKSB7Ci0JCXRoaXMuY29udGVudERvYyA9IGNvbnRlbnREb2M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hPcHRHcm91cEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIT3B0R3JvdXBFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZjkyNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hPcHRHcm91cEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MT3B0R3JvdXBFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hPcHRHcm91cEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MT3B0R3JvdXBFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hPcHRHcm91cEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZWQoKSB7Ci0JCVN0cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGUoImRpc2FibGVkIik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlZChib29sZWFuIGRpc2FibGVkKSB7Ci0JCXNldEF0dHJpYnV0ZSgiZGlzYWJsZWQiLCBkaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJsYWJlbCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQlzZXRBdHRyaWJ1dGUoImxhYmVsIiwgbGFiZWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIT3B0aW9uRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hPcHRpb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGI3MzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hPcHRpb25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRm9ybUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MT3B0aW9uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIT3B0aW9uRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxPcHRpb25FbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hPcHRpb25FbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBIVE1MRm9ybUVsZW1lbnQgZ2V0Rm9ybSgpIHsKLQkJZm9yIChOb2RlIHJldCA9IGdldFBhcmVudE5vZGUoKTsgcmV0ICE9IG51bGw7IHJldCA9IHJldC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChyZXQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpCi0JCQkJcmV0dXJuIChIVE1MRm9ybUVsZW1lbnQpIHJldDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdFNlbGVjdGVkOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFNlbGVjdGVkKCkgewotCQlyZXR1cm4gZGVmYXVsdFNlbGVjdGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTZWxlY3RlZChib29sZWFuIGRlZmF1bHRTZWxlY3RlZCkgewotCQl0aGlzLmRlZmF1bHRTZWxlY3RlZCA9IGRlZmF1bHRTZWxlY3RlZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCU5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCXJldHVybiBjaGlsZCA9PSBudWxsID8gbnVsbCA6IGNoaWxkLmdldE5vZGVWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaWYgYSBTRUxFQ1Qgbm9kZSBpcyBub3QgZm91bmQgaW4gYW5jZXN0ZXIsIC0xLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCVNIU2VsZWN0RWxlbWVudCBzZWw7Ci0JCWZvciAoTm9kZSBhbmMgPSBnZXRQYXJlbnROb2RlKCk7IGFuYyAhPSBudWxsOyBhbmMgPSBhbmMuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAoYW5jIGluc3RhbmNlb2YgU0hTZWxlY3RFbGVtZW50KSB7Ci0JCQkJc2VsID0gKFNIU2VsZWN0RWxlbWVudCkgYW5jOwotCQkJCUhUTUxDb2xsZWN0aW9uIG9wdGlvbnMgPSBzZWwuZ2V0T3B0aW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9ucy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWlmIChvcHRpb25zLml0ZW0oaSkgPT0gdGhpcykgewotCQkJCQkJcmV0dXJuIGk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpIHsKLQkJU0hTZWxlY3RFbGVtZW50IHNlbDsKLQkJZm9yIChOb2RlIGFuYyA9IGdldFBhcmVudE5vZGUoKTsgYW5jICE9IG51bGw7IGFuYyA9IGFuYy5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChhbmMgaW5zdGFuY2VvZiBTSFNlbGVjdEVsZW1lbnQpIHsKLQkJCQlzZWwgPSAoU0hTZWxlY3RFbGVtZW50KSBhbmM7Ci0JCQkJSFRNTENvbGxlY3Rpb24gb3B0aW9ucyA9IHNlbC5nZXRPcHRpb25zKCk7Ci0JCQkJaWYgKGluZGV4IDwgMCB8fCBvcHRpb25zLmdldExlbmd0aCgpIDw9IGluZGV4KQotCQkJCQlyZXR1cm47Ci0JCQkJU0hPcHRpb25FbGVtZW50IG5leHRTaWJsaW5nID0gKFNIT3B0aW9uRWxlbWVudCkgb3B0aW9ucwotCQkJCQkJLml0ZW0oaW5kZXgpOwotCQkJCU5vZGUgbmV3UGFyZW50ID0gbmV4dFNpYmxpbmcuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZCh0aGlzKTsKLQkJCQluZXdQYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMsIG5leHRTaWJsaW5nKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFNlbGVjdGVkKCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJzZWxlY3RlZCIpOwotCQlyZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsLmxlbmd0aCgpICE9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBzZWxlY3RlZCkgewotCQlzZXRBdHRyaWJ1dGUoInNlbGVjdGVkIiwgc2VsZWN0ZWQgPyAic2VsZWN0ZWQiIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZWQoKSB7Ci0JCVN0cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGUoImRpc2FibGVkIik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlZChib29sZWFuIGRpc2FibGVkKSB7Ci0JCXNldEF0dHJpYnV0ZSgiZGlzYWJsZWQiLCBkaXNhYmxlZCA/ICJkaXNhYmxlZCIgOiBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJsYWJlbCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQlzZXRBdHRyaWJ1dGUoImxhYmVsIiwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInZhbHVlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXNldEF0dHJpYnV0ZSgidmFsdWUiLCB2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hQYXJhZ3JhcGhFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFBhcmFncmFwaEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzZWE5Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFBhcmFncmFwaEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MUGFyYWdyYXBoRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIUGFyYWdyYXBoRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzCi0JCUhUTUxQYXJhZ3JhcGhFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hQYXJhZ3JhcGhFbGVtZW50KFN0cmluZyBuYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcihuYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpZ24iLCBhbGlnbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hQYXJhbUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIUGFyYW1FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjVjNjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hQYXJhbUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MUGFyYW1FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hQYXJhbUVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MUGFyYW1FbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hQYXJhbUVsZW1lbnQoU3RyaW5nIG5hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKG5hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInR5cGUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXNldEF0dHJpYnV0ZSgidHlwZSIsIHR5cGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInZhbHVlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXNldEF0dHJpYnV0ZSgidmFsdWUiLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVR5cGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInZhbHVldHlwZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlVHlwZShTdHJpbmcgdmFsdWVUeXBlKSB7Ci0JCXNldEF0dHJpYnV0ZSgidmFsdWV0eXBlIiwgdmFsdWVUeXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFByZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIUHJlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTZkMGZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIUHJlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxQcmVFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hQcmVFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTFByZUVsZW1lbnQgewotCXByb3RlY3RlZCBTSFByZUVsZW1lbnQoU3RyaW5nIG5hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKG5hbWUsIGRvYyk7Ci0JfQotCi0JLyoqCi0JICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFdpZHRoKCkgewotCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChnZXRBdHRyaWJ1dGUoIndpZHRoIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdpZHRoKGludCB3aWR0aCkgewotCQlzZXRBdHRyaWJ1dGUoIndpZHRoIiwgSW50ZWdlci50b1N0cmluZyh3aWR0aCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIUXVvdGVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFF1b3RlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2RlMjUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIUXVvdGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFF1b3RlRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIUXVvdGVFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTFF1b3RlRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIUXVvdGVFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcih0YWdOYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2l0ZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiY2l0ZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENpdGUoU3RyaW5nIGNpdGUpIHsKLQkJc2V0QXR0cmlidXRlKCJjaXRlIiwgY2l0ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hTY3JpcHRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFNjcmlwdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkMmNlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFNjcmlwdEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQ2hhcmFjdGVyRGF0YTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFNjcmlwdEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSFNjcmlwdEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MU2NyaXB0RWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIU2NyaXB0RWxlbWVudChTdHJpbmcgbmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIobmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCU5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCXJldHVybiBjaGlsZCA9PSBudWxsID8gbnVsbCA6IGNoaWxkLmdldE5vZGVWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCWFwcGVuZENoaWxkKGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDREFUQVNlY3Rpb24odGV4dCkpOwotCQl9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YSkgewotCQkJKChDaGFyYWN0ZXJEYXRhKSBjaGlsZCkuc2V0RGF0YSh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCWluc2VydEJlZm9yZShnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ0RBVEFTZWN0aW9uKHRleHQpLCBjaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEh0bWxGb3IoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImZvciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEh0bWxGb3IoU3RyaW5nIGh0bWxGb3IpIHsKLQkJc2V0QXR0cmlidXRlKCJmb3IiLCBodG1sRm9yKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEV2ZW50KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJldmVudCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV2ZW50KFN0cmluZyBldmVudCkgewotCQlzZXRBdHRyaWJ1dGUoImV2ZW50IiwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiY2hhcnNldCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoYXJzZXQoU3RyaW5nIGNoYXJzZXQpIHsKLQkJc2V0QXR0cmlidXRlKCJjaGFyc2V0IiwgY2hhcnNldCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmZXIoKSB7Ci0JCVN0cmluZyB2YWwgPSBnZXRBdHRyaWJ1dGUoImRlZmVyIik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZlcihib29sZWFuIGRlZmVyKSB7Ci0JCXNldEF0dHJpYnV0ZSgiZGVmZXIiLCBkZWZlciA/ICJkZWZlciIgOiBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNyYygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgic3JjIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3JjKFN0cmluZyBzcmMpIHsKLQkJc2V0QXR0cmlidXRlKCJzcmMiLCBzcmMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidHlwZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJc2V0QXR0cmlidXRlKCJ0eXBlIiwgdHlwZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hTZWxlY3RFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFNlbGVjdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJmYmJkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFNlbGVjdEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxPcHRpb25FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFNlbGVjdEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSFNlbGVjdEVsZW1lbnQgZXh0ZW5kcyBTSEZvcm1DdHJsRWxlbWVudCBpbXBsZW1lbnRzCi0JCUhUTUxTZWxlY3RFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hTZWxlY3RFbGVtZW50KFN0cmluZyBuYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcihuYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidHlwZSIpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJbmRleCgpIHsKLQkJTm9kZUxpc3Qgb3B0aW9ucyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJPUFRJT04iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmICgoKFNIT3B0aW9uRWxlbWVudCkgb3B0aW9ucy5pdGVtKGkpKS5nZXRTZWxlY3RlZCgpKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEluZGV4KGludCBzZWxlY3RlZEluZGV4KSB7Ci0JCU5vZGVMaXN0IG9wdGlvbnMgPSBnZXRFbGVtZW50c0J5VGFnTmFtZSgiT1BUSU9OIik7Ci0JCWlmIChzZWxlY3RlZEluZGV4IDwgMCB8fCBvcHRpb25zLmdldExlbmd0aCgpIDw9IHNlbGVjdGVkSW5kZXgpCi0JCQlyZXR1cm47Ci0JCSgoU0hPcHRpb25FbGVtZW50KSBvcHRpb25zLml0ZW0oc2VsZWN0ZWRJbmRleCkpLnNldEF0dHJpYnV0ZSgKLQkJCQkic2VsZWN0ZWQiLCAic2VsZWN0ZWQiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlOb2RlTGlzdCBvcHRpb25zID0gZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk9QVElPTiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9wdGlvbnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJU0hPcHRpb25FbGVtZW50IG9wdCA9IChTSE9wdGlvbkVsZW1lbnQpIG9wdGlvbnMuaXRlbShpKTsKLQkJCWlmIChvcHQuZ2V0U2VsZWN0ZWQoKSkgewotCQkJCXJldHVybiBvcHQuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJTm9kZUxpc3Qgb3B0aW9ucyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJPUFRJT04iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCVNIT3B0aW9uRWxlbWVudCBvcHQgPSAoU0hPcHRpb25FbGVtZW50KSBvcHRpb25zLml0ZW0oaSk7Ci0JCQlpZiAob3B0LmdldFZhbHVlKCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCW9wdC5zZXRBdHRyaWJ1dGUoInNlbGVjdGVkIiwgInNlbGVjdGVkIik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRzQnlUYWdOYW1lKCJPUFRJT04iKS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTENvbGxlY3Rpb24gZ2V0T3B0aW9ucygpIHsKLQkJTm9kZUxpc3Qgb3B0aW9ucyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJPUFRJT04iKTsKLQkJcmV0dXJuICgoU0hEb2N1bWVudCkgZ2V0T3duZXJEb2N1bWVudCgpKS5jcmVhdGVDb2xsZWN0aW9uKG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldE11bHRpcGxlKCkgewotCQlTdHJpbmcgbXVsID0gZ2V0QXR0cmlidXRlKCJtdWx0aXBsZSIpOwotCQlyZXR1cm4gbXVsICE9IG51bGwgJiYgbXVsLmxlbmd0aCgpICE9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TXVsdGlwbGUoYm9vbGVhbiBtdWx0aXBsZSkgewotCQlzZXRBdHRyaWJ1dGUoIm11bHRpcGxlIiwgbXVsdGlwbGUgPyAibXVsdGlwbGUiIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCVN0cmluZyBzaXplID0gZ2V0QXR0cmlidXRlKCJzaXplIik7Ci0JCWlmIChzaXplICE9IG51bGwgJiYgc2l6ZS5sZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHNpemUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgc2l6ZSkgewotCQlzZXRBdHRyaWJ1dGUoInNpemUiLCBJbnRlZ2VyLnRvU3RyaW5nKHNpemUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoSFRNTEVsZW1lbnQgZWxlbWVudCwgSFRNTEVsZW1lbnQgYmVmb3JlKSB7Ci0JCWlmIChiZWZvcmUgPT0gbnVsbCkgewotCQkJaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIGdldEZpcnN0Q2hpbGQoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnNlcnRCZWZvcmUoZWxlbWVudCwgYmVmb3JlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJTm9kZUxpc3Qgb3B0aW9ucyA9IGdldEVsZW1lbnRzQnlUYWdOYW1lKCJPUFRJT04iKTsKLQkJaWYgKGluZGV4IDwgMCB8fCBvcHRpb25zLmdldExlbmd0aCgpIDw9IGluZGV4KQotCQkJcmV0dXJuOwotCQlIVE1MT3B0aW9uRWxlbWVudCBvcHQgPSAoSFRNTE9wdGlvbkVsZW1lbnQpIG9wdGlvbnMuaXRlbShpbmRleCk7Ci0JCW9wdC5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQob3B0KTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIG5vdGhpbmcuCi0JICovCi0JcHVibGljIHZvaWQgYmx1cigpIHsKLQl9Ci0KLQkvKioKLQkgKiBkb2VzIG5vdGhpbmcuCi0JICovCi0JcHVibGljIHZvaWQgZm9jdXMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hTdHlsZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIU3R5bGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MTQ1ZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hTdHlsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MU3R5bGVFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hTdHlsZUVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cyBIVE1MU3R5bGVFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hTdHlsZUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhbHdheXMgZmFsc2UgKEZvciBhbiBhcHBsaWNhdGlvbiwgb3ZlcnJpZGUgdGhpcyBtZXRob2QpLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERpc2FibGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2FibGVkKGJvb2xlYW4gZGlzYWJsZWQpIHsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lZGlhKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJtZWRpYSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1lZGlhKFN0cmluZyBtZWRpYSkgewotCQlzZXRBdHRyaWJ1dGUoIm1lZGlhIiwgbWVkaWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidHlwZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJc2V0QXR0cmlidXRlKCJ0eXBlIiwgdHlwZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hUYWJsZUNhcHRpb25FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlQ2FwdGlvbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0ZjA2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlQ2FwdGlvbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MVGFibGVDYXB0aW9uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIVGFibGVDYXB0aW9uRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzCi0JCUhUTUxUYWJsZUNhcHRpb25FbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hUYWJsZUNhcHRpb25FbGVtZW50KFN0cmluZyBuYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcihuYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpZ24iLCBhbGlnbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hUYWJsZUNlbGxFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlQ2VsbEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiNTRhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlQ2VsbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MVGFibGVDZWxsRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxUYWJsZVJvd0VsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSFRhYmxlQ2VsbEVsZW1lbnQgZXh0ZW5kcyBTSEVsZW1lbnQgaW1wbGVtZW50cwotCQlIVE1MVGFibGVDZWxsRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIVGFibGVDZWxsRWxlbWVudChTdHJpbmcgbmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIobmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENlbGxJbmRleCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBIVE1MVGFibGVSb3dFbGVtZW50KSB7Ci0JCQlpbnQgcmV0ID0gMDsKLQkJCWZvciAoTm9kZSBwcmV2ID0gZ2V0UHJldmlvdXNTaWJsaW5nKCk7IHByZXYgIT0gbnVsbDsgcHJldiA9IHByZXYKLQkJCQkJLmdldFByZXZpb3VzU2libGluZygpKQotCQkJCXJldCsrOwotCQkJcmV0dXJuIHJldDsKLQkJfSBlbHNlIHsgLy8gZXJyb3IuCi0JCQlpbnQgcmV0ID0gMDsKLQkJCWZvciAoTm9kZSBwcmV2ID0gZ2V0UHJldmlvdXNTaWJsaW5nKCk7IHByZXYgIT0gbnVsbAotCQkJCQkmJiAhKHByZXYgaW5zdGFuY2VvZiBIVE1MVGFibGVSb3dFbGVtZW50KTsgcHJldiA9IHByZXYKLQkJCQkJLmdldFByZXZpb3VzU2libGluZygpKQotCQkJCXJldCsrOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENlbGxJbmRleChpbnQgY2VsbEluZGV4KSB7Ci0JCWlmIChjZWxsSW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEhUTUxUYWJsZVJvd0VsZW1lbnQpIHsKLQkJCXBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKLQkJCU5vZGVMaXN0IHNpYmxpbmdzID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChzaWJsaW5ncy5nZXRMZW5ndGgoKSA8PSBjZWxsSW5kZXgpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMsIG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMsIHNpYmxpbmdzLml0ZW0oY2VsbEluZGV4KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGVycm9yLgotCQkJTm9kZSBsZWZ0TW9zdCA9IHRoaXM7Ci0JCQlpbnQgY3VycmVudEluZGV4ID0gMDsKLQkJCWZvciAoTm9kZSBwcmV2ID0gZ2V0UHJldmlvdXNTaWJsaW5nKCk7IHByZXYgIT0gbnVsbAotCQkJCQkmJiAhKHByZXYgaW5zdGFuY2VvZiBIVE1MVGFibGVSb3dFbGVtZW50KTsgcHJldiA9IHByZXYKLQkJCQkJLmdldFByZXZpb3VzU2libGluZygpKSB7Ci0JCQkJbGVmdE1vc3QgPSBwcmV2OwotCQkJCWN1cnJlbnRJbmRleCsrOwotCQkJfQotCQkJcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpOwotCQkJTm9kZSBiZWZvcmUgPSBsZWZ0TW9zdDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2VsbEluZGV4OyBpKyspIHsKLQkJCQlOb2RlIG5leHQgPSBiZWZvcmUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCA9PSBudWxsIHx8IG5leHQgaW5zdGFuY2VvZiBIVE1MVGFibGVSb3dFbGVtZW50KSB7IC8vIG91dAotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gYm91bmRzCi0JCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUodGhpcywgbnVsbCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgewotCQkJCQliZWZvcmUgPSBiZWZvcmUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMsIGJlZm9yZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFiYnIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFiYnIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBYmJyKFN0cmluZyBhYmJyKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWJiciIsIGFiYnIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpbmciLCBhbGlnbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBeGlzKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJheGlzIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXhpcyhTdHJpbmcgYXhpcykgewotCQlzZXRBdHRyaWJ1dGUoImF4aXMiLCBheGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJnQ29sb3IoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImJnY29sb3IiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCZ0NvbG9yKFN0cmluZyBiZ0NvbG9yKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYmdjb2xvciIsIGJnQ29sb3IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2goKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNoYXIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaChTdHJpbmcgY2gpIHsKLQkJc2V0QXR0cmlidXRlKCJjaGFyIiwgY2gpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hPZmYoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNoYXJvZmYiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaE9mZihTdHJpbmcgY2hPZmYpIHsKLQkJc2V0QXR0cmlidXRlKCJjaGFyb2ZmIiwgY2hPZmYpOwotCX0KLQotCS8qKgotCSAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb2xTcGFuKCkgewotCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChnZXRBdHRyaWJ1dGUoImNvbHNwYW4iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sU3BhbihpbnQgY29sU3BhbikgewotCQlzZXRBdHRyaWJ1dGUoImNvbHNwYW4iLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbFNwYW4pKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhlYWRlcnMoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImhlYWRlcnMiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkZXJzKFN0cmluZyBoZWFkZXJzKSB7Ci0JCXNldEF0dHJpYnV0ZSgiaGVhZGVycyIsIGhlYWRlcnMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJoZWlnaHQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoU3RyaW5nIGhlaWdodCkgewotCQlzZXRBdHRyaWJ1dGUoImhlaWdodCIsIGhlaWdodCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Tm9XcmFwKCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJub3dyYXAiKTsKLQkJcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGgoKSAhPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vV3JhcChib29sZWFuIG5vV3JhcCkgewotCQlzZXRBdHRyaWJ1dGUoIm5vd3JhcCIsIG5vV3JhcCA/ICJub3dyYXAiIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFJvd1NwYW4oKSB7Ci0JCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldEF0dHJpYnV0ZSgicm93c3BhbiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSb3dTcGFuKGludCByb3dTcGFuKSB7Ci0JCXNldEF0dHJpYnV0ZSgicm93c3BhbiIsIEludGVnZXIudG9TdHJpbmcocm93U3BhbikpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInNjb3BlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7Ci0JCXNldEF0dHJpYnV0ZSgic2NvcGUiLCBzY29wZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWQWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoInZhbGlnbiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZBbGlnbihTdHJpbmcgdkFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgidmFsaWduIiwgdkFsaWduKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ3aWR0aCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdpZHRoKFN0cmluZyB3aWR0aCkgewotCQlzZXRBdHRyaWJ1dGUoIndpZHRoIiwgd2lkdGgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIVGFibGVDb2xFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlQ29sRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWE0NDU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIVGFibGVDb2xFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFRhYmxlQ29sRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIVGFibGVDb2xFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTFRhYmxlQ29sRWxlbWVudCB7Ci0JcHJvdGVjdGVkIFNIVGFibGVDb2xFbGVtZW50KFN0cmluZyBuYW1lLCBTSERvY3VtZW50IGRvYykgewotCQlzdXBlcihuYW1lLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpZ24iLCBhbGlnbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDaCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiY2hhciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoKFN0cmluZyBjaCkgewotCQlzZXRBdHRyaWJ1dGUoImNoYXIiLCBjaCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDaE9mZigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiY2hhcm9mZiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoT2ZmKFN0cmluZyBjaE9mZikgewotCQlzZXRBdHRyaWJ1dGUoImNoYXJvZmYiLCBjaE9mZik7Ci0JfQotCi0JLyoqCi0JICogQGV4Y2VwdGlvbiBOdW1iZXJGb3JtYXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNwYW4oKSB7Ci0JCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldEF0dHJpYnV0ZSgic3BhbiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGFuKGludCBzcGFuKSB7Ci0JCXNldEF0dHJpYnV0ZSgic3BhbiIsIEludGVnZXIudG9TdHJpbmcoc3BhbikpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VkFsaWduKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ2YWxpZ24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWQWxpZ24oU3RyaW5nIHZBbGlnbikgewotCQlzZXRBdHRyaWJ1dGUoInZhbGlnbiIsIHZBbGlnbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgid2lkdGgiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChTdHJpbmcgd2lkdGgpIHsKLQkJc2V0QXR0cmlidXRlKCJ3aWR0aCIsIHdpZHRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hUYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiY2MxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MVGFibGVDYXB0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxUYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MVGFibGVSb3dFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSFRhYmxlRWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxUYWJsZUVsZW1lbnQgewotCXByb3RlY3RlZCBTSFRhYmxlRWxlbWVudChTdHJpbmcgbmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIobmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQgZ2V0Q2FwdGlvbigpIHsKLQkJZm9yIChOb2RlIHJldCA9IGdldEZpcnN0Q2hpbGQoKTsgcmV0ICE9IG51bGw7IHJldCA9IHJldAotCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAocmV0IGluc3RhbmNlb2YgSFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKEhUTUxUYWJsZUNhcHRpb25FbGVtZW50KSByZXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FwdGlvbihIVE1MVGFibGVDYXB0aW9uRWxlbWVudCBjYXB0aW9uKSB7Ci0JCWluc2VydEJlZm9yZShjYXB0aW9uLCBnZXRGaXJzdENoaWxkKCkpOwotCX0KLQotCXB1YmxpYyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCBnZXRUSGVhZCgpIHsKLQkJZm9yIChOb2RlIHJldCA9IGdldEZpcnN0Q2hpbGQoKTsgcmV0ICE9IG51bGw7IHJldCA9IHJldAotCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAocmV0IGluc3RhbmNlb2YgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQKLQkJCQkJJiYgcmV0LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiVEhFQUQiKSkgewotCQkJCXJldHVybiAoSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQpIHJldDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUSGVhZChIVE1MVGFibGVTZWN0aW9uRWxlbWVudCB0SGVhZCkgewotCQlmb3IgKE5vZGUgYWZ0ZXIgPSBnZXRGaXJzdENoaWxkKCk7IGFmdGVyICE9IG51bGw7IGFmdGVyID0gYWZ0ZXIKLQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGFmdGVyIGluc3RhbmNlb2YgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQpIHsKLQkJCQlpbnNlcnRCZWZvcmUodEhlYWQsIGFmdGVyKTsKLQkJCX0KLQkJfQotCQlpbnNlcnRCZWZvcmUodEhlYWQsIGdldExhc3RDaGlsZCgpKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgZ2V0VEZvb3QoKSB7Ci0JCWZvciAoTm9kZSByZXQgPSBnZXRGaXJzdENoaWxkKCk7IHJldCAhPSBudWxsOyByZXQgPSByZXQKLQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKHJldCBpbnN0YW5jZW9mIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Ci0JCQkJCSYmIHJldC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoIlRGT09UIikpIHsKLQkJCQlyZXR1cm4gKEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KSByZXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VEZvb3QoSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgdEZvb3QpIHsKLQkJZm9yIChOb2RlIGFmdGVyID0gZ2V0Rmlyc3RDaGlsZCgpOyBhZnRlciAhPSBudWxsOyBhZnRlciA9IGFmdGVyCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChhZnRlciBpbnN0YW5jZW9mIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Ci0JCQkJCSYmIGFmdGVyLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiVEJPRFkiKSkgewotCQkJCWluc2VydEJlZm9yZSh0Rm9vdCwgYWZ0ZXIpOwotCQkJfQotCQl9Ci0JCWluc2VydEJlZm9yZSh0Rm9vdCwgZ2V0TGFzdENoaWxkKCkpOwotCX0KLQotCXB1YmxpYyBIVE1MQ29sbGVjdGlvbiBnZXRSb3dzKCkgewotCQlpbnQgbGVuID0gMDsKLQkJSFRNTFRhYmxlUm93RWxlbWVudCByb3dzW10gPSBuZXcgSFRNTFRhYmxlUm93RWxlbWVudFsxNl07Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZAotCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudCkgewotCQkJCWZvciAoTm9kZSByb3cgPSBjaGlsZC5nZXRGaXJzdENoaWxkKCk7IHJvdyAhPSBudWxsOyByb3cgPSByb3cKLQkJCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWlmIChyb3cgaW5zdGFuY2VvZiBIVE1MVGFibGVSb3dFbGVtZW50KSB7Ci0JCQkJCQlpZiAocm93cy5sZW5ndGggPT0gbGVuKSB7Ci0JCQkJCQkJSFRNTFRhYmxlUm93RWxlbWVudCBidWZbXSA9IG5ldyBIVE1MVGFibGVSb3dFbGVtZW50W2xlbiAqIDJdOwotCQkJCQkJCVN5c3RlbS5hcnJheWNvcHkocm93cywgMCwgYnVmLCAwLCBsZW4pOwotCQkJCQkJCXJvd3MgPSBidWY7Ci0JCQkJCQl9Ci0JCQkJCQlyb3dzW2xlbisrXSA9IChIVE1MVGFibGVSb3dFbGVtZW50KSByb3c7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgSFRNTFRhYmxlUm93RWxlbWVudCkgewotCQkJCWlmIChyb3dzLmxlbmd0aCA9PSBsZW4pIHsKLQkJCQkJSFRNTFRhYmxlUm93RWxlbWVudCBidWZbXSA9IG5ldyBIVE1MVGFibGVSb3dFbGVtZW50W2xlbiAqIDJdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHJvd3MsIDAsIGJ1ZiwgMCwgbGVuKTsKLQkJCQkJcm93cyA9IGJ1ZjsKLQkJCQl9Ci0JCQkJcm93c1tsZW4rK10gPSAoSFRNTFRhYmxlUm93RWxlbWVudCkgY2hpbGQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICgoU0hEb2N1bWVudCkgZ2V0T3duZXJEb2N1bWVudCgpKS5jcmVhdGVDb2xsZWN0aW9uKHJvd3MsIGxlbik7Ci0JfQotCi0JcHVibGljIEhUTUxDb2xsZWN0aW9uIGdldFRCb2RpZXMoKSB7Ci0JCWludCBsZW4gPSAwOwotCQlIVE1MVGFibGVTZWN0aW9uRWxlbWVudCB0Ym9kaWVzW10gPSBuZXcgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnRbMTZdOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQKLQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQKLQkJCQkJJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJUQk9EWSIpKSB7Ci0JCQkJaWYgKHRib2RpZXMubGVuZ3RoID09IGxlbikgewotCQkJCQlIVE1MVGFibGVTZWN0aW9uRWxlbWVudCBidWZbXSA9IG5ldyBIVE1MVGFibGVTZWN0aW9uRWxlbWVudFtsZW4gKiAyXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weSh0Ym9kaWVzLCAwLCBidWYsIDAsIGxlbik7Ci0JCQkJCXRib2RpZXMgPSBidWY7Ci0JCQkJfQotCQkJCXRib2RpZXNbbGVuKytdID0gKEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KSBjaGlsZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKChTSERvY3VtZW50KSBnZXRPd25lckRvY3VtZW50KCkpLmNyZWF0ZUNvbGxlY3Rpb24odGJvZGllcywgbGVuKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWduKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJhbGlnbiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsaWduKFN0cmluZyBhbGlnbikgewotCQlzZXRBdHRyaWJ1dGUoImFsaWduIiwgYWxpZ24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmdDb2xvcigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYmdjb2xvciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJnQ29sb3IoU3RyaW5nIGJnQ29sb3IpIHsKLQkJc2V0QXR0cmlidXRlKCJiZ2NvbG9yIiwgYmdDb2xvcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXIoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImJvcmRlciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJvcmRlcihTdHJpbmcgYm9yZGVyKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYm9yZGVyIiwgYm9yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENlbGxQYWRkaW5nKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjZWxscGFkZGluZyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENlbGxQYWRkaW5nKFN0cmluZyBjZWxsUGFkZGluZykgewotCQlzZXRBdHRyaWJ1dGUoImNlbGxwYWRkaW5nIiwgY2VsbFBhZGRpbmcpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2VsbFNwYWNpbmcoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImNlbGxzcGFjaW5nIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2VsbFNwYWNpbmcoU3RyaW5nIGNlbGxTcGFjaW5nKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY2VsbHNwYWNpbmciLCBjZWxsU3BhY2luZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGcmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiZnJhbWUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGcmFtZShTdHJpbmcgZnJhbWUpIHsKLQkJc2V0QXR0cmlidXRlKCJmcmFtZSIsIGZyYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bGVzKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJydWxlcyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJ1bGVzKFN0cmluZyBydWxlcykgewotCQlzZXRBdHRyaWJ1dGUoInJ1bGVzIiwgcnVsZXMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgic3VtbWFyeSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN1bW1hcnkoU3RyaW5nIHN1bW1hcnkpIHsKLQkJc2V0QXR0cmlidXRlKCJzdW1tYXJ5Iiwgc3VtbWFyeSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgid2lkdGgiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChTdHJpbmcgd2lkdGgpIHsKLQkJc2V0QXR0cmlidXRlKCJ3aWR0aCIsIHdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVzIGEgVEhFQUQgZWxlbWVudCB3aG9zZSB0YWduYW1lIGlzIHVwcGVyY2FzZWQuCi0JICovCi0JcHVibGljIEhUTUxFbGVtZW50IGNyZWF0ZVRIZWFkKCkgewotCQlyZXR1cm4gKEhUTUxFbGVtZW50KSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgiVEhFQUQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVUSGVhZCgpIHsKLQkJZm9yIChOb2RlIHRIZWFkID0gZ2V0Rmlyc3RDaGlsZCgpOyB0SGVhZCAhPSBudWxsOyB0SGVhZCA9IHRIZWFkCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmICh0SGVhZCBpbnN0YW5jZW9mIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Ci0JCQkJCSYmIHRIZWFkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiVEhFQUQiKSkgewotCQkJCXJlbW92ZUNoaWxkKHRIZWFkKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVzIGEgVEZPT1QgZWxlbWVudCB3aG9zZSB0YWduYW1lIGlzIHVwcGVyY2FzZWQuCi0JICovCi0JcHVibGljIEhUTUxFbGVtZW50IGNyZWF0ZVRGb290KCkgewotCQlyZXR1cm4gKEhUTUxFbGVtZW50KSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgiVEZPT1QiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVURm9vdCgpIHsKLQkJZm9yIChOb2RlIHRGb290ID0gZ2V0Rmlyc3RDaGlsZCgpOyB0Rm9vdCAhPSBudWxsOyB0Rm9vdCA9IHRGb290Ci0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmICh0Rm9vdCBpbnN0YW5jZW9mIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Ci0JCQkJCSYmIHRGb290LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiVEZPT1QiKSkgewotCQkJCXJlbW92ZUNoaWxkKHRGb290KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVzIGEgQ0FQVElPTiBlbGVtZW50IHdob3NlIHRhZ25hbWUgaXMgdXBwZXJjYXNlZC4KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnQgY3JlYXRlQ2FwdGlvbigpIHsKLQkJcmV0dXJuIChIVE1MRWxlbWVudCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoIkNBUFRJT04iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVDYXB0aW9uKCkgewotCQlmb3IgKE5vZGUgY2FwdGlvbiA9IGdldEZpcnN0Q2hpbGQoKTsgY2FwdGlvbiAhPSBudWxsOyBjYXB0aW9uID0gY2FwdGlvbgotCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2FwdGlvbiBpbnN0YW5jZW9mIEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50Ci0JCQkJCSYmIGNhcHRpb24uZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJDQVBUSU9OIikpIHsKLQkJCQlyZW1vdmVDaGlsZChjYXB0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRzIGEgbmV3IGVtcHR5IHJvdyB3aG9zZSB0YWduYW1lIGlzIHVwcGVyY2FzZWQuCi0JICovCi0JcHVibGljIEhUTUxFbGVtZW50IGluc2VydFJvdyhpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiBudWxsOwotCQlIVE1MQ29sbGVjdGlvbiByb3dzID0gZ2V0Um93cygpOwotCQlpZiAocm93cy5nZXRMZW5ndGgoKSA8PSBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlOb2RlIGFmdGVyID0gcm93cy5pdGVtKGluZGV4KTsKLQkJCU5vZGUgcGFyZW50ID0gYWZ0ZXIuZ2V0UGFyZW50Tm9kZSgpOwotCQkJSFRNTEVsZW1lbnQgcmV0ID0gKEhUTUxFbGVtZW50KSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgKLQkJCQkJIlRSIik7Ci0JCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJldCwgYWZ0ZXIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZVJvdyhpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJSFRNTENvbGxlY3Rpb24gcm93cyA9IGdldFJvd3MoKTsKLQkJaWYgKHJvd3MuZ2V0TGVuZ3RoKCkgPD0gaW5kZXgpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcm93ID0gcm93cy5pdGVtKGluZGV4KTsKLQkJcm93LmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChyb3cpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIVGFibGVSb3dFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlUm93RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzIzNDcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIVGFibGVSb3dFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxUYWJsZUNlbGxFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFRhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxUYWJsZVJvd0VsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSFRhYmxlUm93RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxUYWJsZVJvd0VsZW1lbnQgewotCXByb3RlY3RlZCBTSFRhYmxlUm93RWxlbWVudChTdHJpbmcgbmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIobmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFJvd0luZGV4KCkgewotCQlOb2RlIHRhYmxlID0gZ2V0UGFyZW50Tm9kZSgpLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHRhYmxlIGluc3RhbmNlb2YgSFRNTFRhYmxlRWxlbWVudCkgewotCQkJSFRNTENvbGxlY3Rpb24gcm93cyA9ICgoSFRNTFRhYmxlRWxlbWVudCkgdGFibGUpLmdldFJvd3MoKTsKLQkJCWZvciAoaW50IHJldCA9IDA7IHJldCA8IHJvd3MuZ2V0TGVuZ3RoKCk7IHJldCsrKSB7Ci0JCQkJaWYgKHJvd3MuaXRlbShyZXQpID09IHRoaXMpCi0JCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgRE9NIEltcGxlbWVudGF0aW9uIEVycm9yLiIpOwotCQl9IGVsc2UgeyAvLyBpbnZhbGlkIGRvbSBzdHJ1Y3R1cmUuCi0JCQlpbnQgcmV0ID0gMDsKLQkJCWZvciAoTm9kZSBwcmV2ID0gZ2V0UHJldmlvdXNTaWJsaW5nKCk7IHByZXYgIT0gbnVsbDsgcHJldiA9IHByZXYKLQkJCQkJLmdldFByZXZpb3VzU2libGluZygpKSB7Ci0JCQkJaWYgKHByZXYgaW5zdGFuY2VvZiBIVE1MVGFibGVSb3dFbGVtZW50KQotCQkJCQlyZXQrKzsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSb3dJbmRleChpbnQgcm93SW5kZXgpIHsKLQkJaWYgKHJvd0luZGV4IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZSB0YWJsZSA9IGdldFBhcmVudE5vZGUoKS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmICh0YWJsZSBpbnN0YW5jZW9mIEhUTUxUYWJsZUVsZW1lbnQpIHsKLQkJCWdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZCh0aGlzKTsKLQkJCUhUTUxDb2xsZWN0aW9uIHJvd3MgPSAoKEhUTUxUYWJsZUVsZW1lbnQpIHRhYmxlKS5nZXRSb3dzKCk7Ci0JCQlpZiAocm93cy5nZXRMZW5ndGgoKSA8IHJvd0luZGV4KQotCQkJCXJldHVybjsKLQkJCU5vZGUgYWZ0ZXIgPSByb3dzLml0ZW0ocm93SW5kZXgpOwotCQkJTm9kZSBuZXdQYXJlbnQgPSBhZnRlci5nZXRQYXJlbnROb2RlKCk7Ci0JCQluZXdQYXJlbnQuaW5zZXJ0QmVmb3JlKHRoaXMsIGFmdGVyKTsKLQkJfSBlbHNlIHsgLy8gaW52YWxpZCBkb20gc3RydWN0dXJlLgotCQkJTm9kZSBhZnRlciA9IGdldFBhcmVudE5vZGUoKS5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpbnQgY291bnQgPSAwOwotCQkJd2hpbGUgKGNvdW50IDwgcm93SW5kZXggJiYgYWZ0ZXIgIT0gbnVsbCkgewotCQkJCWlmIChhZnRlciBpbnN0YW5jZW9mIEhUTUxUYWJsZVJvd0VsZW1lbnQpIHsKLQkJCQkJY291bnQrKzsKLQkJCQl9Ci0JCQkJYWZ0ZXIgPSBhZnRlci5nZXROZXh0U2libGluZygpOwotCQkJfQotCQkJaWYgKGFmdGVyID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKHRoaXMpOwotCQkJYWZ0ZXIuZ2V0UGFyZW50Tm9kZSgpLmluc2VydEJlZm9yZSh0aGlzLCBhZnRlcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNlY3Rpb25Sb3dJbmRleCgpIHsKLQkJaW50IHJldCA9IDA7Ci0JCWZvciAoTm9kZSBwcmV2ID0gZ2V0UHJldmlvdXNTaWJsaW5nKCk7IHByZXYgIT0gbnVsbDsgcHJldiA9IHByZXYKLQkJCQkuZ2V0UHJldmlvdXNTaWJsaW5nKCkpIHsKLQkJCWlmIChwcmV2IGluc3RhbmNlb2YgSFRNTFRhYmxlUm93RWxlbWVudCkgewotCQkJCXJldCsrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VjdGlvblJvd0luZGV4KGludCBzZWN0aW9uUm93SW5kZXgpIHsKLQkJaWYgKHNlY3Rpb25Sb3dJbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCU5vZGUgYWZ0ZXIgPSBnZXRQYXJlbnROb2RlKCkuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoY291bnQgPCBzZWN0aW9uUm93SW5kZXggJiYgYWZ0ZXIgIT0gbnVsbCkgewotCQkJaWYgKGFmdGVyIGluc3RhbmNlb2YgSFRNTFRhYmxlUm93RWxlbWVudCkgewotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCQlhZnRlciA9IGFmdGVyLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJaWYgKGFmdGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZCh0aGlzKTsKLQkJYWZ0ZXIuZ2V0UGFyZW50Tm9kZSgpLmluc2VydEJlZm9yZSh0aGlzLCBhZnRlcik7Ci0JfQotCi0JcHVibGljIEhUTUxDb2xsZWN0aW9uIGdldENlbGxzKCkgewotCQlpbnQgbGVuID0gMDsKLQkJSFRNTFRhYmxlQ2VsbEVsZW1lbnQgY2VsbHNbXSA9IG5ldyBIVE1MVGFibGVDZWxsRWxlbWVudFs4XTsKLQkJZm9yIChOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEhUTUxUYWJsZUNlbGxFbGVtZW50KSB7Ci0JCQkJaWYgKGNlbGxzLmxlbmd0aCA9PSBsZW4pIHsKLQkJCQkJSFRNTFRhYmxlQ2VsbEVsZW1lbnQgYnVmW10gPSBuZXcgSFRNTFRhYmxlQ2VsbEVsZW1lbnRbbGVuICogMl07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoY2VsbHMsIDAsIGJ1ZiwgMCwgbGVuKTsKLQkJCQkJY2VsbHMgPSBidWY7Ci0JCQkJfQotCQkJCWNlbGxzW2xlbisrXSA9IChIVE1MVGFibGVDZWxsRWxlbWVudCkgY2hpbGQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICgoU0hEb2N1bWVudCkgZ2V0T3duZXJEb2N1bWVudCgpKS5jcmVhdGVDb2xsZWN0aW9uKGNlbGxzLCBsZW4pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENlbGxzKEhUTUxDb2xsZWN0aW9uIGNlbGxzKSB7Ci0JCXdoaWxlIChoYXNDaGlsZE5vZGVzKCkpCi0JCQlyZW1vdmVDaGlsZChnZXRGaXJzdENoaWxkKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNlbGxzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWluc2VydEJlZm9yZShjZWxscy5pdGVtKGkpLCBudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ24oKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoImFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0JCXNldEF0dHJpYnV0ZSgiYWxpZ24iLCBhbGlnbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCZ0NvbG9yKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJiZ2NvbG9yIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmdDb2xvcihTdHJpbmcgYmdDb2xvcikgewotCQlzZXRBdHRyaWJ1dGUoImJnY29sb3IiLCBiZ0NvbG9yKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENoKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjaGFyIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2goU3RyaW5nIGNoKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY2hhciIsIGNoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENoT2ZmKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjaGFyb2ZmIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hPZmYoU3RyaW5nIGNoT2ZmKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY2hhcm9mZiIsIGNoT2ZmKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZBbGlnbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidmFsaW5nIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VkFsaWduKFN0cmluZyB2QWxpZ24pIHsKLQkJc2V0QXR0cmlidXRlKCJ2YWxpbmciLCB2QWxpZ24pOwotCX0KLQotCS8qKgotCSAqIEluc2VydCBhbiBlbXB0eSA8Y29kZT5URDwvY29kZT4gY2VsbCB3aG9zZSB0YWduYW1lIGlzIHVwcGVyY2FzZWQgaW50bwotCSAqIHRoaXMgcm93LgotCSAqLwotCXB1YmxpYyBIVE1MRWxlbWVudCBpbnNlcnRDZWxsKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgYWZ0ZXIgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBpbmRleCAmJiBhZnRlciAhPSBudWxsKSB7Ci0JCQlhZnRlciA9IGFmdGVyLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpKys7Ci0JCX0KLQkJaWYgKGFmdGVyID09IG51bGwgJiYgaSAhPSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUhUTUxFbGVtZW50IHJldCA9IChIVE1MRWxlbWVudCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoIlREIik7Ci0JCWluc2VydEJlZm9yZShyZXQsIGFmdGVyKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVDZWxsKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlIHRhcmdldCA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7Ci0JCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCXJlbW92ZUNoaWxkKHRhcmdldCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hUYWJsZVNlY3Rpb25FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlU2VjdGlvbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhOGM4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFRhYmxlU2VjdGlvbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uaHRtbC5IVE1MQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFRhYmxlUm93RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxUYWJsZVNlY3Rpb25FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU0hUYWJsZVNlY3Rpb25FbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMKLQkJSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgewotCXByb3RlY3RlZCBTSFRhYmxlU2VjdGlvbkVsZW1lbnQoU3RyaW5nIG5hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKG5hbWUsIGRvYyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbGlnbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWxpZ24iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGlnbihTdHJpbmcgYWxpZ24pIHsKLQkJc2V0QXR0cmlidXRlKCJhbGlnbiIsIGFsaWduKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENoKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjaGFyIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2goU3RyaW5nIGNoKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY2hhciIsIGNoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENoT2ZmKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJjaGFyb2ZmIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hPZmYoU3RyaW5nIGNoT2ZmKSB7Ci0JCXNldEF0dHJpYnV0ZSgiY2hhcm9mZiIsIGNoT2ZmKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZBbGlnbigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgidmFsaWduIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VkFsaWduKFN0cmluZyB2QWxpZ24pIHsKLQkJc2V0QXR0cmlidXRlKCJ2YWxpZ24iLCB2QWxpZ24pOwotCX0KLQotCXB1YmxpYyBIVE1MQ29sbGVjdGlvbiBnZXRSb3dzKCkgewotCQlpbnQgbGVuID0gMDsKLQkJSFRNTFRhYmxlUm93RWxlbWVudCByb3dzW10gPSBuZXcgSFRNTFRhYmxlUm93RWxlbWVudFs4XTsKLQkJZm9yIChOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEhUTUxUYWJsZVJvd0VsZW1lbnQpIHsKLQkJCQlpZiAocm93cy5sZW5ndGggPT0gbGVuKSB7Ci0JCQkJCUhUTUxUYWJsZVJvd0VsZW1lbnQgYnVmW10gPSBuZXcgSFRNTFRhYmxlUm93RWxlbWVudFtsZW4gKiAyXTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShyb3dzLCAwLCBidWYsIDAsIGxlbik7Ci0JCQkJCXJvd3MgPSBidWY7Ci0JCQkJfQotCQkJCXJvd3NbbGVuKytdID0gKEhUTUxUYWJsZVJvd0VsZW1lbnQpIGNoaWxkOwotCQkJfQotCQl9Ci0JCXJldHVybiAoKFNIRG9jdW1lbnQpIGdldE93bmVyRG9jdW1lbnQoKSkuY3JlYXRlQ29sbGVjdGlvbihyb3dzLCBsZW4pOwotCX0KLQotCS8qKgotCSAqIGluc2VydHMgYSBuZXcgcm93IGVsZW1lbnQgd2hvc2UgdGFnIG5hbWUgaXMgdXBwZXJjYXNlZC4KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnQgaW5zZXJ0Um93KGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpID0gMDsKLQkJZm9yIChOb2RlIGFmdGVyID0gZ2V0Rmlyc3RDaGlsZCgpOyBhZnRlciAhPSBudWxsOyBhZnRlciA9IGFmdGVyCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChpID09IGluZGV4KSB7Ci0JCQkJSFRNTEVsZW1lbnQgcmV0ID0gKEhUTUxFbGVtZW50KSBnZXRPd25lckRvY3VtZW50KCkKLQkJCQkJCS5jcmVhdGVFbGVtZW50KCJUUiIpOwotCQkJCWluc2VydEJlZm9yZShyZXQsIGFmdGVyKTsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfSBlbHNlIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQkJaWYgKGkgPT0gMCkgewotCQkJSFRNTEVsZW1lbnQgcmV0ID0gKEhUTUxFbGVtZW50KSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgKLQkJCQkJIlRSIik7Ci0JCQlpbnNlcnRCZWZvcmUocmV0LCBudWxsKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlUm93KGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZAotCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoaSA9PSBpbmRleCkgewotCQkJCXJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWkrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hUZXh0QXJlYUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9pbXBsL1NIVGV4dEFyZWFFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1N2UzODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hUZXh0QXJlYUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFRleHRBcmVhRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIVGV4dEFyZWFFbGVtZW50IGV4dGVuZHMgU0hGb3JtQ3RybEVsZW1lbnQgaW1wbGVtZW50cwotCQlIVE1MVGV4dEFyZWFFbGVtZW50IHsKLQlwcm90ZWN0ZWQgU0hUZXh0QXJlYUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIFNIRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIGRvYyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlOwotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc0tleSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZSgiYWNjZXNza2V5Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzS2V5KFN0cmluZyBhY2Nlc3NLZXkpIHsKLQkJc2V0QXR0cmlidXRlKCJhY2Nlc3NrZXkiLCBhY2Nlc3NLZXkpOwotCX0KLQotCS8qKgotCSAqIEBleGNlcHRpb24gTnVtYmVyRm9ybWF0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb2xzKCkgewotCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChnZXRBdHRyaWJ1dGUoImNvbHMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29scyhpbnQgY29scykgewotCQlzZXRBdHRyaWJ1dGUoImNvbHMiLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbHMpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRSZWFkT25seSgpIHsKLQkJU3RyaW5nIHZhbCA9IGdldEF0dHJpYnV0ZSgicmVhZG9ubHkiKTsKLQkJcmV0dXJuIHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGgoKSAhPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJc2V0QXR0cmlidXRlKCJyZWFkb25seSIsIHJlYWRPbmx5ID8gInJlYWRvbmx5IiA6IG51bGwpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Um93cygpIHsKLQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZ2V0QXR0cmlidXRlKCJyb3dzIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvd3MoaW50IHJvd3MpIHsKLQkJc2V0QXR0cmlidXRlKCJyb3dzIiwgSW50ZWdlci50b1N0cmluZyhyb3dzKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gInRleHRhcmVhIjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nLiBPdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBibHVyKCkgewotCX0KLQotCS8qKgotCSAqIERvZXMgbm90aGluZy4gT3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgZm9jdXMoKSB7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nLiBPdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3QoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFRpdGxlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hUaXRsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EyZjg3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFRpdGxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmh0bWwuSFRNTFRpdGxlRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNIVGl0bGVFbGVtZW50IGV4dGVuZHMgU0hFbGVtZW50IGltcGxlbWVudHMgSFRNTFRpdGxlRWxlbWVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgdG1wUyA9ICIiOwotCQlpZiAoaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlOb2RlIGZpcnN0Q2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoZmlyc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJdG1wUyA9IGdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdG1wUzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWJvb2xlYW4gZmxhZyA9IGZhbHNlOwotCQlpZiAoaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlOb2RlIGZpcnN0Q2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoZmlyc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJZmlyc3RDaGlsZC5zZXROb2RlVmFsdWUodGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCWZsYWcgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJZmxhZyA9IHRydWU7Ci0JCX0KLQkJaWYgKGZsYWcpIHsKLQkJCWluc2VydEJlZm9yZShnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoInRleHQiKSwKLQkJCQkJZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTSFRpdGxlRWxlbWVudChTdHJpbmcgdGFnTmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIodGFnTmFtZSwgZG9jKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFVMaXN0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL2ltcGwvU0hVTGlzdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM2OGIyNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvaW1wbC9TSFVMaXN0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxVTGlzdEVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTSFVMaXN0RWxlbWVudCBleHRlbmRzIFNIRWxlbWVudCBpbXBsZW1lbnRzIEhUTUxVTGlzdEVsZW1lbnQgewotCXByb3RlY3RlZCBTSFVMaXN0RWxlbWVudChTdHJpbmcgbmFtZSwgU0hEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIobmFtZSwgZG9jKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb21wYWN0KCkgewotCQlTdHJpbmcgdmFsID0gZ2V0QXR0cmlidXRlKCJjb21wYWN0Iik7Ci0JCXJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wYWN0KGJvb2xlYW4gY29tcGFjdCkgewotCQlzZXRBdHRyaWJ1dGUoImNvbXBhY3QiLCBjb21wYWN0ID8gImNvbXBhY3QiIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlzZXRBdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvcGFyc2VyL0NoYXJzZXRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvcGFyc2VyL0NoYXJzZXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MTY0ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL3BhcnNlci9DaGFyc2V0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSUhUTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC51dGlsLlJlcmVhZGFibGVJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmltcGwuRGVmYXVsdERvY3VtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIFdhdGNoIGEgZWxlbWVudCB0aGF0IHNwZWNpZnkgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBkb2N1bWVudC4gSWYKLSAqIDxjb2RlPiAmbHQ7TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD14eHgiJmd0OwotICogYXBwZWFycyBpbiBhIGRvY3VtZW50LCB0aGlzIG1ldGhvZCBjaGFuZ2VzIGNoYXJhY3RlciBlbmNvZGluZy4KLSAqLwotcHVibGljIGNsYXNzIENoYXJzZXRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdERvY3VtZW50SGFuZGxlciB7Ci0JcHJpdmF0ZSBSZXJlYWRhYmxlSW5wdXRTdHJlYW0gcmlzOwotCi0JcHVibGljIENoYXJzZXRIYW5kbGVyKEhUTUxQYXJzZXIgcGFyc2VyLCBSZXJlYWRhYmxlSW5wdXRTdHJlYW0gcmlzKSB7Ci0JCXN1cGVyKHBhcnNlcik7Ci0JCXRoaXMucmlzID0gcmlzOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlTGlzdCBhdHRzKQotCQkJdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIk1FVEEiKSkgewotCQkJU3RyaW5nIGh0dHBFcXVpdiA9IG51bGw7Ci0JCQlTdHJpbmcgY29udGVudCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCW5hbWUgPSBhdHRzLmdldE5hbWUoaSk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiaHR0cC1lcXVpdiIpKSB7Ci0JCQkJCWh0dHBFcXVpdiA9IGF0dHMuZ2V0VmFsdWUoaSk7Ci0JCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImNvbnRlbnQiKSkgewotCQkJCQljb250ZW50ID0gYXR0cy5nZXRWYWx1ZShpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaHR0cEVxdWl2ID09IG51bGwgfHwgY29udGVudCA9PSBudWxsKSB7Ci0JCQkJc3VwZXIuc3RhcnRFbGVtZW50KG5hbWUsIGF0dHMpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChodHRwRXF1aXYuZXF1YWxzSWdub3JlQ2FzZSgiQ29udGVudC1UeXBlIikpIHsKLQkJCQlpbnQgY2hhcnNldEluZGV4ID0gY29udGVudC5pbmRleE9mKCJjaGFyc2V0PSIpOwotCQkJCWlmIChjaGFyc2V0SW5kZXggPT0gLTEpIHsKLQkJCQkJY2hhcnNldEluZGV4ID0gY29udGVudC5pbmRleE9mKCJDSEFSU0VUPSIpOwotCQkJCX0KLQkJCQlpZiAoY2hhcnNldEluZGV4ICE9IC0xKSB7Ci0JCQkJCVN0cmluZyBlbmNvZGluZyA9IGNvbnRlbnQuc3Vic3RyaW5nKGNoYXJzZXRJbmRleAotCQkJCQkJCSsgImNoYXJzZXQ9Ii5sZW5ndGgoKSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJbnB1dFN0cmVhbVJlYWRlciBuZXdSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCi0JCQkJCQkJCXRoaXMucmlzLCBlbmNvZGluZyk7Ci0JCQkJCQlpZiAoKChJSFRNTFBhcnNlcikgcGFyc2VyKS5nZXRFbmNvZGluZygpID09IG51bGwpIHsKLQkJCQkJCQkoKEhUTUxQYXJzZXIpIHBhcnNlcikuc2V0RW5jb2RpbmcoZW5jb2RpbmcpOwotCQkJCQkJfQotCQkJCQkJZW5jb2RpbmcgPSBuZXdSZWFkZXIuZ2V0RW5jb2RpbmcoKTsKLQkJCQkJCVN0cmluZyBwcmV2RW5jb2RpbmcgPSAoKEhUTUxQYXJzZXIpIHBhcnNlcikKLQkJCQkJCQkJLmdldElTUmVhZGVyKCkuZ2V0RW5jb2RpbmcoKTsKLQkJCQkJCWlmIChwcmV2RW5jb2RpbmcuZXF1YWxzKGVuY29kaW5nKSkgewotCQkJCQkJCXBhcnNlci5zZXREb2N1bWVudEhhbmRsZXIoYW5vdGhlcik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRoaXMucmlzLnJlc2V0KCk7Ci0JCQkJCQkJKChIVE1MUGFyc2VyKSBwYXJzZXIpLmdldElTUmVhZGVyKCkuY2xvc2UoKTsKLQkJCQkJCQlwYXJzZXIuc2V0RG9jdW1lbnRIYW5kbGVyKGFub3RoZXIpOwotCQkJCQkJCXRocm93IG5ldyBFbmNvZGluZ0V4Y2VwdGlvbihuZXdSZWFkZXIpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlwYXJzZXIuZXJyb3IoSVBhcnNlckVycm9yLk1JU0NfRVJSLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQlwYXJzZXIuc2V0RG9jdW1lbnRIYW5kbGVyKGFub3RoZXIpOwotCQkJCQkJc3VwZXIuc3RhcnRFbGVtZW50KG5hbWUsIGF0dHMpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQk9EWSIpKSB7Ci0JCQlwYXJzZXIuc2V0RG9jdW1lbnRIYW5kbGVyKGFub3RoZXIpOwotCQl9Ci0JCXN1cGVyLnN0YXJ0RWxlbWVudChuYW1lLCBhdHRzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvcGFyc2VyL0VuY29kaW5nRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvcGFyc2VyL0VuY29kaW5nRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMDVkZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL3BhcnNlci9FbmNvZGluZ0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWNsYXNzIEVuY29kaW5nRXhjZXB0aW9uIGV4dGVuZHMgU0FYRXhjZXB0aW9uIHsKLQlwcml2YXRlIElucHV0U3RyZWFtUmVhZGVyIG5ld1JlYWRlcjsKLQotCUVuY29kaW5nRXhjZXB0aW9uKElucHV0U3RyZWFtUmVhZGVyIHJlYWRlcikgewotCQlzdXBlcigiIik7Ci0JCXRoaXMubmV3UmVhZGVyID0gcmVhZGVyOwotCX0KLQotCUlucHV0U3RyZWFtUmVhZGVyIGdldE5ld1JlYWRlcigpIHsKLQkJcmV0dXJuIHRoaXMubmV3UmVhZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9wYXJzZXIvSFRNTFBhcnNlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL3BhcnNlci9IVE1MUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NmE2YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL3BhcnNlci9IVE1MUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSUVycm9yTG9nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JSFRNTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmVycm9yaGFuZGxlci5GcmFtZXNldEVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLmVycm9yaGFuZGxlci5IVE1MRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwuaW1wbC5TSERPTUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsLlNIRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC51dGlsLkphcGFuZXNlRW5jb2RpbmdEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLnV0aWwuUmVyZWFkYWJsZUlucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbC5TR01MUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5odG1sLkhUTUxET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogSFRNTCBQYXJzZXIuIFRvIHVzZSB0aGlzIGNsYXNzLAotICogPG9sPgotICogPGxpPkNvbnN0cnVjdCBIVE1MUGFyc2VyIGluc3RhbmNlIHdpdGggYSBmaWxlIHRvIHJlYWQuCi0gKiA8bGk+Y2FsbCBwYXJzZSguLi4pIG1ldGhvZC4gSWYgYW4gZXJyb3Igb2NjdXJyZWQsCi0gKiA8Y29kZT5QYXJzZUV4Y2VwdGlvbjwvY29kZT4gb3IgSU9FeGNlcHRpb24gcmFpc2VzLgotICogPGxpPiBnZXQgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IGluc3RhbmNlIGJ5IGNhbGxpbmcge0BsaW5rICNnZXREb2N1bWVudCgpfS4KLSAqIElmIGEgPGNvZGU+UGFyc2VFeGNlcHRpb248L2NvZGU+IHdhcyB0aHJvd24sIHRoZSByZXR1cm5lZCBpbnN0YW5jZSBob2xkcwotICogc3ViIERPTSBjcmVhdGVkIGZyb20gc3ViIGRvY3VtZW50IHRvIHRoZSBlcnJvciBwb2ludC4KLSAqIDwvb2w+Ci0gKiBGb3IgZXhhbXBsZSwKLSAqIAotICogPHByZT4KLSAqIDxjb2RlPgotICogSFRNTFBhcnNlciBwYXJzZXIgPSBuZXcgSFRNTFBhcnNlcigpOwotICogdHJ5IHsKLSAqIAlwYXJzZXIucGFyc2UobmV3IEZpbGVJbnB1dFN0cmVhbSgmcXVvdDt4eHguaHRtbCZxdW90OykpOwotICogfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICogCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gKiB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gKiAJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAqIH0KLSAqIG9yZy53M2MuRG9jdW1lbnQgZG9jID0gcGFyc2VyLmdldERvY3VtZW50KCk7Ci0gKiA8L2NvZGU+Ci0gKiA8L3ByZT4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSFRNTFBhcnNlciBleHRlbmRzIFNHTUxQYXJzZXIgaW1wbGVtZW50cyBJSFRNTFBhcnNlciB7Ci0Jc3RhdGljIHsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQlpcyA9IEhUTUxQYXJzZXIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgicHVibGljX2VudGl0aWVzLnByb3BlcnRpZXMiKTsKLQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCVByb3BlcnRpZXMgbWFwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXRyeSB7Ci0JCQkJbWFwLmxvYWQoaXMpOwotCQkJCS8vIHB1YkVudGl0eU1hcC5wdXRBbGwobWFwKTsKLQkJCQlFbnVtZXJhdGlvbiBrZXlzID0gbWFwLmtleXMoKTsgLy8gQ1JTCi0JCQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsgLy8gQ1JTCi0JCQkJCVN0cmluZyBhS2V5ID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOyAvLyBDUlMKLQkJCQkJU3RyaW5nIHJlcGxhY2VLZXkgPSBhS2V5LnJlcGxhY2UoJ0AnLCAnICcpOyAvLyBDUlMKLQkJCQkJcHViRW50aXR5TWFwLnB1dChyZXBsYWNlS2V5LCAoU3RyaW5nKSBtYXAuZ2V0KGFLZXkpKTsgLy8gQ1JTCi0JCQkJfSAvLyBDUlMKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFJlcmVhZGFibGVJbnB1dFN0cmVhbSByaXM7Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW1SZWFkZXIgaXNSZWFkZXI7Ci0KLQlJbnB1dFN0cmVhbVJlYWRlciBnZXRJU1JlYWRlcigpIHsKLQkJcmV0dXJuIGlzUmVhZGVyOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgSFRNTFBhcnNlciBpbnN0YW5jZSB3aG9zZSBkZWZhdWx0RFREIGlzCi0JICogPGNvZGU+Ii0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPC9jb2RlPi4gQW5kIGFsc28sCi0JICoge0BsaW5rIEhUTUxFcnJvckhhbmRsZXJ9IGFuZCB7QGxpbmsgRnJhbWVzZXRFcnJvckhhbmRsZXJ9IGluc3RhbmNlcyBhcmUKLQkgKiBhZGRlZC4KLQkgKi8KLQlwdWJsaWMgSFRNTFBhcnNlcigpIHsKLQkJZGVmYXVsdERURCA9ICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIjsKLQkJYWRkRXJyb3JIYW5kbGVyKG5ldyBGcmFtZXNldEVycm9ySGFuZGxlcigpKTsKLQkJYWRkRXJyb3JIYW5kbGVyKG5ldyBIVE1MRXJyb3JIYW5kbGVyKCkpOwotCQlzZXREb2N1bWVudEhhbmRsZXIobmV3IFBSRUhhbmRsZXIodGhpcykpOwotCQlzZXRET01JbXBsZW1lbnRhdGlvbihTSERPTUltcGwuZ2V0RE9NSW1wbGVtZW50YXRpb24oKSk7Ci0JCWlmIChnZXRET01JbXBsZW1lbnRhdGlvbigpID09IG51bGwpIHsKLQkJCXNldERvY3VtZW50KG5ldyBTSERvY3VtZW50KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFJlYWRlciBnZXRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpcyA9IElIVE1MUGFyc2VyLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImR0ZC8iCi0JCQkJKyByZXNvdXJjZU5hbWUpOwotCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2UocmVzb3VyY2VOYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYWRzIGZpbGVzIGFuZCBwcmludCB0aGVpciB0b3AgZWxlbWVudHMuIFRoaXMgbWV0aG9kIGlzIGp1c3QgZm9yIHRlc3QuCi0JICogdXNhZ2U6IGphdmEgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5IVE1MUGFyc2VyIFtvcHRpb25zXSBmaWxlcy4uLgotCSAqIDxicj4KLQkgKiBvcHRpb25zOgotCSAqIDxETD4KLQkgKiA8RFQ+IC1lIGVuY29kaW5nCi0JICogPEREPiBzcGVjaWZ5IGNoYXJhY3RlciBlbmNvZGluZyB0byA8Y29kZT5lbmNvZGluZzwvY29kZT4KLQkgKiA8RFQ+IC1jCi0JICogPEREPiBJZiBpdCBtZWV0cwotCSAqIDxjb2RlPiAmbHQ7TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsKLQkgKiBjaGFyc2V0PXh4eCImZ3Q7PC9jb2RlPgotCSAqIHRhZywgY2hhbmdlIGVuY29kaW5nIHRvIDxjb2RlPnh4eDwvY29kZT4KLQkgKiA8RFQ+IC1kCi0JICogPEREPiBEdW1wIHJlc3VsdHMuCi0JICogPERUPiAtbyBvdXRwdXQgZmlsZQotCSAqIDxEVD4gLXggW2R0ZF0KLQkgKiA8REQ+IER1bXAgYXMgeG1sIGZvcm1hdC4KLQkgKiA8RFQ+IC13PwotCSAqIDxERD4gd2FybmluZwotCSAqIAotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotCQlib29sZWFuIGR1bXAgPSBmYWxzZTsKLQkJU3RyaW5nIHRhcmdldEZpbGVOYW1lID0gbnVsbDsKLQkJaW50IGxlbmd0aCA9IGFyZ3MubGVuZ3RoOwotCQlTdHJpbmcgZW5jb2RpbmcgPSBudWxsOwotCQlib29sZWFuIGNlID0gZmFsc2U7Ci0JCWJvb2xlYW4gaW5kZW50ID0gZmFsc2U7Ci0JCWludCB3YXJuaW5nID0gLTE7Ci0JCWJvb2xlYW4gcGh5c2ljYWwgPSBmYWxzZTsKLQkJYm9vbGVhbiB4bWwgPSBmYWxzZTsKLQkJU3RyaW5nIGxpc3QgPSBudWxsOwotCQlib29sZWFuIGtlZXBVbmtub3duID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFyZ3NbaV0uZXF1YWxzKCItZCIpKSB7Ci0JCQkJZHVtcCA9IHRydWU7Ci0JCQkJbGVuZ3RoLS07Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItbyIpKSB7Ci0JCQkJaSsrOwotCQkJCXRhcmdldEZpbGVOYW1lID0gYXJnc1tpXTsKLQkJCQlsZW5ndGggLT0gMjsKLQkJCX0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1lIikpIHsKLQkJCQlpZiAoKytpID09IGFyZ3MubGVuZ3RoKQotCQkJCQl1c2FnZSgpOwotCQkJCWVuY29kaW5nID0gYXJnc1tpXTsKLQkJCQlsZW5ndGggLT0gMjsKLQkJCX0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1jIikpIHsKLQkJCQljZSA9IHRydWU7Ci0JCQkJbGVuZ3RoLS07Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCIteCIpKSB7Ci0JCQkJeG1sID0gdHJ1ZTsKLQkJCQlsZW5ndGgtLTsKLQkJCX0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1pIikpIHsKLQkJCQlpbmRlbnQgPSB0cnVlOwotCQkJCWxlbmd0aC0tOwotCQkJfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi13IikpIHsKLQkJCQlpZiAoYXJnc1tpXS5sZW5ndGgoKSA9PSAyKSB7Ci0JCQkJCXdhcm5pbmcgPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl3YXJuaW5nID0gSW50ZWdlci5wYXJzZUludChhcmdzW2ldLnN1YnN0cmluZygyKSk7Ci0JCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl1c2FnZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWxlbmd0aC0tOwotCQkJfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi1rdSIpKSB7Ci0JCQkJa2VlcFVua25vd24gPSB0cnVlOwotCQkJCWxlbmd0aC0tOwotCQkJfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXBoeXNpY2FsIikpIHsKLQkJCQlwaHlzaWNhbCA9IHRydWU7Ci0JCQkJbGVuZ3RoLS07Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLWwiKSAmJiBhcmdzW2ldLmxlbmd0aCgpID4gMikgewotCQkJCWxpc3QgPSBhcmdzW2ldLnN1YnN0cmluZygyKTsKLQkJCQlsZW5ndGgtLTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQl1c2FnZSgpOwotCQl9Ci0JCUhUTUxQYXJzZXIgcGFyc2VyOwotCQlmb3IgKGludCBpID0gYXJncy5sZW5ndGggLSBsZW5ndGg7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCXBhcnNlciA9IG5ldyBIVE1MUGFyc2VyKCk7Ci0JCQkJcGFyc2VyLmtlZXBVbmtub3duRWxlbWVudHMoa2VlcFVua25vd24pOwotCQkJCWlmICh3YXJuaW5nICE9IC0xKSB7Ci0JCQkJCWlmICh3YXJuaW5nID09IDApIHsKLQkJCQkJCXBhcnNlci5hZGRFcnJvckxvZ0xpc3RlbmVyKG5ldyBJRXJyb3JMb2dMaXN0ZW5lcigpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBlcnJvckxvZyhpbnQgY29kZSwgU3RyaW5nIG1zZykgewotCQkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWZpbmFsIGludCBlcnJvcktpbmQgPSB3YXJuaW5nOwotCQkJCQkJcGFyc2VyLmFkZEVycm9yTG9nTGlzdGVuZXIobmV3IElFcnJvckxvZ0xpc3RlbmVyKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIGVycm9yTG9nKGludCBjb2RlLCBTdHJpbmcgbXNnKSB7Ci0JCQkJCQkJCWlmIChjb2RlID09IGVycm9yS2luZCkgewotCQkJCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocGh5c2ljYWwpIHsKLQkJCQkJcGFyc2VyLmVsZW1lbnRIYW5kbGUoZmFsc2UpOwotCQkJCX0KLQkJCQlpZiAoeG1sKSB7Ci0JCQkJCXBhcnNlci5zZXREZWZhdWx0VGFnQ2FzZShJUGFyc2VyLkxPV0VSX0NBU0UpOwotCQkJCQlwYXJzZXIuc2V0VGFnQ2FzZShJUGFyc2VyLkxPV0VSX0NBU0UpOwotCQkJCQlwYXJzZXIuc2V0QXR0ck5hbWVDYXNlKElQYXJzZXIuTE9XRVJfQ0FTRSk7Ci0JCQkJfQotCQkJCUlucHV0U3RyZWFtIGlzOwotCQkJCWlmIChhcmdzW2ldLmVxdWFscygiLXUiKSkgewotCQkJCQlpKys7Ci0JCQkJCWphdmEubmV0LlVSTCB1cmwgPSBuZXcgamF2YS5uZXQuVVJMKGFyZ3NbaV0pOwotCQkJCQlpcyA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGFyZ3NbaV0pOwotCQkJCX0KLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oInBhcnNpbmcgIiArIGFyZ3NbaV0gKyAiIC4uLiIpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChjZSkgewotCQkJCQkJcGFyc2VyLnBhcnNlU3dpdGNoRW5jKGlzLCBlbmNvZGluZyk7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVuY29kaW5nOiAiICsgcGFyc2VyLmdldEVuY29kaW5nKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcGFyc2VyLnBhcnNlKGlzLCBlbmNvZGluZyk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJcGFyc2VyLmNsb3NlKCk7Ci0JCQkJaWYgKGR1bXApIHsKLQkJCQkJUHJpbnRXcml0ZXIgcHc7Ci0JCQkJCU91dHB1dFN0cmVhbSBvcyA9IHRhcmdldEZpbGVOYW1lID09IG51bGwgPyAoT3V0cHV0U3RyZWFtKSBTeXN0ZW0ub3V0Ci0JCQkJCQkJOiBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlTmFtZSk7Ci0JCQkJCWlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0JCQkJCQlwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG9zLAotCQkJCQkJCQllbmNvZGluZykpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHcgPSBuZXcgUHJpbnRXcml0ZXIob3MpOwotCQkJCQl9Ci0JCQkJCWlmICgheG1sKSB7Ci0JCQkJCQkoKFNIRG9jdW1lbnQpIHBhcnNlci5nZXREb2N1bWVudCgpKS5wcmludEFzU0dNTChwdywKLQkJCQkJCQkJaW5kZW50KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCSgoU0hEb2N1bWVudCkgcGFyc2VyLmdldERvY3VtZW50KCkpLnByaW50QXNYSFRNTChwdywKLQkJCQkJCQkJaW5kZW50LCBlbmNvZGluZyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGxpc3QgIT0gbnVsbCkgewotCQkJCQlOb2RlTGlzdCBub2RlTGlzdCA9IHBhcnNlci5nZXREb2N1bWVudCgpCi0JCQkJCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lKGxpc3QpOwotCQkJCQlmb3IgKGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKG5vZGVMaXN0Lml0ZW0oaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgYW4gSFRNTCBkb2N1bWVudCBhbmQgcmV0dXJuIGl0cyB0b3AgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaXMKLQkgKiAgICAgICAgICAgIGlucHV0c3RyZWFtIHRvIHBhcnNlIHdpdGggZGVmYXVsdCBlbmNvZGluZy4KLQkgKiBAcmV0dXJuIFRvcCBlbGVtZW50LgotCSAqIEBleGNlcHRpb24gUGFzZXJFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB1bnJlY292ZXJhYmxlIHN5bnRheCBvciB0b2tlbiBlcnJvciBvY2N1cnJlZCwgdGhyb3duCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBOb2RlIHBhcnNlKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotCQkJU0FYRXhjZXB0aW9uIHsKLQotCQlKYXBhbmVzZUVuY29kaW5nRGV0ZWN0b3IgSkVEID0gbmV3IEphcGFuZXNlRW5jb2RpbmdEZXRlY3Rvcihpcyk7Ci0JCXRyeSB7Ci0JCQllbmNvZGluZyA9IEpFRC5kZXRlY3QoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgKGUpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBwYXJzZShKRUQuZ2V0SW5wdXRTdHJlYW0oKSwgZW5jb2RpbmcpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaXNSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoSkVELmdldElucHV0U3RyZWFtKCkpOwotCQkJcmV0dXJuIHBhcnNlKGlzUmVhZGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhcnNlcyBhIEhUTUwgZG9jdW1lbnQgYW5kIHJldHVybiBpdHMgdG9wIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlzCi0JICogICAgICAgICAgICBpbnB1dHN0cmVhbSB0byBwYXJzZS4KLQkgKiBAcmV0dXJuIFRvcCBlbGVtZW50LgotCSAqIEBleGNlcHRpb24gUGFzZXJFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB1bnJlY292ZXJhYmxlIHN5bnRheCBvciB0b2tlbiBlcnJvciBvY2N1cnJlZCwgdGhyb3dlZAotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTm9kZSBwYXJzZShJbnB1dFN0cmVhbSBpcywgU3RyaW5nIGNoYXJFbmNvZGluZykgdGhyb3dzIFNBWEV4Y2VwdGlvbiwKLQkJCVBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChjaGFyRW5jb2RpbmcgPT0gbnVsbCkgewotCQkJaXNSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOwotCQl9IGVsc2UgewotCQkJdGhpcy5lbmNvZGluZyA9IGNoYXJFbmNvZGluZzsKLQkJCWlzUmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBjaGFyRW5jb2RpbmcpOwotCQl9Ci0JCXJldHVybiBwYXJzZShpc1JlYWRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIGEgSFRNTCBkb2N1bWVudCBhbmQgcmV0dXJuIGl0cyB0b3AgZWxlbWVudC4gVGhpcyBtZXRob2QgaXMgYWxtb3N0Ci0JICogc2FtZSBhcyB7QGxpbmsgI3BhcnNlKElucHV0U3RyZWFtKSBwYXJzZShJbnB1dFN0cmVhbSl9LiBJZiBpdCBtZWV0cwotCSAqIDxjb2RlPiAmbHQ7TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIAotCSAqIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD14eHgiJmd0OzwvY29kZT4KLQkgKiB0YWcgaW4gYSBkb2N1bWVudCwgaXQgdHJpZXMgdG8gY2hhbmdlIGVuY29kaW5nIHRvIDxjb2RlPnh4eDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGlzCi0JICogICAgICAgICAgICBpbnB1dHN0cmVhbSB0byBwYXJzZQotCSAqIEByZXR1cm4gVG9wIGVsZW1lbnQuCi0JICogQGV4Y2VwdGlvbiBQYXNlckV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHVucmVjb3ZlcmFibGUgc3ludGF4IG9yIHRva2VuIGVycm9yIG9jY3VycmVkLCB0aHJvd2VkCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBOb2RlIHBhcnNlU3dpdGNoRW5jKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHBhcnNlU3dpdGNoRW5jKGlzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgYSBIVE1MIGRvY3VtZW50IGFuZCByZXR1cm4gaXRzIHRvcCBlbGVtZW50LiBUaGlzIG1ldGhvZCBpcyB0aGUKLQkgKiBzYW1lIGFzIHtAbGluayAjcGFyc2UoSW5wdXRTdHJlYW0sU3RyaW5nKSBwYXJzZShJbnB1dFN0cmVhbSxTdHJpbmcpfSBJZgotCSAqIGl0IG1lZXRzIDxjb2RlPiAmbHQ7TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiCi0JICogY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXh4eCImZ3Q7PC9jb2RlPgotCSAqIHRhZyBpbiBhIGRvY3VtZW50LCBpdCB0cmllcyB0byBjaGFuZ2UgZW5jb2RpbmcgdG8gPGNvZGU+eHh4PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gaXMKLQkgKiAgICAgICAgICAgIGlucHV0c3RyZWFtIHRvIHBhcnNlCi0JICogQHBhcmFtIGRlZmF1bHRFbmNvZGluZwotCSAqICAgICAgICAgICAgZGVmYXVsdCBlbmNvZGluZyBiZWZvcmUgc3dpdGNoaW5nIGVuY29kaW5nLgotCSAqIEByZXR1cm4gVG9wIGVsZW1lbnQuCi0JICogQGV4Y2VwdGlvbiBQYXNlckV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHVucmVjb3ZlcmFibGUgc3ludGF4IG9yIHRva2VuIGVycm9yIG9jY3VycmVkLCB0aHJvd2VkCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBOb2RlIHBhcnNlU3dpdGNoRW5jKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgZGVmYXVsdEVuY29kaW5nKQotCQkJdGhyb3dzIFNBWEV4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmlzID0gbmV3IFJlcmVhZGFibGVJbnB1dFN0cmVhbShpcyk7Ci0JCXNldERvY3VtZW50SGFuZGxlcihuZXcgQ2hhcnNldEhhbmRsZXIodGhpcywgcmlzKSk7Ci0JCXRyeSB7Ci0JCQlpZiAoZGVmYXVsdEVuY29kaW5nID09IG51bGwpIHsKLQkJCQlpc1JlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyaXMpOwotCQkJfSBlbHNlIHsKLQkJCQllbmNvZGluZyA9IGRlZmF1bHRFbmNvZGluZzsKLQkJCQlpc1JlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyaXMsIGRlZmF1bHRFbmNvZGluZyk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGFyc2UoaXNSZWFkZXIpOwotCQl9IGNhdGNoIChFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjbGVhciBjcmVhdGVkIGNoaWxkIG5vZGVzLgotCQkJaWYgKHNldERPTUltcGxlbWVudGF0aW9uKGdldERPTUltcGxlbWVudGF0aW9uKCkpID09IG51bGwpIHsKLQkJCQlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQkJCXdoaWxlIChkb2MuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWRvYy5yZW1vdmVDaGlsZChkb2MuZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpbml0KCk7Ci0JCQllbmNvZGluZyA9IGUuZ2V0TmV3UmVhZGVyKCkuZ2V0RW5jb2RpbmcoKTsKLQkJCXJldHVybiBwYXJzZShlLmdldE5ld1JlYWRlcigpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVEb2N1bWVudChEb2N1bWVudFR5cGUgZG9jVHlwZSkgewotCQlET01JbXBsZW1lbnRhdGlvbiBkb21JbXBsID0gZ2V0RE9NSW1wbGVtZW50YXRpb24oKTsKLQkJdHJ5IHsKLQkJCWlmICghKGRvbUltcGwgaW5zdGFuY2VvZiBIVE1MRE9NSW1wbGVtZW50YXRpb24pKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZURvY3VtZW50KGRvY1R5cGUpOwotCQkJfQotCQl9IGNhdGNoIChFcnJvciBlKSB7Ci0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlRG9jdW1lbnQoZG9jVHlwZSk7Ci0JCX0KLQkJRG9jdW1lbnQgcmV0ID0gKChIVE1MRE9NSW1wbGVtZW50YXRpb24pIGRvbUltcGwpCi0JCQkJLmNyZWF0ZUhUTUxEb2N1bWVudCgiZHVtbXkiKTsKLQkJaWYgKHJldC5nZXREb2N1bWVudEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlyZXQucmVtb3ZlQ2hpbGQocmV0LmdldERvY3VtZW50RWxlbWVudCgpKTsKLQkJfQotCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldC5pbnNlcnRCZWZvcmUoZG9jVHlwZSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChET01FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBlbmNvZGluZyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDaGFyYWN0ZXIgRW5jb2RpbmcgcGFyc2VkIGEgZG9jdW1lbnQgd2l0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIElmIG51bGwgcGFyc2VkIGEgZG9jdW1lbnQgd2l0aCBkZWZhdWx0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBlbmNvZGluZzsKLQl9Ci0KLQl2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmMpIHsKLQkJdGhpcy5lbmNvZGluZyA9IGVuYzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVzYWdlKCkgewotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oInVzYWdlIGphdmEgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5IVE1MUGFyc2VyIFstd1sjXV0gWy1kXSBbLWUgZW5jb2RpbmddIFstY10gZmlsZXMuLi4iKTsKLQkJU3lzdGVtLmV4aXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQWx3YXlzIHJldHVybnMgIkhUTUwiCi0JICogCi0JICogQHJldHVybiAiSFRNTCIKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRUb3BFbGVtZW50KCkgewotCQlyZXR1cm4gIkhUTUwiOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC9wYXJzZXIvUFJFSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL3BhcnNlci9QUkVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOGNmMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL3BhcnNlci9QUkVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5pbXBsLkRlZmF1bHREb2N1bWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFBSRUhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0RG9jdW1lbnRIYW5kbGVyIHsKLQlwcml2YXRlIGJvb2xlYW4gcHJldmlvdXNQcnN2V1M7Ci0KLQlwdWJsaWMgUFJFSGFuZGxlcihIVE1MUGFyc2VyIHBhcnNlcikgewotCQlzdXBlcihwYXJzZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlTGlzdCBhdHRzKQotCQkJdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlBSRSIpKSB7Ci0JCQlwcmV2aW91c1Byc3ZXUyA9IHBhcnNlci5nZXRQcmVzZXJ2ZVdoaXRlc3BhY2UoKTsKLQkJCXBhcnNlci5zZXRQcmVzZXJ2ZVdoaXRlc3BhY2UodHJ1ZSk7Ci0JCX0KLQkJc3VwZXIuc3RhcnRFbGVtZW50KG5hbWUsIGF0dHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJQUkUiKSkgewotCQkJcGFyc2VyLnNldFByZXNlcnZlV2hpdGVzcGFjZShwcmV2aW91c1Byc3ZXUyk7Ci0JCX0KLQkJc3VwZXIuZW5kRWxlbWVudChuYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvcGFyc2VyL3B1YmxpY19lbnRpdGllcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL3BhcnNlci9wdWJsaWNfZW50aXRpZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ2ZWI3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL2h0bWwvcGFyc2VyL3B1YmxpY19lbnRpdGllcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBNYXAgb2YgcHVibGljIGVudGl0aWVzIHRvIGl0cyBmaWxlIAotIyBIVE1MNC4wMQotLS8vVzNDLy9EVERASFRNTEA0LjAxQFRyYW5zaXRpb25hbC8vRU49bG9vc2UuZHRkCi0tLy9XM0MvL0RUREBIVE1MQDQuMDFARnJhbWVzZXQvL0VOPWZyYW1lc2V0LmR0ZAotLS8vVzNDLy9EVERASFRNTEA0LjAxLy9FTj1zdHJpY3QuZHRkCi0tLy9XM0MvL0VOVElUSUVTQExhdGluMS8vRU4vL0hUTUw9SFRNTGxhdDEuZW50Ci0tLy9XM0MvL0VOVElUSUVTQFN5bWJvbHMvL0VOLy9IVE1MPUhUTUxzeW1ib2wuZW50Ci0tLy9XM0MvL0VOVElUSUVTQFNwZWNpYWwvL0VOLy9IVE1MPUhUTUxzcGVjaWFsLmVudAotIyBIVE1MNC4wCi0tLy9XM0MvL0RUREBIVE1MQDQuMEBUcmFuc2l0aW9uYWwvL0VOPWxvb3NlNDAwLmR0ZAotLS8vVzNDLy9EVERASFRNTEA0LjBARnJhbWVzZXQvL0VOPWZyYW1lc2V0NDAwLmR0ZAotLS8vVzNDLy9EVERASFRNTEA0LjAvL0VOPXN0cmljdDQwMC5kdGQKLSMgZW50aXRpZXMgYXJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhhdCBvZiA0LjAxCi0KLSMgSFRNTDMuMgotLS8vVzNDLy9EVERASFRNTEAzLjJARmluYWwvL0VOPUhUTUwzMi5kdGQKLS0vL1czQy8vRFREQEhUTUxAMy4yLy9FTj1IVE1MMzIuZHRkCi1JU09AODg3OS0xOTg2Ly9FTlRJVElFU0BBZGRlZEBMYXRpbkAxLy9FTi8vSFRNTD1JU09sYXQxLmVudAotCi0jIEhUTUwyLjAKLS0vL0lFVEYvL0RUREBIVE1MLy9FTj1odG1sLmR0ZAotLS8vSUVURi8vRFREQEhUTUxAMi4wLy9FTj1odG1sLmR0ZAotLS8vSUVURi8vRFREQEhUTUxATGV2ZWxAMi8vRU49aHRtbC5kdGQKLS0vL0lFVEYvL0RUREBIVE1MQDIuMEBMZXZlbEAyLy9FTj1odG1sLmR0ZAotLS8vSUVURi8vRFREQEhUTUxATGV2ZWxAMS8vRU49aHRtbC0xLmR0ZAotLS8vSUVURi8vRFREQEhUTUxAMi4wQExldmVsQDEvL0VOPWh0bWwtMS5kdGQKLS0vL0lFVEYvL0RUREBIVE1MQFN0cmljdC8vRU49aHRtbC1zLmR0ZAotLS8vSUVURi8vRFREQEhUTUxAMi4wQFN0cmljdC8vRU49aHRtbC1zLmR0ZAotLS8vSUVURi8vRFREQEhUTUxAU3RyaWN0QExldmVsQDIvL0VOPWh0bWwtcy5kdGQKLS0vL0lFVEYvL0RUREBIVE1MQDIuMEBTdHJpY3RATGV2ZWxAMi8vRU49aHRtbC1zLmR0ZAotLS8vSUVURi8vRFREQEhUTUxAU3RyaWN0QExldmVsQDEvL0VOPWh0bWwtMXMuZHRkCi0tLy9JRVRGLy9EVERASFRNTEAyLjBAU3RyaWN0QExldmVsQDEvL0VOPWh0bWwtMXMuZHRkCi0jIGZyb20gSFRNTDIuMCwgaXQncyBvdmVybGFwcGVkCi0jIElTTyA4ODc5LTE5ODYvL0VOVElUSUVTIEFkZGVkIExhdGluIDEvL0VOLy9IVE1MPUlTT2xhdDEuc2dtbAotCi0jIENvbXBhY3QgSFRNTAotLS8vVzNDLy9EVERAQ29tcGFjdEBIVE1MQDEuMEBEcmFmdC8vRU49Y29tcGFjdC5kdGQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC91dGlsL0phcGFuZXNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL3V0aWwvSmFwYW5lc2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1M2E0NDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL3V0aWwvSmFwYW5lc2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vLwotLy8gb25lLWJ5dGUga2F0YWthbmEKLS8vIG9uZS1ieXRlIGthdGFrYW5hIHdpdGggbm90IEVVQyBjb2RlIC0+IG1paGd0IGJlIG9uZS1ieXRlIGthdGFrYW5hCi0vLwotLy8gRVVDMXN0PTB4OGYgLT4gdHdvIHRyYWlsZXJzIChzYW1lIGNvZGUgcmVnaW9uKQotLy8KLS8vIGR1cGxpY2F0ZWQgKG9yZy5lY2xpcHNlLmFjdGYudXRpbC5KRUQpCi0KLS8qCi0gKiBpbmZvcm1hdGlvbgotICogCi0gKiBjdXJyZW50bHkgaWdub3JlIHZlbmRvciBzcGVjaWZpYyBFVUMgY2hhcnMgY3VycmVudGx5IGlnbm9yZSByZXNlcnZlZCB3b3JkIG9mCi0gKiBTSklTICgweEYwLTB4ZmMpCi0gKiAKLSAqIE90aGVyIEpJUyBFc2NhcGUgc2VxdWVuY2Uoc3RhcnQpICJFU0MgJCBAIiAweDFiIDB4MjQgMHg0MCAiRVNDICYgQCBFU0MgJCBCIgotICogMHgxYiAweDI2IDB4NDAgMHgxYiAweDI0IDB4NDIgIkVTQyAkICggRCIgMHgxYiAweDI0IDB4MjggMHg0NCBldGMuCi0gKiAKLSAqIEVzY2FwZSBzZXF1ZW5jZShmaW4pICJFU0MgKCBKIiAiRVNDICggSCIgIkVTQyAoIEIiICJFU0MgKCBJIiBldGMuCi0gKi8KLQotcHVibGljIGNsYXNzIEphcGFuZXNlRW5jb2RpbmdEZXRlY3RvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSl9TSklTID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpfRVVDID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpfSklTID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpfTUlYID0gMzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpfVVRGOCA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVRJTjEgPSA1OwotCi0JLy8gVE9ETyBTSklTLCBFVUNfSlAsIElTTzIwMjJKUAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpJUyA9ICJJU08tMjAyMi1KUCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVUMgPSAiRVVDLUpQIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNKSVMgPSAiU2hpZnRfSklTIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84ID0gIlVURi04IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTT184ODU5XzEgPSAiSVNPLTg4NTktMSI7Ci0KLQkvLyBKSVMgZXNjYXBlIHNlcXVlbmNlCi0JLy8KLQkvLyAiRXNjICQgQiIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEpJU19FU0NBUEUgPSAoYnl0ZSkgMHgxYjsvLyBFc2MKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgSklTX0RPVUJMRSA9IChieXRlKSAweDI0Oy8vICQgZG91YmxlLWJ5dGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgSklTX1NJTkdMRSA9IChieXRlKSAweDI4Oy8vICggc2luZ2xlLWJ5dGUKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgSklTX0IgPSAoYnl0ZSkgMHg0MjsvLyBCIG5ldy1KSVMKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgSklTX0FUID0gKGJ5dGUpIDB4NDA7Ly8gQCBvbGQtSklTCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEpJU19EID0gKGJ5dGUpIDB4NDQ7Ly8gRCBKSVMtc3VwCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEpJU19KID0gKGJ5dGUpIDB4NEE7Ly8gSiBKSVMtcm9tYQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBKSVNfSSA9IChieXRlKSAweDQ5Oy8vIEkgSklTLUFTQ0lJCi0KLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEpJU19TX1BBWUxPQURfQkVHSU4gPSAoYnl0ZSkweDIwOwotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgSklTX1NfUEFZTE9BRF9FTkQgPSAoYnl0ZSkweDdlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBKSVNfS0FOQV9QQVlMT0FEX0JFR0lOID0gKGJ5dGUpIDB4MjE7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEpJU19LQU5BX1BBWUxPQURfRU5EID0gKGJ5dGUpIDB4NWY7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEpJU19EX1BBWUxPQURfQkVHSU4gPSAoYnl0ZSkgMHgyMTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgSklTX0RfUEFZTE9BRF9FTkQgPSAoYnl0ZSkgMHg3RTsKLQotCS8vIEVVQwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRV9LQU5BXzFTVCA9IChieXRlKSAweDhlOyAvLyAybmQgYTEtZGYKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRV9IT0pPXzFTVCA9IChieXRlKSAweDhmOyAvLyAyYnl0ZSBwYXlsb2FkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEVfS0lTWVVfMVNUID0gKGJ5dGUpIDB4YTA7IC8vIDJuZCwgM3JkIHBheWxvYWQ/Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEVfS0FOSklfQkVHSU4gPSAoYnl0ZSkgMHhhMTsgLy8gMm5kLDNyZCBwYXlsb2FkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEVfS0FOSklfRU5EID0gKGJ5dGUpIDB4ZmU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEVfS0FOQV9CRUdJTiA9IChieXRlKSAweGExOyAvLyBrYW5hIHBheWxvYWQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRV9LQU5BX0VORCA9IChieXRlKSAweGRmOyAvLyBrYW5hIHBheWxvYWQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRV9QQVlMT0FEX0JFR0lOID0gKGJ5dGUpIDB4YTA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEVfUEFZTE9BRF9FTkQgPSAoYnl0ZSkgMHhmZjsKLQotCS8vIFNKSVMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFMxc3QxYmVnaW4gPSAoYnl0ZSkgMHg4MTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgUzFzdDFlbmQgPSAoYnl0ZSkgMHg5ZjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgUzFzdDJiZWdpbiA9IChieXRlKSAweGUwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBTMXN0MmVuZCA9IChieXRlKSAweGVmOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBTMm5kMWJlZ2luID0gKGJ5dGUpIDB4NDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFMybmQxZW5kID0gKGJ5dGUpIDB4N2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFMybmQyYmVnaW4gPSAoYnl0ZSkgMHg4MDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgUzJuZDJlbmQgPSAoYnl0ZSkgMHhmYzsKLQotCS8vIFNKSVMga2FuYQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgU2thbmFiZWdpbiA9IChieXRlKSAweGExOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBTa2FuYWVuZCA9IChieXRlKSAweGRmOwotCi0JLy8gVVRGLTgKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEFTQ0lJX0JFR0lOID0gKGJ5dGUpIDB4MDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEFTQ0lJX0VORCA9IChieXRlKSAweDdGOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBVXzJCWVRFX0JFR0lOID0gKGJ5dGUpIDB4YzA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFVfMkJZVEVfRU5EID0gKGJ5dGUpIDB4ZGY7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFVfM0JZVEVfQkVHSU4gPSAoYnl0ZSkgMHhlMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVV8zQllURV9FTkQgPSAoYnl0ZSkgMHhlZjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVV80QllURV9CRUdJTiA9IChieXRlKSAweGYwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBVXzRCWVRFX0VORCA9IChieXRlKSAweGY3OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBVX1BBWUxPQURfQkVHSU4gPSAoYnl0ZSkgMHg4MDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgVV9QQVlMT0FEX0VORCA9IChieXRlKSAweGJmOwotCi0JLy8gSVNPLTg4NTktMSAoTGF0aW4xKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTEFUSU5fQkVHSU4gPSAoYnl0ZSkgMHhhMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTEFUSU5fRU5EID0gKGJ5dGUpIDB4ZmY7Ci0KLQlwcml2YXRlIGJ5dGUgYnVmW10gPSBuZXcgYnl0ZVs4MTkyXTsKLQotCXByaXZhdGUgaW50IGxlbmd0aDsKLQotCXByaXZhdGUgaW50IGVycm9ySklTOwotCi0JcHJpdmF0ZSBpbnQgZXJyb3JVVEY4OwotCi0JcHJpdmF0ZSBpbnQgZXJyb3JMQVRJTjE7Ci0KLQlwcml2YXRlIGludCBlcnJvclNKSVM7Ci0KLQlwcml2YXRlIGludCBlcnJvckVVQzsKLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gaXM7Ci0KLQlwcml2YXRlIFZlY3RvcjxJbnRlZ2VyPiBldWNSZW1vdmVWID0gbmV3IFZlY3RvcjxJbnRlZ2VyPigpOwotCi0JcHVibGljIEphcGFuZXNlRW5jb2RpbmdEZXRlY3RvcihJbnB1dFN0cmVhbSBpcykgewotCQl0aGlzLmlzID0gaXM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmcoaW50IHJldCkgewotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlIEpfVVRGODoKLQkJCXJldHVybiAoVVRGXzgpOwotCQljYXNlIEpfSklTOgotCQkJcmV0dXJuIChKSVMpOwotCQljYXNlIEpfRVVDOgotCQkJcmV0dXJuIChFVUMpOwotCQljYXNlIExBVElOMToKLQkJCXJldHVybiAoSVNPXzg4NTlfMSk7Ci0JCWNhc2UgSl9TSklTOgotCQlkZWZhdWx0OgotCQkJcmV0dXJuIChTSklTKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLQkJcmV0dXJuIChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmLCAwLCBsZW5ndGgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVCdWYoKSB7Ci0JCWJ5dGUgYnl0ZWJ1ZltdID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShidWYsIDAsIGJ5dGVidWYsIDAsIGxlbmd0aCk7Ci0JCXJldHVybiAoYnl0ZWJ1Zik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUtpc3l1SXpvbkVVQygpIHsKLQkJZm9yIChpbnQgaSA9IGV1Y1JlbW92ZVYuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCWJ5dGUgYnl0ZWJ1ZltdID0gbmV3IGJ5dGVbbGVuZ3RoIC0gMl07Ci0JCQlpbnQgaW5kZXggPSAoKEludGVnZXIpIGV1Y1JlbW92ZVYuZ2V0KGkpKS5pbnRWYWx1ZSgpOwotCQkJU3lzdGVtLmFycmF5Y29weShidWYsIDAsIGJ5dGVidWYsIDAsIGluZGV4KTsKLQkJCVN5c3RlbQotCQkJCQkuYXJyYXljb3B5KGJ1ZiwgaW5kZXggKyAyLCBieXRlYnVmLCBpbmRleCwgbGVuZ3RoIC0gaW5kZXgKLQkJCQkJCQktIDIpOwotCQkJYnVmID0gYnl0ZWJ1ZjsKLQkJCS8vIGxlbmd0aCA9IGluZGV4OwotCQkJbGVuZ3RoID0gbGVuZ3RoIC0gMjsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0pJUyhieXRlW10gdGFyZ2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWJ5dGUgYjsKLQotCQlib29sZWFuIGluU2luZ2xlID0gdHJ1ZTsKLQkJYm9vbGVhbiBpbkthbmEgPSBmYWxzZTsKLQkJYm9vbGVhbiBpbkthbmppID0gZmFsc2U7Ci0JCWJvb2xlYW4gaGFzRXNjYXBlID0gZmFsc2U7Ci0KLQkJZm9yIChiID0gYnVmW2luZGV4XTsgaW5kZXggPCBsZW5ndGg7IGIgPSBidWZbaW5kZXhdKSB7Ci0JCQlpZiAoYiA9PSBKSVNfRVNDQVBFICYmIGluZGV4ICsgMiA8IGxlbmd0aCkgewotCQkJCWJ5dGUgYyA9IGJ1ZltpbmRleCArIDFdOwotCQkJCWJ5dGUgZCA9IGJ1ZltpbmRleCArIDJdOwotCQkJCWlmIChjID09IEpJU19TSU5HTEUpIHsKLQkJCQkJc3dpdGNoIChkKSB7Ci0JCQkJCWNhc2UgSklTX0I6Ci0JCQkJCWNhc2UgSklTX0o6Ci0JCQkJCQlpblNpbmdsZSA9IHRydWU7Ci0JCQkJCQlpbkthbmEgPSBmYWxzZTsKLQkJCQkJCWluS2FuamkgPSBmYWxzZTsKLQkJCQkJCWluZGV4ICs9IDM7Ci0JCQkJCQloYXNFc2NhcGUgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSklTX0k6Ci0JCQkJCQlpbkthbmEgPSB0cnVlOwotCQkJCQkJaW5TaW5nbGUgPSBmYWxzZTsKLQkJCQkJCWluS2FuamkgPSBmYWxzZTsKLQkJCQkJCWluZGV4ICs9IDM7Ci0JCQkJCQloYXNFc2NhcGUgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQllcnJvckpJUysrOwotCQkJCQkJaW5kZXgrKzsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoYyA9PSBKSVNfRE9VQkxFKSB7Ci0JCQkJCXN3aXRjaCAoZCkgewotCQkJCQljYXNlIEpJU19BVDoKLQkJCQkJY2FzZSBKSVNfQjoKLQkJCQkJY2FzZSBKSVNfRDoKLQkJCQkJCWluS2FuamkgPSB0cnVlOwotCQkJCQkJaW5TaW5nbGUgPSBmYWxzZTsKLQkJCQkJCWluS2FuYSA9IGZhbHNlOwotCQkJCQkJaW5kZXggKz0gMzsKLQkJCQkJCWhhc0VzY2FwZSA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWVycm9ySklTKys7Ci0JCQkJCQlpbmRleCsrOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXJyb3JKSVMrKzsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChpbkthbmppICYmIGluZGV4ICsgMSA8IGxlbmd0aCAmJiBpc1BheWxvYWRKSVNrYW5qaShiKQotCQkJCQkJJiYgaXNQYXlsb2FkSklTa2FuamkoYnVmW2luZGV4ICsgMV0pKSB7Ci0JCQkJCWluZGV4ICs9IDI7Ci0JCQkJfSBlbHNlIGlmIChpblNpbmdsZSAmJiBpc0FTQ0lJKGIpKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfSBlbHNlIGlmIChpbkthbmEgJiYgaXNQYXlsb2FkSklTa2FuYShiKSkgewotCQkJCQlpbmRleCsrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVycm9ySklTKys7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJKSVMgOiAiK2Vycm9ySklTKyIgIitoYXNFc2NhcGUpOwotCi0JCXJldHVybiAoZXJyb3JKSVMgPT0gMCAmJiBoYXNFc2NhcGUpOwotCQkvLyByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVVEY4KGJ5dGVbXSB0YXJnZXQsIGludCBsZW5ndGgpIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJYnl0ZSBiOwotCQlmb3IgKGIgPSBidWZbaW5kZXhdOyBpbmRleCA8IGxlbmd0aDsgYiA9IGJ1ZltpbmRleF0pIHsKLQkJCWlmIChpc0FTQ0lJKGIpKSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0gZWxzZSBpZiAoaXMyYnl0ZVVURjgoYikgJiYgaW5kZXggKyAxIDwgbGVuZ3RoKSB7Ci0JCQkJaWYgKGlzUGF5bG9hZFVURjgoYnVmW2luZGV4ICsgMV0pKSB7Ci0JCQkJCWluZGV4ICs9IDI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXJyb3JVVEY4Kys7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCS8vIHJldHVybiAoZmFsc2UpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoaXMzYnl0ZVVURjgoYikgJiYgaW5kZXggKyAyIDwgbGVuZ3RoKSB7Ci0JCQkJaWYgKGlzUGF5bG9hZFVURjgoYnVmW2luZGV4ICsgMV0pCi0JCQkJCQkmJiBpc1BheWxvYWRVVEY4KGJ1ZltpbmRleCArIDJdKSkgewotCQkJCQlpbmRleCArPSAzOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVycm9yVVRGOCsrOwotCQkJCQlpbmRleCsrOwotCQkJCQkvLyByZXR1cm4gKGZhbHNlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGlzNGJ5dGVVVEY4KGIpICYmIGluZGV4ICsgMyA8IGxlbmd0aCkgewotCQkJCWlmIChpc1BheWxvYWRVVEY4KGJ1ZltpbmRleCArIDFdKQotCQkJCQkJJiYgaXNQYXlsb2FkVVRGOChidWZbaW5kZXggKyAyXSkKLQkJCQkJCSYmIGlzUGF5bG9hZFVURjgoYnVmW2luZGV4ICsgM10pKSB7Ci0JCQkJCWluZGV4ICs9IDQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXJyb3JVVEY4Kys7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCS8vIHJldHVybiAoZmFsc2UpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZXJyb3JVVEY4Kys7Ci0JCQkJaW5kZXgrKzsKLQkJCQkvLyByZXR1cm4gKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoZXJyb3JVVEY4ID09IDApOwotCQkvLyByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMQVRJTjEoYnl0ZVtdIHRhcmdldCwgaW50IGxlbmd0aCkgewotCQlpbnQgaW5kZXggPSAwOwotCQlieXRlIGI7Ci0JCWZvciAoYiA9IGJ1ZltpbmRleF07IGluZGV4IDwgbGVuZ3RoOyBiID0gYnVmW2luZGV4XSkgewotCQkJaWYgKGlzQVNDSUkoYikgfHwgaXNMQVRJTjEoYikpIHsKLQkJCQlpbmRleCsrOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCsrOwotCQkJCWVycm9yTEFUSU4xKys7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKGVycm9yTEFUSU4xID09IDApOwotCQkvLyByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTSklTKGJ5dGVbXSB0YXJnZXQsIGludCBsZW5ndGgpIHsKLQkJaW50IGluZGV4ID0gMDsKLQotCQlieXRlIGI7Ci0JCWZvciAoYiA9IGJ1ZltpbmRleF07IGluZGV4IDwgbGVuZ3RoOyBiID0gYnVmW2luZGV4XSkgewotCQkJaWYgKGlzQVNDSUkoYikgfHwgaXNTSklTa2FuYShiKSkgewotCQkJCWluZGV4Kys7Ci0JCQl9IGVsc2UgaWYgKGlzU0pJUzFzdChiKSAmJiBpbmRleCArIDEgPCBsZW5ndGgpIHsKLQkJCQlpZiAoaXNTSklTMm5kKGJ1ZltpbmRleCArIDFdKSkgewotCQkJCQlpbmRleCArPSAyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCWVycm9yU0pJUysrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCQllcnJvclNKSVMrKzsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoZXJyb3JTSklTID09IDApOwotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRVVDKGJ5dGVbXSB0YXJnZXQsIGludCBsZW5ndGgpIHsKLQkJaW50IGluZGV4ID0gMDsKLQotCQlieXRlIGI7Ci0JCWZvciAoYiA9IGJ1ZltpbmRleF07IGluZGV4IDwgbGVuZ3RoOyBiID0gYnVmW2luZGV4XSkgewotCQkJaWYgKGlzQVNDSUkoYikpIHsKLQkJCQlpbmRleCsrOwotCQkJfSBlbHNlIGlmIChpc0VVQ2thbmppKGIpICYmIGluZGV4ICsgMSA8IGxlbmd0aCkgewotCQkJCWlmIChpc1BheWxvYWRFVUMoYnVmW2luZGV4ICsgMV0pKSB7Ci0JCQkJCWluZGV4ICs9IDI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW5kZXgrKzsKLQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImEiKTsKLQkJCQkJZXJyb3JFVUMrKzsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGlzRVVDa2FuYShiKSAmJiBpbmRleCArIDEgPCBsZW5ndGgpIHsKLQkJCQlpZiAoaXNLYW5hUGF5bG9hZEVVQyhidWZbaW5kZXggKyAxXSkpIHsKLQkJCQkJaW5kZXggKz0gMjsKLQkJCQl9IGVsc2UgewotCQkJCQlpbmRleCsrOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImIiKTsKLQkJCQkJZXJyb3JFVUMrKzsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGlzRVVDaG9qbyhiKSAmJiBpbmRleCArIDIgPCBsZW5ndGgpIHsKLQkJCQlpZiAoaXNQYXlsb2FkRVVDKGJ1ZltpbmRleCArIDFdKQotCQkJCQkJJiYgaXNQYXlsb2FkRVVDKGJ1ZltpbmRleCArIDJdKSkgewotCQkJCQlpbmRleCArPSAzOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYyIpOwotCQkJCQllcnJvckVVQysrOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoaXNFVUNLaXN5dShiKSAmJiBpbmRleCArIDEgPCBsZW5ndGgpIHsKLQkJCQlpZiAoaXNQYXlsb2FkRVVDKGJ1ZltpbmRleCArIDFdKSkgewotCQkJCQlldWNSZW1vdmVWLmFkZChuZXcgSW50ZWdlcihpbmRleCkpOwotCQkJCQlpbmRleCArPSAyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZCIpOwotCQkJCQllcnJvckVVQysrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImU6IitiKyIgIitidWZbaW5kZXhdKTsKLQkJCQllcnJvckVVQysrOwotCQkJfQotCQl9Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGVycm9yRVVDKTsKLQotCQlyZXR1cm4gKGVycm9yRVVDID09IDApOwotCi0JfQotCi0JcHVibGljIFN0cmluZyBkZXRlY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlsZW5ndGggPSAwOwotCQllcnJvckpJUyA9IDA7Ci0JCWVycm9yVVRGOCA9IDA7Ci0JCWVycm9yTEFUSU4xID0gMDsKLQkJZXJyb3JTSklTID0gMDsKLQkJZXJyb3JFVUMgPSAwOwotCi0JCWZvciAoaW50IGxlbiA9IGlzLnJlYWQoYnVmLCBsZW5ndGgsIGJ1Zi5sZW5ndGggLSBsZW5ndGgpOyBsZW4gPiAwOykgewotCQkJbGVuZ3RoICs9IGxlbjsKLQkJCWlmIChsZW5ndGggPT0gYnVmLmxlbmd0aCkgewotCQkJCWJ5dGUgbmV3QnVmW10gPSBuZXcgYnl0ZVtsZW5ndGggKyA4MTkyXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgMCwgbmV3QnVmLCAwLCBsZW5ndGgpOwotCQkJCWJ1ZiA9IG5ld0J1ZjsKLQkJCX0KLQkJCWxlbiA9IGlzLnJlYWQoYnVmLCBsZW5ndGgsIGJ1Zi5sZW5ndGggLSBsZW5ndGgpOwotCQl9Ci0JCS8vIGJ5dGUgYywgZCwgZTsKLQkJaW50IHJldCA9IEpfU0pJUzsKLQotCQkvLyBDaGVjayBLYW5qaSBDaGFyYWN0ZXIgc2V0IFNKSVMvSklTL0VVQwotCQkvLyBib29sZWFuIGlzSmlzID0gZmFsc2U7Ci0JCWludCBuU0ppc0Vycm9yID0gMDsKLQkJaW50IG5FdWNFcnJvciA9IDA7Ci0KLQkJLy8gaW50IG5TSmlzID0gMDsKLQkJLy8gaW50IG5FdWMgPSAwOwotCQkvLyBpbnQgY291bnQgPSAwOwotCQkvLwotCQkvLyBpbnQgaW5kZXggPSAwOwotCQkvLyBpbnQgdG1wX2xlbmd0aCA9IGxlbmd0aCAtIDI7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQXV0b0RldGVjdDogIitsZW5ndGgpOwotCi0JCS8vIFRPRE8KLQkJLy8gZm9yIChjID0gYnVmW2luZGV4KytdOyBpbmRleCA8IHRtcF9sZW5ndGg7IGMgPSBidWZbaW5kZXgrK10pIHsKLQkJLy8KLQkJLy8gaWYgKChjID09IEpJU19FU0NBUEUpCi0JCS8vICYmICgoZCA9IGJ1ZltpbmRleF0pID09IEpJU19ET1VCTEUpCi0JCS8vICYmICgoZSA9IGJ1ZltpbmRleCArIDFdKSA9PSBKSVNfQikpIHsKLQkJLy8gaXNKaXMgPSB0cnVlOwotCQkvLyByZXQgPSBKX0pJUzsKLQkJLy8gYnJlYWs7Ci0JCS8vIH0KLQkJLy8gfQotCi0JCWlmIChpc0pJUyhidWYsIGxlbmd0aCkpIHsKLQkJCXJldCA9IEpfSklTOwotCQkJcmV0dXJuICh0b1N0cmluZyhyZXQpKTsKLQkJfQotCi0JCWlmIChpc1VURjgoYnVmLCBsZW5ndGgpKSB7Ci0JCQlyZXQgPSBKX1VURjg7Ci0JCQlyZXR1cm4gKHRvU3RyaW5nKHJldCkpOwotCQl9Ci0KLQkJaWYgKGlzU0pJUyhidWYsIGxlbmd0aCkpIHsKLQkJCXJldCA9IEpfU0pJUzsKLQkJCXJldHVybiAodG9TdHJpbmcocmV0KSk7Ci0JCX0gZWxzZSBpZiAoaXNFVUMoYnVmLCBsZW5ndGgpKSB7Ci0JCQlyZXQgPSBKX0VVQzsKLQotCQkJcmVtb3ZlS2lzeXVJem9uRVVDKCk7Ci0KLQkJCXJldHVybiAodG9TdHJpbmcocmV0KSk7Ci0JCX0gZWxzZSBpZiAoaXNMQVRJTjEoYnVmLCBsZW5ndGgpKSB7Ci0JCQlyZXQgPSBMQVRJTjE7Ci0JCQlyZXR1cm4gKHRvU3RyaW5nKHJldCkpOwotCQl9Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJTSklTOiAiICsgZXJyb3JTSklTICsgIigiICsgblNKaXNFcnJvciArICIpIEVVQzogIgotCQkJCSsgZXJyb3JFVUMgKyAiKCIgKyBuRXVjRXJyb3IgKyAiKSBVVEYtODogIiArIGVycm9yVVRGOAotCQkJCSsgIiBMQVRJTjE6ICIgKyBlcnJvckxBVElOMSArICIgSklTOiAiICsgZXJyb3JKSVMpOwotCi0JCXJldCA9IEpfVVRGODsKLQkJaWYgKGVycm9yU0pJUyA8IDEwMCAmJiBlcnJvclNKSVMgPCBlcnJvckVVQyAmJiBlcnJvclNKSVMgPCBlcnJvclVURjgKLQkJCQkmJiBlcnJvclNKSVMgPCBlcnJvckxBVElOMSAmJiBlcnJvclNKSVMgPCBlcnJvckpJUykgewotCQkJcmV0ID0gSl9TSklTOwotCQl9IGVsc2UgaWYgKGVycm9yRVVDIDwgMTAwICYmIGVycm9yRVVDIDwgZXJyb3JTSklTCi0JCQkJJiYgZXJyb3JFVUMgPCBlcnJvclVURjggJiYgZXJyb3JFVUMgPCBlcnJvckxBVElOMQotCQkJCSYmIGVycm9yRVVDIDwgZXJyb3JKSVMpIHsKLQotCQkJcmVtb3ZlS2lzeXVJem9uRVVDKCk7Ci0KLQkJCXJldCA9IEpfRVVDOwotCQl9IGVsc2UgaWYgKGVycm9yTEFUSU4xIDwgMTAwICYmIGVycm9yTEFUSU4xIDwgZXJyb3JTSklTCi0JCQkJJiYgZXJyb3JMQVRJTjEgPCBlcnJvckVVQyAmJiBlcnJvckxBVElOMSA8IGVycm9yVVRGOAotCQkJCSYmIGVycm9yTEFUSU4xIDwgZXJyb3JKSVMpIHsKLQkJCXJldCA9IExBVElOMTsKLQkJfSBlbHNlIGlmIChlcnJvckpJUyA8IDEwMCAmJiBlcnJvckpJUyA8IGVycm9yU0pJUwotCQkJCSYmIGVycm9ySklTIDwgZXJyb3JFVUMgJiYgZXJyb3JKSVMgPCBlcnJvclVURjgKLQkJCQkmJiBlcnJvckpJUyA8IGVycm9yTEFUSU4xKSB7Ci0JCQlyZXQgPSBKX0pJUzsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImVzdGltYXRpb246ICIgKyB0b1N0cmluZyhyZXQpKTsKLQkJcmV0dXJuICh0b1N0cmluZyhyZXQpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQYXlsb2FkSklTa2FuamkoYnl0ZSBjKSB7Ci0JCXJldHVybiAoSklTX0RfUEFZTE9BRF9CRUdJTiA8PSBjICYmIGMgPD0gSklTX0RfUEFZTE9BRF9FTkQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BheWxvYWRKSVNrYW5hKGJ5dGUgYykgewotCQlyZXR1cm4gKEpJU19LQU5BX1BBWUxPQURfQkVHSU4gPD0gYyAmJiBjIDw9IEpJU19LQU5BX1BBWUxPQURfRU5EKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFVUNrYW5hKGJ5dGUgYykgewotCQlyZXR1cm4gKGMgPT0gRV9LQU5BXzFTVCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRVVDa2FuamkoYnl0ZSBjKSB7Ci0JCXJldHVybiAoRV9LQU5KSV9CRUdJTiA8PSBjICYmIGMgPD0gRV9LQU5KSV9FTkQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VVQ2hvam8oYnl0ZSBjKSB7Ci0JCXJldHVybiAoYyA9PSBFX0hPSk9fMVNUKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFVUNLaXN5dShieXRlIGMpIHsKLQkJcmV0dXJuIChjID09IEVfS0lTWVVfMVNUKTsKLQl9Ci0KLS8vCXByaXZhdGUgYm9vbGVhbiBpc0VVQzFzdChieXRlIGMpIHsKLS8vCQlyZXR1cm4gKGMgPT0gRV9LQU5BXzFTVCB8fCBjID09IEVfSE9KT18xU1QgfHwgKEVfS0FOSklfQkVHSU4gPD0gYyAmJiBjIDw9IEVfS0FOSklfRU5EKSk7Ci0vLwl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQYXlsb2FkRVVDKGJ5dGUgYykgewotCQlyZXR1cm4gKEVfUEFZTE9BRF9CRUdJTiA8PSBjICYmIGMgPD0gRV9QQVlMT0FEX0VORCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzS2FuYVBheWxvYWRFVUMoYnl0ZSBjKSB7Ci0JCXJldHVybiAoRV9LQU5BX0JFR0lOIDw9IGMgJiYgYyA8PSBFX0tBTkFfRU5EKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTSklTMXN0KGJ5dGUgYykgewotCQlyZXR1cm4gKChTMXN0MWJlZ2luIDw9IGMgJiYgYyA8PSBTMXN0MWVuZCkgfHwgKFMxc3QyYmVnaW4gPD0gYyAmJiBjIDw9IFMxc3QyZW5kKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU0pJU2thbmEoYnl0ZSBjKSB7Ci0JCXJldHVybiAoU2thbmFiZWdpbiA8PSBjICYmIGMgPD0gU2thbmFlbmQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1NKSVMybmQoYnl0ZSBjKSB7Ci0JCXJldHVybiAoKFMybmQxYmVnaW4gPD0gYyAmJiBjIDw9IFMybmQxZW5kKSB8fCAoUzJuZDJiZWdpbiA8PSBjICYmIGMgPD0gUzJuZDJlbmQpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNBU0NJSShieXRlIGMpIHsKLQkJcmV0dXJuIChBU0NJSV9CRUdJTiA8PSBjICYmIGMgPD0gQVNDSUlfRU5EKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMQVRJTjEoYnl0ZSBjKSB7Ci0JCXJldHVybiAoTEFUSU5fQkVHSU4gPD0gYyAmJiBjIDw9IExBVElOX0VORCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzMmJ5dGVVVEY4KGJ5dGUgYykgewotCQlyZXR1cm4gKFVfMkJZVEVfQkVHSU4gPD0gYyAmJiBjIDw9IFVfMkJZVEVfRU5EKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXMzYnl0ZVVURjgoYnl0ZSBjKSB7Ci0JCXJldHVybiAoVV8zQllURV9CRUdJTiA8PSBjICYmIGMgPD0gVV8zQllURV9FTkQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpczRieXRlVVRGOChieXRlIGMpIHsKLQkJcmV0dXJuIChVXzRCWVRFX0JFR0lOIDw9IGMgJiYgYyA8PSBVXzRCWVRFX0VORCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGF5bG9hZFVURjgoYnl0ZSBjKSB7Ci0JCXJldHVybiAoVV9QQVlMT0FEX0JFR0lOIDw9IGMgJiYgYyA8PSBVX1BBWUxPQURfRU5EKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7Ci0JCVN0cmluZyB0YXJnZXQgPSAidG1wL2plZC5odG1sIjsKLQotCQl0cnkgewotCQkJSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRhcmdldCk7Ci0JCQlKYXBhbmVzZUVuY29kaW5nRGV0ZWN0b3IgSkVEID0gbmV3IEphcGFuZXNlRW5jb2RpbmdEZXRlY3Rvcihpcyk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oSkVELmRldGVjdCgpKTsKLQkJCS8vIEpFRC5kZXRlY3QyKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotCQkJZTIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC91dGlsL1JlcmVhZGFibGVJbnB1dFN0cmVhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL3V0aWwvUmVyZWFkYWJsZUlucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YjNhOGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL3V0aWwvUmVyZWFkYWJsZUlucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLmh0bWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFJlcmVhZGFibGVJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKLQlwcml2YXRlIElucHV0U3RyZWFtIGluOwotCi0JcHJpdmF0ZSBieXRlIGJ1ZltdID0gbmV3IGJ5dGVbMTAwMDBdOwotCi0JcHJpdmF0ZSBpbnQgYnVmU2l6ID0gMCwgaW5kZXggPSAwOwotCi0JcHJpdmF0ZSBib29sZWFuIGJ1ZmZlcmluZyA9IHRydWUsIG5vcm1hbCA9IGZhbHNlOwotCi0JcHVibGljIFJlcmVhZGFibGVJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbikgewotCQl0aGlzLmluID0gaW47Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobm9ybWFsKSB7Ci0JCQlpbi5jbG9zZSgpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYnVmZmVyaW5nKSB7Ci0JCQlpbnQgcmV0ID0gaW4ucmVhZCgpOwotCQkJaWYgKGJ1ZlNpeiA9PSBidWYubGVuZ3RoKSB7Ci0JCQkJYnVmZmVyaW5nID0gZmFsc2U7Ci0JCQkJbm9ybWFsID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnVmW2J1ZlNpeisrXSA9IChieXRlKSByZXQ7Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UgaWYgKG5vcm1hbCkgewotCQkJcmV0dXJuIGluLnJlYWQoKTsKLQkJfSBlbHNlIHsKLQkJCWludCByZXQgPSBidWZbaW5kZXgrK107Ci0JCQlpZiAoaW5kZXggPT0gYnVmU2l6KSB7Ci0JCQkJbm9ybWFsID0gdHJ1ZTsKLQkJCQlidWYgPSBudWxsOwotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJlYWQoYiwgMCwgYi5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGJ1ZmZlcmluZykgewotCQkJaW50IHJldCA9IGluLnJlYWQoYiwgb2ZmLCBsZW4pOwotCQkJaWYgKGJ1ZlNpeiArIHJldCA8IGJ1Zi5sZW5ndGgpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJldDsgaSsrKQotCQkJCQlidWZbYnVmU2l6ICsgaV0gPSBiW29mZiArIGldOwotCQkJCWJ1ZlNpeiArPSByZXQ7Ci0JCQl9IGVsc2UgewotCQkJCWJ1ZmZlcmluZyA9IGZhbHNlOwotCQkJCW5vcm1hbCA9IHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UgaWYgKG5vcm1hbCkgewotCQkJcmV0dXJuIGluLnJlYWQoYiwgb2ZmLCBsZW4pOwotCQl9IGVsc2UgewotCQkJaW50IHJldDsKLQkJCWZvciAocmV0ID0gMDsgcmV0IDwgYi5sZW5ndGggJiYgaW5kZXggPCBidWZTaXo7IHJldCsrLCBpbmRleCsrKSB7Ci0JCQkJYltyZXRdID0gYnVmW2luZGV4XTsKLQkJCX0KLQkJCWlmIChpbmRleCA9PSBidWZTaXopIHsKLQkJCQlub3JtYWwgPSB0cnVlOwotCQkJCWJ1ZiA9IG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYnVmZmVyaW5nID09IGZhbHNlKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCByZXNldCAiICsgdGhpcyk7Ci0JCX0KLQkJYnVmZmVyaW5nID0gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL3V0aWwvVW5zeW5jaHJvbml6ZWRIYXNodGFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vaHRtbC91dGlsL1Vuc3luY2hyb25pemVkSGFzaHRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmM4NTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9odG1sL3V0aWwvVW5zeW5jaHJvbml6ZWRIYXNodGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5pbXBsLkNvbnN0cnVjdG9yOwotCi1wdWJsaWMgY2xhc3MgVW5zeW5jaHJvbml6ZWRIYXNodGFibGUgewotCWNsYXNzIEVudHJ5IHsKLQkJU3RyaW5nIGtleTsKLQotCQlDb25zdHJ1Y3RvciB2YWw7Ci0KLQkJRW50cnkgbmV4dDsKLQl9Ci0KLQlwcml2YXRlIEVudHJ5IHRhYmxlW10gPSBuZXcgRW50cnlbMjU2XTsKLQotCXByaXZhdGUgaW50IGhhc2hDb2RlKGNoYXIga2V5W10pIHsKLQkJaW50IHJldCA9IDA7Ci0JCWZvciAoaW50IGkgPSBrZXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCXJldCA9IDI1ICogcmV0ICsgKGtleVtpXSAmIDB4MWYpIC0gMTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBDb25zdHJ1Y3RvciBnZXQoU3RyaW5nIGtleSkgewotCQljaGFyIHN0cltdID0ga2V5LnRvQ2hhckFycmF5KCk7Ci0JCWZvciAoRW50cnkgZW50cnkgPSB0YWJsZVsweGZmICYgaGFzaENvZGUoc3RyKV07IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gZW50cnkubmV4dCkgewotCQkJU3RyaW5nIGVudHJ5S2V5ID0gZW50cnkua2V5OwotCQkJaWYgKGVudHJ5S2V5LmVxdWFsc0lnbm9yZUNhc2Uoa2V5KSkKLQkJCQlyZXR1cm4gZW50cnkudmFsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHB1dChTdHJpbmcga2V5LCBDb25zdHJ1Y3RvciB2YWwpIHsKLQkJY2hhciBzdHJbXSA9IGtleS50b0NoYXJBcnJheSgpOwotCQlFbnRyeSBlbnRyeSA9IG5ldyBFbnRyeSgpOwotCQllbnRyeS5rZXkgPSBrZXk7Ci0JCWVudHJ5LnZhbCA9IHZhbDsKLQkJaW50IGluZGV4ID0gMHhmZiAmIGhhc2hDb2RlKHN0cik7Ci0JCWVudHJ5Lm5leHQgPSB0YWJsZVtpbmRleF07Ci0JCXRhYmxlW2luZGV4XSA9IGVudHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9JUHJpbnRYTUwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9JUHJpbnRYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiZjgzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvSVByaW50WE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByaW50WE1MIHsKLQl2b2lkIHByaW50QXNYTUwoUHJpbnRXcml0ZXIgcHcsIGludCBpbmRlbnRMZXZlbCwgYm9vbGVhbiBpbmRlbnQpOwotCXZvaWQgcHJpbnRBc1NHTUwoUHJpbnRXcml0ZXIgcHcsIGludCBpbmRlbnRMZXZlbCwgYm9vbGVhbiBpbmRlbnQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL0lTR01MQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvSVNHTUxDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiMWU4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvSVNHTUxDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbDsKLQotcHVibGljIGludGVyZmFjZSBJU0dNTENvbnN0YW50cyB7Ci0gICAgaW50IEVPRiA9IC0xOwotICAgIGludCBNRE8gPSAxOyAgICAgICAgIC8vIDwhCi0gICAgaW50IENEQVRBID0gMjsgCi0gICAgaW50IElOQ08gPSAzOyAgICAgIC8vICsoCi0gICAgaW50IEVYQ08gPSA0OyAgICAgIC8vIC0oCi0gICAgaW50IFNUUklORyA9IDU7Ci0gICAgaW50IERRU1RSID0gNjsgICAgICAgLy8gIi4uLi4uIgotICAgIGludCBRU1RSID0gNzsgICAgICAgIC8vICcuLi4uLicKLSAgICBpbnQgRVRBR08gPSA4OyAgICAgICAvLyA8LwotICAgIGludCBMRVRURVIgPSA5OwotICAgIGludCBESUdJVCA9IDEwOwotICAgIGludCBOQU1FX0NIQVIgPSAxMTsKLSAgICBpbnQgTlVNID0gMTI7Ci0gICAgaW50IENPTU1FTlQgPSAxMzsgICAvLyA8IS0tIC4uLi4gLS0+Ci0gICAgaW50IFBDREFUQSA9IDE0OwotICAgIGludCBXSElURVNQQUNFID0gMTU7Ci0gICAgaW50IFBJID0gMTc7Ci0gICAgaW50IE1JU0MgPSAxMDAwOwotICAgIAotICAgIGludCBFUSA9ICc9JzsgICAgICAgIC8vID0KLSAgICBpbnQgVEFHQyA9ICc+JzsgICAgICAvLyA+Ci0gICAgaW50IFNUQUdPID0gJzwnOyAgICAgLy8gPAotICAgIGludCBEU08gPSAnWyc7ICAgICAgIC8vIFsKLSAgICBpbnQgRFNDID0gJ10nOyAgICAgICAvLyBdCi0gICAgaW50IFBFUkNFTlQgPSAnJSc7ICAgLy8gJQotICAgIGludCBMRUZUUEFSID0gJygnOyAgIC8vICgKLSAgICBpbnQgUklHSFRQQVIgPSAnKSc7ICAvLyApCi0gICAgaW50IE1JTlVTID0gJy0nOyAgICAgLy8gLQotICAgIGludCBPTUlUVEFCTEUgPSAnTyc7IC8vIE8KLSAgICBpbnQgQ09NTUEgPSAnLCc7ICAgICAvLyAsCi0gICAgaW50IEJBUiA9ICd8JzsgICAgICAgLy8gfAotICAgIGludCBBTVBBID0gJyYnOyAgICAgIC8vICYKLSAgICBpbnQgUVVFU1RJT04gPSAnPyc7ICAvLyA/Ci0gICAgaW50IFBMVVMgPSAnKyc7ICAgICAgLy8gKwotICAgIGludCBNVUxUSSA9ICcqJzsgICAgIC8vICoKLSAgICAKLSAgICBpbnQgREVGQVVMVCA9IDA7ICAgIAotICAgIGludCBUQUcgPSAxOwotICAgIGludCBFVEFHID0gMjsKLQotICAgIC8qKgotICAgICAqICBSZXByZXNlbnRzIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuRW5kVGFnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EVEFHID0gLTE7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvSVNHTUxEb2N1bWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL0lTR01MRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyYjZhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvSVNHTUxEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNHTUxEb2N1bWVudCBleHRlbmRzIElTR01MTm9kZSwgRG9jdW1lbnQgewotCi0JLyoqCi0JICogUHJpbnQgRG9jdW1lbnQgYXMgU0dNTC4gc3RhcnR0YWcncyBzdHJpbmcgaW4gdGhpcyBkb2N1bWVudCBhcmUgZnJvbSB0aGUKLQkgKiBvcmlnaW5hbCBkb2N1bWVudC4gRXZlbiBpZiBhdHRyaWJ1dGVzIGluIGVsZW1lbnRzIGFyZSBtb2RpZmllZCwKLQkgKiBzdGFydHRhZydzIHN0cmluZyBkb2VzIG5vdCBjaGFuZ2UuCi0JICogCi0JICogQHBhcmFtIHB3Ci0JICogICAgICAgICAgICBzdHJlYW0gdG8gd3JpdGUgdGhpcyBkb2N1bWVudC4KLQkgKiBAcGFyYW0gaW5kZW50Ci0JICogICAgICAgICAgICBpbmRlbnQgaWYgdHJ1ZS4gT3RoZXJ3aXNlLCBub3QgaW5kZW50LgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50QXNTR01MKFByaW50V3JpdGVyIHB3LCBib29sZWFuIGluZGVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUHJpbnQgRG9jdW1lbnQgYXMgWE1MCi0JICogCi0JICogQHBhcmFtIHB3Ci0JICogICAgICAgICAgICBzdHJlYW0gdG8gd3JpdGUgdGhpcyBkb2N1bWVudC4KLQkgKiBAcGFyYW0gaW5kZW50Ci0JICogICAgICAgICAgICBpbmRlbnQgaWYgdHJ1ZS4gT3RoZXJ3aXNlLCBub3QgaW5kZW50LgotCSAqIEBwYXJhbSBlbmMKLQkgKiAgICAgICAgICAgIGVuY29kaW5nCQotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50QXNYTUwoUHJpbnRXcml0ZXIgcHcsIGJvb2xlYW4gaW5kZW50LCBTdHJpbmcgZW5jKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvSVNHTUxFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvSVNHTUxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDZkMDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL0lTR01MRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGludGVyZmFjZSBJU0dNTEVsZW1lbnQgZXh0ZW5kcyBJU0dNTE5vZGUsIEVsZW1lbnQsIElQcmludFhNTHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL0lTR01MTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL0lTR01MTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzVmMDliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9JU0dNTE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBJU0dNTE5vZGUgZXh0ZW5kcyBOb2RlLCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9JU0dNTFBhcnNlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL0lTR01MUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZDk2NTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL0lTR01MUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklFcnJvckxvZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbC5FbmRUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5pbXBsLlNHTUxEb2NUeXBlRGVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwubW9kZWxncm91cC5JTW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLm1vZGVsZ3JvdXAuQW5kTW9kZWxHcm91cC5BbmRDb250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcueG1sLnNheC5Eb2N1bWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTR01MUGFyc2VyIGV4dGVuZHMgSVBhcnNlciB7Ci0KLQlwdWJsaWMgdm9pZCBhZGRBdXRvR2VuZXJhdGVkKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckNvbnRleHRNYXAoTm9kZSBwYXJlbnQpOwotCi0JLyoqCi0JICogR2V0cyBEVEQgdGhhdCBkZWZpbmVzIHRoaXMgRG9jdW1lbnQncyBzeW50YXguCi0JICogCi0JICogQHJldHVybiBEVEQgdGhhdCBkZWZpbmVzIHRoaXMgRG9jdW1lbnQncyBzeW50YXguCi0JICovCi0JcHVibGljIFNHTUxEb2NUeXBlRGVmIGdldERURCgpOwotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHBhcnNlciBwcmVzZXJ2ZSB3aGl0ZXNwYWNlcyBvciBub3QuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHBhcnNlciBwcmVzZXJ2ZSB3aGl0ZXNwYWNlcy4KLQkgKiAgICAgICAgIE90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRQcmVzZXJ2ZVdoaXRlc3BhY2UoKTsKLQotCS8qKgotCSAqIEluc2VydHMgYSBzdHJpbmcgdG8gY3VycmVudCBwb3NpdGlvbiBpbiByZWFkIHN0cmVhbS4gVGhpcyBtZXRob2QgaXMKLQkgKiB1c3VhbGx5IGludm9rZWQgYnkgdG9rZW4tbGV2ZWwgZXJyb3IgaGFuZGxlcnMuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgU3RyaW5nIHRvIGluc2VydAotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydChTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZXRzIGEgPGk+RG9jdW1lbnRIYW5kbGVyIDwvaT4gaW5zdGFjZSBmb3IgdGhpcyBwYXJzZXIuCi0JICogCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRIYW5kbGVyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudEhhbmRsZXIoRG9jdW1lbnRIYW5kbGVyIGhhbmRsZXIpOwotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiB0aGlzIHBhcnNlciBwcmVzZXJ2ZSB3aGl0ZXNwYWNlcyBvciBub3QuIElmIHByZXNlcnZlLCB0aGUKLQkgKiBwYXJzZXIgY3JlYXRlIHRleHQgbm9kZSBmb3Igd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3MgYW5kIGRvZXMgbm90IGlnbm9yZQotCSAqIGNhcnJpYWdlIHJldHVybiBhbmQgbGluZSBmZWVkIGFmdGVyIHN0YXJ0IHRhZ3MgYW5kIGJlZm9yZSBlbmQgdGFncy4gQnkKLQkgKiBkZWZhdWx0IGEgcGFyc2VyIGlnbm9yZXMgd2hpdGVzcGFjZXMuCi0JICogCi0JICogQHNlZSAjZ2V0UHJlc2VydmVXaGl0ZXNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZXJ2ZVdoaXRlc3BhY2UoYm9vbGVhbiBwcmVzZXJ2KTsKLQotCXB1YmxpYyBIYXNodGFibGU8Tm9kZSwgQW5kQ29udGV4dD4gZ2V0QW5kTWFwKCk7Ci0KLQlwdWJsaWMgSGFzaHRhYmxlPE5vZGUsIEludGVnZXI+IGdldFNlcU1hcCgpOwotCi0JcHVibGljIEhhc2h0YWJsZTxOb2RlLCBOb2RlPiBnZXRQbHVzTWFwKCk7Ci0KLQlwdWJsaWMgSU1vZGVsR3JvdXBbXSBnZXRTZXFBcnJheSgpOwotCQotCS8qKgotCSAqIFNldCB1cCBzeW50YXggaW5mb3JtYXRpb24gZGVzY3JpYmVkIGJ5IERURC4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSUQKLQkgKiAgICAgICAgICAgIERURCdzIHB1YmxpYyBpZCB0aGF0IHNwZWNpZmllcyB3aGljaCB0byBzZXQgdXAuCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXBEVEQoU3RyaW5nIHB1YmxpY0lEKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uOwkKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2Vycm9yaGFuZGxlci9BdHRyaWJ1dGVWYWx1ZUVycm9ySGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2Vycm9yaGFuZGxlci9BdHRyaWJ1dGVWYWx1ZUVycm9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmY3YTQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9lcnJvcmhhbmRsZXIvQXR0cmlidXRlVmFsdWVFcnJvckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5lcnJvcmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5JU0dNTENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLklTR01MUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVWYWx1ZUVycm9ySGFuZGxlciBpbXBsZW1lbnRzIElUb2tlbkVycm9ySGFuZGxlciwgSVNHTUxDb25zdGFudHMgewotCXB1YmxpYyBib29sZWFuIGhhbmRsZUVycm9yKGludCBjb2RlLCBJU0dNTFBhcnNlciBwYXJzZXIsIFN0cmluZyBlcnJvclN0cikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChjb2RlICE9IElQYXJzZXJFcnJvci5BVFRSX1ZBTFVFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgZ3RJbmRleCA9IGVycm9yU3RyLmluZGV4T2YoJz4nKTsKLQkJaW50IGx0SW5kZXg7Ci0JCWNoYXIgY2xvc2luZ0NoYXI7Ci0JCWludCBlcnJvclN0ckxlbiA9IGVycm9yU3RyLmxlbmd0aCgpOwotCQlpZiAoZXJyb3JTdHJMZW4gPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKChjbG9zaW5nQ2hhciA9IGVycm9yU3RyLmNoYXJBdCgwKSkgIT0gJ1wnJyAmJiBjbG9zaW5nQ2hhciAhPSAnIicpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoZ3RJbmRleCA+IDEgJiYgKGx0SW5kZXggPSBlcnJvclN0ci5pbmRleE9mKCc8JykpID4gZ3RJbmRleCkgewotCQkJLy8gY2FzZSBvZiBhdHRyPSJ2YWx1ZV93aXRob3V0X2VuZHF1b3RlPiAuLi4gPG5leHRUYWcKLQkJCWludCBuZXh0VGFnQmVnaW4gPSBsdEluZGV4ICsgMTsKLQkJCWlmIChlcnJvclN0ci5jaGFyQXQobmV4dFRhZ0JlZ2luKSA9PSAnLycpCi0JCQkJbmV4dFRhZ0JlZ2luKys7Ci0JCQlpbnQgbmV4dFRhZ0VuZCA9IG5leHRUYWdCZWdpbjsKLQkJCWNoYXIgYzA7Ci0JCQl3aGlsZSAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGMwID0gZXJyb3JTdHIuY2hhckF0KG5leHRUYWdFbmQpKQotCQkJCQl8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoYzApKSB7Ci0JCQkJbmV4dFRhZ0VuZCsrOwotCQkJfQotCQkJaWYgKG5leHRUYWdCZWdpbiA9PSBuZXh0VGFnRW5kKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCVN0cmluZyBuZXh0VGFnID0gZXJyb3JTdHIuc3Vic3RyaW5nKG5leHRUYWdCZWdpbiwgbmV4dFRhZ0VuZCk7Ci0JCQlpZiAocGFyc2VyLmdldERURCgpLmdldEVsZW1lbnREZWZpbml0aW9uKG5leHRUYWcpICE9IG51bGwpIHsKLQkJCQlwYXJzZXIuZXJyb3IoSVBhcnNlckVycm9yLlNUQVJUVEFHX1NZTlRBWF9FUlIsCi0JCQkJCQkiIGF0dHJpYnV0ZSB2YWx1ZSBtaXNzZWQgY2xvc2luZyBxdW90YXRpb24uIik7Ci0JCQkJcGFyc2VyLmluc2VydChlcnJvclN0ci5zdWJzdHJpbmcoMCwgZ3RJbmRleCkgKyBjbG9zaW5nQ2hhcgotCQkJCQkJKyBlcnJvclN0ci5zdWJzdHJpbmcoZ3RJbmRleCkpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGVsc2UgaWYgKGVycm9yU3RyLmNoYXJBdChlcnJvclN0ckxlbiAtIDEpID09IGNsb3NpbmdDaGFyCi0JCQkJJiYgZXJyb3JTdHIubGVuZ3RoKCkgPiAxCi0JCQkJJiYgZXJyb3JTdHIuY2hhckF0KGVycm9yU3RyTGVuIC0gMikgPT0gJz0nKSB7Ci0JCQkvLyBjYXNlIG9mIGF0dHI9InZhbHVlX3dpdGhvdXRfZW5kcXVvdGUKLQkJCS8vIG5leHRBdHRyTmFtZT0ibmV4dEF0dHJWYWx1ZS4uLgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvclN0ckxlbjsgaSsrKSB7Ci0JCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoZXJyb3JTdHIuY2hhckF0KGkpKSkgewotCQkJCQlpbnQgZXJyb3JQb2ludCA9IGk7Ci0JCQkJCXdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGVycm9yU3RyLmNoYXJBdCgrK2kpKSkKLQkJCQkJCTsKLQkJCQkJY2hhciBjMDsKLQkJCQkJLy8gaW50IG5leHRBdHRyTmFtZVN0YXJ0ID0gaTsKLQkJCQkJYzAgPSBlcnJvclN0ci5jaGFyQXQoaSk7Ci0JCQkJCWlmICghQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGMwKQotCQkJCQkJCSYmICFDaGFyYWN0ZXIuaXNVcHBlckNhc2UoYzApKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZG8gewotCQkJCQkJaSsrOwotCQkJCQkJYzAgPSBlcnJvclN0ci5jaGFyQXQoaSk7Ci0JCQkJCX0gd2hpbGUgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjMCkKLQkJCQkJCQl8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoYzApKTsKLQkJCQkJd2hpbGUgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYzAgPSBlcnJvclN0ci5jaGFyQXQoaSkpKQotCQkJCQkJaSsrOwotCQkJCQlpZiAoYzAgPT0gJz0nKSB7Ci0JCQkJCQlwYXJzZXIuaW5zZXJ0KGVycm9yU3RyLnN1YnN0cmluZygwLCBlcnJvclBvaW50KQotCQkJCQkJCQkrIGNsb3NpbmdDaGFyICsgZXJyb3JTdHIuc3Vic3RyaW5nKGVycm9yUG9pbnQpKTsKLQkJCQkJCXBhcnNlci5lcnJvcihJUGFyc2VyRXJyb3IuU1RBUlRUQUdfU1lOVEFYX0VSUiwKLQkJCQkJCQkJIiBhdHRyaWJ1dGUgdmFsdWUgbWlzc2VkIGNsb3NpbmcgcXVvdGF0aW9uLiIpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9lcnJvcmhhbmRsZXIvRGVmYXVsdEVycm9ySGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2Vycm9yaGFuZGxlci9EZWZhdWx0RXJyb3JIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMjZiMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2Vycm9yaGFuZGxlci9EZWZhdWx0RXJyb3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuZXJyb3JoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSUVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLklTR01MUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbC5FbGVtZW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJRXJyb3JIYW5kbGVyfQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVycm9ySGFuZGxlciBpbXBsZW1lbnRzIElFcnJvckhhbmRsZXIgewotCS8qKgotCSAqIFNldCBhcHByb3ByaWF0ZSBjb250ZXh0IGVsZW1lbnQgdG8gY29udGV4dCBpZiBhbiBlcnJvciBvY2N1cnMuCi0JICogPG9sPgotCSAqIDxsaT4gSWYgPGNvZGU+bm9kZTwvY29kZT4gaXMgYSBzaW5nbGV0b24gaW5zdGFuY2UsIGZpbmQgYW5vdGhlciBlbGVtZW50Ci0JICogd2l0aCB0aGUgc2FtZSBuYW1lLiBBbmQgaWYgdGhlIG90aGVyIGhhcyBubyBhdHRyaWJ1dGUsIG1lcmdlIHRoZW0uCi0JICogPGxpPiBJZiBjdXJyZW50IGNvbnRleHQgaGFzIGFscmVhZHkgYW4gaWxsZWdhbCBjaGlsZHJlbiwgaXQgZmFpbHMgKFNpbmNlCi0JICogdmVyLjEuMS5hNykuCi0JICogPGxpPiBJZiA8Y29kZT5lcnJvck5vZGU8L2NvZGU+IGlzIHVua25vd24gZWxlbWVudCwgZmFpbC4gPCEtLQotCSAqIDxsaT4gaWYgPGNvZGU+ZXJyb3JOb2RlPC9jb2RlPiBpcyBhbiBlbGVtZW50IHdpdGggdGhlIHNhbWUgbmFtZSBhcwotCSAqIGNvbnRleHQgYW5kIGhhcyBubyBhdHRyaWJ1dGUsIGl0IGludGVycHJldCA8Y29kZT5lcnJvck5vZGU8L2NvZGU+IGFzCi0JICogZW5kdGFnLgotCSAqIDxsaT4gSWYgPGNvZGU+bm9kZTwvY29kZT4gaXMgYW5kIEVsZW1lbnQgYW5kIGVtcHR5IGNoaWxkIGVsZW1lbnQsIGl0Ci0JICogYWxzbyBmYWlscy4KLQkgKiA8bGk+IE90aGVyd2lzZSBzZWFyY2hlcyBhIHByb3BlciBwYXJlbnQgZnJvbSBjdXJyZW50IGNvbnRleHQgdG8KLQkgKiBvdXRlci1tb3N0IGFuZCByaWdodC1tb3N0IG5vZGUuIC0tPgotCSAqIDwvb2w+Ci0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIGlsbGVnYWwgY2hpbGQKLQkgKiBAcmV0dXJuIHRydWUgaWYgZm91bmQsIG90aGVyd2lzZSBmYWxzZQotCSAqIEBzZWUgSVNHTUxQYXJzZXIjZ2V0Q29udGV4dCgpCi0JICogQHNlZSBJU0dNTFBhcnNlciNzZXRDb250ZXh0KG9yZy53M2MuZG9tLkVsZW1lbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlRXJyb3IoaW50IGNvZGUsIElQYXJzZXIgcGFyc2VyLCBOb2RlIGVycm9yTm9kZSkKLQkJCXRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChlcnJvck5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgZXJyb3JOb2RlOwotCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQlFbGVtZW50RGVmaW5pdGlvbiBlZDsKLQkJCWlmICgoZWQgPSAoKElTR01MUGFyc2VyKXBhcnNlcikuZ2V0RFREKCkuZ2V0RWxlbWVudERlZmluaXRpb24oZWxlbWVudE5hbWUpKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIGlmIChlZC5pc1NpbmdsZXRvbigpKSB7Ci0JCQkJTm9kZUxpc3Qgb3RoZXJzID0gcGFyc2VyLmdldERvY3VtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoCi0JCQkJCQllbGVtZW50TmFtZSk7Ci0JCQkJaWYgKG90aGVycy5nZXRMZW5ndGgoKSA9PSAxKSB7Ci0JCQkJCUVsZW1lbnQgYW5vdGhlciA9IChFbGVtZW50KSBvdGhlcnMuaXRlbSgwKTsKLQkJCQkJaWYgKHBhcnNlci5hdXRvR2VuZXJhdGVkKGFub3RoZXIpKSB7Ci0JCQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCQkJCQlhbm90aGVyLnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQkJCQl9Ci0JCQkJCQlwYXJzZXIuc2V0Q3VycmVudE5vZGUoYW5vdGhlcik7Ci0JCQkJCQlwYXJzZXIuc2V0Q29udGV4dChhbm90aGVyKTsKLQkJCQkJCXBhcnNlci5lcnJvcihJUGFyc2VyRXJyb3IuSUxMRUdBTF9DSElMRCwgZXJyb3JOb2RlICsgIiBhbmQgIgotCQkJCQkJCQkrIGFub3RoZXIgKyAiIGFyZSBkdXBsaWNhdGVkLiIpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9lcnJvcmhhbmRsZXIvSVRva2VuRXJyb3JIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvZXJyb3JoYW5kbGVyL0lUb2tlbkVycm9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWExZDAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9lcnJvcmhhbmRsZXIvSVRva2VuRXJyb3JIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuZXJyb3JoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSVBhcnNlckVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuSVNHTUxQYXJzZXI7Ci0KLQotLyoqCi0gKiBUb2tlbi1sZXZsZSBlcnJvciBoYW5kbGVyIGludGVyZmFjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVG9rZW5FcnJvckhhbmRsZXIgewotCS8qKgotCSAqIEhhbmRsZXMgZXJyb3Igd2hvc2UgdHlwZSBpcyBzcGVjaWZpZWQgYnkgPGNvZGU+Y29kZTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gY29kZQotCSAqICAgICAgICAgICAgZXJyb3IgdHlwZS4gVGhpcyBwYXJhbWV0ZXIgcmVwcmVzZW50cyB0b2tlbml6ZXIncyBzdGF0ZS4gSW4KLQkgKiAgICAgICAgICAgIG90aGVyIHdvcmRzLCB3aGVyZSB0aGUgdG9rZW5pemVyIHJlYWQuIDxjb2RlPkNvZGU8L2NvZGU+Ci0JICogICAgICAgICAgICBtdXN0IGJlIHtAbGluayBJUGFyc2VyRXJyb3IjQVRUUl9WQUxVRX0gKEVycm9yIG9jY3VycyB3aGVuIGEKLQkgKiAgICAgICAgICAgIHRva2VuaXplciBpcyB0byByZWFkIGF0dHJpYnV0ZSdzIHZhbHVlKSwKLQkgKiAgICAgICAgICAgIHtAbGluayBJUGFyc2VyRXJyb3IjQkVGT1JFX0FUVFJOQU1FfSAodG8gcmVhZCBhdHRyaWJ1dGUncwotCSAqICAgICAgICAgICAgbmFtZSkgb3Ige0BsaW5rIElQYXJzZXJFcnJvciNUQUdfTkFNRX0gKHRvIHJlYWQgdGFnIG5hbWUpLgotCSAqICAgICAgICAgICAgSWYgc3RyaW5nIHRvIHN1YnN0aXR1dGUgaXMgZGllY292ZXJlZCwgdGhhdCBjYW4gYmUgaW5zZXJ0ZWQgdG8KLQkgKiAgICAgICAgICAgIGN1cnJlbnQgcmVhZGluZyBwb3NpdGlvbi4KLQkgKiBAcGFyYW0gcGFyc2VyCi0JICogICAgICAgICAgICBjYWxsZXIgb2YgdGhpcyBoYW5kbGVyLgotCSAqIEBwYXJhbSBlcnJvclN0cgotCSAqICAgICAgICAgICAgc3RyaW5nIHRoYXQgY2F1c2VzIHRoZSBlcnJvci4KLQkgKiBAcmV0dXJuIHRydWUgaWYgZXJyb3Igd2FzIGhhbmRsZWQuIE90aGVyd2lzZSBmYWxzZS4KLQkgKiBAc2VlIElTR01MUGFyc2VyI2luc2VydChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhbmRsZUVycm9yKGludCBjb2RlLCBJU0dNTFBhcnNlciBwYXJzZXIsIFN0cmluZyBlcnJvclN0cikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9lcnJvcmhhbmRsZXIvSW50ZXJsZWF2ZWRFbmR0YWdFeGNoYW5nZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9lcnJvcmhhbmRsZXIvSW50ZXJsZWF2ZWRFbmR0YWdFeGNoYW5nZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhNDg3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvZXJyb3JoYW5kbGVyL0ludGVybGVhdmVkRW5kdGFnRXhjaGFuZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmVycm9yaGFuZGxlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JRXJyb3JMb2dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5odG1sLnBhcnNlci5IVE1MUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuSVNHTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5pbXBsLkVsZW1lbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbC5FbmRUYWc7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqICBBIHNhbXBsZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBvZiB7QGxpbmsgSUVycm9ySGFuZGxlcn0uCi0gKiAgVGhpcyBjbGFzcyBpcyBleHBlcmltZW50YWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnRlcmxlYXZlZEVuZHRhZ0V4Y2hhbmdlciBpbXBsZW1lbnRzIElFcnJvckhhbmRsZXIgewotICAgIC8qKgotICAgICAqICBFeGNoYW5nZXMgaW50ZXJsZWF2ZWQgZW5kIHRhZ3MuICBGb3IgZXhhbXBsZSwgY2hhbmdlcwotICAgICAqIDxwcmU+Ci0gICAgICogICAmbHQ7Y2VudGVyJmd0OyZsdDtmb250Jmd0Oy4uLiZsdDsvY2VudGVyJmd0OyZsdDsvZm9udCZndDsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiB0bwotICAgICAqIDxwcmU+Ci0gICAgICogICAmbHQ7Y2VudGVyJmd0OyZsdDtmb250Jmd0Oy4uLiZsdDsvZm9udCZndDsmbHQ7L2NlbnRlciZndDsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiBAcGFyYW0gY29kZSBJZiB7QGxpbmsgSVBhcnNlckVycm9yI1NVRERFTl9FTkRUQUd9LCB0cmllcyB0byBleGNoYW5nZS4gIAotICAgICAqIEBwYXJhbSBlcnJvck5vZGUgc3VkZGVuIGVuZHRhZy4gIEl0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgCi0gICAgICoge0BsaW5rIEVuZFRhZ30KLSAgICAgKiBPdGhlcndpc2UsIGRvZXMgbm90aGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVFcnJvcihpbnQgY29kZSwgSVBhcnNlciBwYXJzZXIsIE5vZGUgZXJyb3JOb2RlKQotCXRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JaWYgKCEoY29kZSA9PSBJUGFyc2VyRXJyb3IuU1VEREVOX0VORFRBRyAmJiBlcnJvck5vZGUgaW5zdGFuY2VvZiBFbmRUYWcpKSB7Ci0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0JLy8gc2VhcmNoZXMgYW4gZWxlbWVudCB3aXRob3V0IGFuIHVub21pdHRhYmxlIGVuZHRhZy4KLQlmb3IgKE5vZGUgcE5vZGUgPSBwYXJzZXIuZ2V0Q29udGV4dCgpOwotCSAgICAgcE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50OyBwTm9kZSA9IHBOb2RlLmdldFBhcmVudE5vZGUoKSkgewotCSAgICBpZiAoIXBOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShlcnJvck5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJRWxlbWVudERlZmluaXRpb24gZWQgPSAoKElTR01MUGFyc2VyKXBhcnNlcikuZ2V0RFREKCkuZ2V0RWxlbWVudERlZmluaXRpb24ocE5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCS8vIGlmIGZvdW5kLCB0cnkgdG8gZXhjaGFuZ2UgZW5kdGFncy4KLQkJaWYgKCFlZC5lbmRUYWdPbWl0dGFibGUoKSAmJiBleGNoYW5nZUVuZHRhZyhwYXJzZXIsIGVycm9yTm9kZSwgZWQuZ2V0TmFtZSgpKSkgewotCQkgICAgcmV0dXJuIHRydWU7Ci0JCX0KLQkgICAgfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0YXJnZXQgdGFyZ2V0IGVuZHRhZydzIG5hbWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGV4Y2hhbmdlRW5kdGFnKElQYXJzZXIgcGFyc2VyLCBOb2RlIGVycm9yTm9kZSwgU3RyaW5nIHRhcmdldCkKLQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCS8vIG1ha2VzIGxvb2sgYWhlYWQgYnVmZmVyCi0JTm9kZSBmb0J1ZltdID0gbmV3IE5vZGVbcGFyc2VyLmdldFB1c2hiYWNrQnVmZmVyU2l6ZSgpLzJdOyAgCi0JaW50IGk7Ci0JLy8gc2VhcmNocyBhbiB0YXJnZXQgZW5kdGFnIGFuZCBzdG9yZSBub2RlcyB0byBidWZmZXIgc2ltdWx0YW5lb3VzbHkKLQlmb3IgKGkgPSAwOyBpIDwgcGFyc2VyLmdldFB1c2hiYWNrQnVmZmVyU2l6ZSgpLzI7IGkrKykgewotCSAgICBOb2RlIGZvID0gcGFyc2VyLmdldE5vZGUoKTsKLQkgICAgaWYgKGZvIGluc3RhbmNlb2YgRW5kVGFnKSB7Ci0JCS8vIElmIGZvdW5kIGV4Y2hhbmdlIGVuZHRhZ3MgYW5kIHB1c2hlcyBiYWNrIHRoZW0gdG8gdGhlIHBhcnNlcgotCQlpZiAoZm8uZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHRhcmdldCkpIHsKLQkJICAgIHBhcnNlci5lcnJvcihJUGFyc2VyRXJyb3IuU1VEREVOX0VORFRBRywgZXJyb3JOb2RlICsgIiBhbmQgIiArIGZvICsgCi0JCQkJICIgYXJlIGludGVybGVhdmVkLiBTbyBleGNoYW5nZSBpdCBieSBhbiBlcnJvciBoYW5kbGVyLiIpOwotCQkgICAgcGFyc2VyLnB1c2hCYWNrTm9kZShlcnJvck5vZGUpOwotCQkgICAgd2hpbGUgKGkgPiAwKSBwYXJzZXIucHVzaEJhY2tOb2RlKGZvQnVmWy0taV0pOwotCQkgICAgcGFyc2VyLnB1c2hCYWNrTm9kZShmbyk7Ci0JCSAgICByZXR1cm4gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICAgIGZvQnVmW2ldID0gZm87Ci0JfQotCXdoaWxlIChpID4gMCkgcGFyc2VyLnB1c2hCYWNrTm9kZShmb0J1ZlstLWldKTsKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8qKgotICAgICAqICBKdXN0IGZvciB0ZXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7Ci0JdHJ5IHsKLQkgICAgSFRNTFBhcnNlciBwYXJzZXIgPSBuZXcgSFRNTFBhcnNlcigpOwotCSAgICBwYXJzZXIuYWRkRXJyb3JMb2dMaXN0ZW5lcihuZXcgSUVycm9yTG9nTGlzdGVuZXIoKSB7Ci0JCSAgICBwdWJsaWMgdm9pZCBlcnJvckxvZyhpbnQgY29kZSwgU3RyaW5nIG1zZykgewotCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7IAotCQkgICAgfQotCQl9KTsKLQkgICAgcGFyc2VyLnNldEVycm9ySGFuZGxlcihuZXcgSW50ZXJsZWF2ZWRFbmR0YWdFeGNoYW5nZXIoKSk7Ci0JICAgIHBhcnNlci5wYXJzZShuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oYXJnc1swXSkpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9lcnJvcmhhbmRsZXIvUmFuZ2VFeHBhbmRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2Vycm9yaGFuZGxlci9SYW5nZUV4cGFuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZmY0OWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2Vycm9yaGFuZGxlci9SYW5nZUV4cGFuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuZXJyb3JoYW5kbGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSUVycm9yTG9nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSVBhcnNlckVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uaHRtbC5wYXJzZXIuSFRNTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLklTR01MRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5pbXBsLkVuZFRhZzsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLS8qKgotICogQSBzYW1wbGUgaW1wbGVtZW50YXRpb24gY2xhc3Mgb2Yge0BsaW5rIElFcnJvckhhbmRsZXJ9LgotICovCi1wdWJsaWMgY2xhc3MgUmFuZ2VFeHBhbmRlciBpbXBsZW1lbnRzIElFcnJvckhhbmRsZXIgewotCXB1YmxpYyBib29sZWFuIGhhbmRsZUVycm9yKGludCBjb2RlLCBJUGFyc2VyIHBhcnNlciwgTm9kZSBlcnJvck5vZGUpCi0JCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlpZiAoIShjb2RlID09IElQYXJzZXJFcnJvci5TVURERU5fRU5EVEFHICYmIGVycm9yTm9kZSBpbnN0YW5jZW9mIEVuZFRhZykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlWZWN0b3I8RWxlbWVudD4gZWxlbWVudHNUb0JlSW5zZXJ0ZWQgPSBuZXcgVmVjdG9yPEVsZW1lbnQ+KCk7Ci0JCWZvciAoTm9kZSBub2RlID0gcGFyc2VyLmdldENvbnRleHQoKTsgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7IG5vZGUgPSBub2RlCi0JCQkJLmdldFBhcmVudE5vZGUoKSkgewotCQkJU3RyaW5nIHRhZ05hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKGVycm9yTm9kZS5nZXROb2RlTmFtZSgpKSkgewotCQkJCXBhcnNlci5zZXRDb250ZXh0KChFbGVtZW50KSBub2RlLmdldFBhcmVudE5vZGUoKSk7Ci0JCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gZWxlbWVudHNUb0JlSW5zZXJ0ZWQuZWxlbWVudHMoKTsgZQotCQkJCQkJLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCQlFbGVtZW50IGVsID0gKEVsZW1lbnQpIGUubmV4dEVsZW1lbnQoKTsKLQkJCQkJcGFyc2VyLmdldENvbnRleHQoKS5hcHBlbmRDaGlsZChlbCk7Ci0JCQkJCXBhcnNlci5zZXRDb250ZXh0KGVsKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWVsZW1lbnRzVG9CZUluc2VydGVkLmFkZEVsZW1lbnQocGFyc2VyLmdldERvY3VtZW50KCkKLQkJCQkJCS5jcmVhdGVFbGVtZW50KHRhZ05hbWUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSnVzdCBmb3IgdGVzdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotCQl0cnkgewotCQkJSFRNTFBhcnNlciBwYXJzZXIgPSBuZXcgSFRNTFBhcnNlcigpOwotCQkJcGFyc2VyLmFkZEVycm9yTG9nTGlzdGVuZXIobmV3IElFcnJvckxvZ0xpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGVycm9yTG9nKGludCBjb2RlLCBTdHJpbmcgbXNnKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwotCQkJCX0KLQkJCX0pOwotCQkJcGFyc2VyLnNldEVycm9ySGFuZGxlcihuZXcgUmFuZ2VFeHBhbmRlcigpKTsKLQkJCXBhcnNlci5wYXJzZShuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oYXJnc1swXSkpOwotCQkJKChJU0dNTERvY3VtZW50KSBwYXJzZXIuZ2V0RG9jdW1lbnQoKSkucHJpbnRBc1NHTUwobmV3IFByaW50V3JpdGVyKAotCQkJCQlTeXN0ZW0ub3V0KSwgZmFsc2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvQXR0cmlidXRlRGVmaW5pdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvQXR0cmlidXRlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGI4YmU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL0F0dHJpYnV0ZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogQXR0cmlidXRlIGRlZmluaXRpb24KLSAqIAotICogQHNlZSBFbGVtZW50RGVmaW5pdGlvbiNnZXRBdHRyaWJ1dGVEZWYoamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIGNsYXNzIEF0dHJpYnV0ZURlZmluaXRpb24gewotCS8vIERlY2xhcmVkVmFsdWVUeXBlCi0Jc3RhdGljIGZpbmFsIGludCBDREFUQSA9IDE7Ci0KLQlzdGF0aWMgZmluYWwgaW50IElEID0gMjsKLQotCXN0YXRpYyBmaW5hbCBpbnQgSURSRUYgPSAzOwotCi0Jc3RhdGljIGZpbmFsIGludCBJRFJFRlMgPSA0OwotCi0Jc3RhdGljIGZpbmFsIGludCBOVU1CRVIgPSA1OwotCi0Jc3RhdGljIGZpbmFsIGludCBOQU1FID0gNjsKLQotCXN0YXRpYyBmaW5hbCBpbnQgTkFNRV9UT0tFTl9HUk9VUCA9IDc7Ci0KLQlzdGF0aWMgZmluYWwgaW50IE5NVE9LRU4gPSA4OwotCi0Jc3RhdGljIGZpbmFsIGludCBOQU1FUyA9IDk7Ci0KLQkvLyBEZWZhdWx0VmFsdWVUeXBlCi0Jc3RhdGljIGZpbmFsIGludCBGSVhFRCA9IDE7Ci0KLQlzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVEID0gMjsKLQotCXN0YXRpYyBmaW5hbCBpbnQgSU1QTElFRCA9IDM7Ci0KLQlwcml2YXRlIGludCBkZWNsYXJlZFR5cGUgPSAwOwotCi0JcHJpdmF0ZSBpbnQgZGVmYXVsdFR5cGUgPSAwOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCVN0cmluZyBkZWZhdWx0VmFsdWU7Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IG5hbWVUb2tlbnM7Ci0KLQlBdHRyaWJ1dGVEZWZpbml0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0Jdm9pZCBhZGROYW1lVG9rZW4oU3RyaW5nIHRva2VuKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotCQlpZiAoZGVjbGFyZWRUeXBlICE9IE5BTUVfVE9LRU5fR1JPVVApCi0JCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24oKTsKLQkJaWYgKG5hbWVUb2tlbnMgPT0gbnVsbCkKLQkJCW5hbWVUb2tlbnMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJbmFtZVRva2Vucy5hZGRFbGVtZW50KHRva2VuKTsKLQl9Ci0KLQlpbnQgZ2V0RGVjbGFyZWRUeXBlKCkgewotCQlyZXR1cm4gZGVjbGFyZWRUeXBlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRlY2xhcmVkVHlwZVN0cnNbXSA9IHsgbnVsbCwgIkNEQVRBIiwgIklEIiwgIklEUkVGIiwKLQkJCSJJRFJFRlMiLCAiTlVNQkVSIiwgIk5BTUUiLCAiTkFNRV9UT0tFTl9HUk9VUCIsICJOTVRPS0VOIiwgIk5BTUVTIiB9OwotCi0JU3RyaW5nIGdldERlY2xhcmVkVHlwZVN0cigpIHsKLQkJcmV0dXJuIGRlY2xhcmVkVHlwZVN0cnNbZGVjbGFyZWRUeXBlXTsKLQl9Ci0KLQlpbnQgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0VHlwZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0JU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCWJvb2xlYW4gbmFtZVRva2VuR3JvdXBDb250YWluKFN0cmluZyB0b2tlbikgewotCQlyZXR1cm4gbmFtZVRva2Vucy5jb250YWlucyh0b2tlbik7Ci0JfQotCi0Jdm9pZCBzZXREZWNsYXJlZFR5cGUoaW50IHR5cGUpIHsKLQkJZGVjbGFyZWRUeXBlID0gdHlwZTsKLQl9Ci0KLQl2b2lkIHNldERlZmF1bHRUeXBlKGludCB0eXBlKSB7Ci0JCWRlZmF1bHRUeXBlID0gdHlwZTsKLQl9Ci0KLQl2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgc3RyKSB7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gc3RyOwotCX0KLQotCXZvaWQgc2V0TmFtZShTdHJpbmcgYXJnKSB7Ci0JCW5hbWUgPSBhcmc7Ci0JfQotCi0JLy8gZm9yIGRlYnVnLgotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyByZXQgPSBuYW1lICsgJ1x0JzsKLQkJaWYgKGRlY2xhcmVkVHlwZSA9PSBOQU1FX1RPS0VOX0dST1VQKSB7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBuYW1lVG9rZW5zLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJcmV0ID0gcmV0ICsgJyAnICsgZS5uZXh0RWxlbWVudCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0ID0gcmV0ICsgZGVjbGFyZWRWYWx1ZVRhYmxlW2RlY2xhcmVkVHlwZV07Ci0JCX0KLQkJcmV0ID0gcmV0ICsgJ1x0JzsKLQkJaWYgKGRlZmF1bHRWYWx1ZVRhYmxlW2RlZmF1bHRUeXBlXSAhPSBudWxsKSB7Ci0JCQlyZXQgPSByZXQgKyBkZWZhdWx0VmFsdWVUYWJsZVtkZWZhdWx0VHlwZV0gKyAnICc7Ci0JCX0KLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXQgPSByZXQgKyBkZWZhdWx0VmFsdWU7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjbGFyZWRWYWx1ZVRhYmxlW10gPSB7IG51bGwsICJDREFUQSIsICJJRCIsCi0JCQkiSURSRUYiLCAiSURSRUZTIiwgIk5VTUJFUiIsICJOQU1FIiwgbnVsbCwgIk5NVE9LRU4iIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFZhbHVlVGFibGVbXSA9IHsgbnVsbCwgIiNGSVhFRCIsICIjUkVRVUlSRUQiLAotCQkJIiNJTVBMSUVEIiB9OwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvQXR0cmlidXRlTGlzdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL0F0dHJpYnV0ZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMWU0MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvQXR0cmlidXRlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbDsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3Q7Ci0KLWNsYXNzIEF0dHJpYnV0ZUxpc3RJbXBsIGltcGxlbWVudHMgQXR0cmlidXRlTGlzdCB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNbXSA9IG5ldyBTdHJpbmdbOF07Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXSA9IG5ldyBTdHJpbmdbOF07Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlc1tdID0gbmV3IFN0cmluZ1s4XTsKLQotICAgIHByaXZhdGUgaW50IG51bSA9IDA7Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhwYW5kKCkgewotICAgICAgICBTdHJpbmcgbmV3QXJyYXlbXSA9IG5ldyBTdHJpbmdbbnVtICogMl07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmFtZXMsIDAsIG5ld0FycmF5LCAwLCBudW0pOwotICAgICAgICBuYW1lcyA9IG5ld0FycmF5OwotICAgICAgICBuZXdBcnJheSA9IG5ldyBTdHJpbmdbbnVtICogMl07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkodmFsdWVzLCAwLCBuZXdBcnJheSwgMCwgbnVtKTsKLSAgICAgICAgdmFsdWVzID0gbmV3QXJyYXk7Ci0gICAgICAgIG5ld0FycmF5ID0gbmV3IFN0cmluZ1tudW0gKiAyXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0eXBlcywgMCwgbmV3QXJyYXksIDAsIG51bSk7Ci0gICAgICAgIHR5cGVzID0gbmV3QXJyYXk7Ci0gICAgfQotCi0gICAgZmluYWwgdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaW50IG51bSA9IHRoaXMubnVtOwotICAgICAgICBpZiAobmFtZXMubGVuZ3RoID09IG51bSkKLSAgICAgICAgICAgIGV4cGFuZCgpOwotICAgICAgICBuYW1lc1tudW1dID0gbmFtZTsKLSAgICAgICAgdHlwZXNbbnVtXSA9IHR5cGU7Ci0gICAgICAgIHZhbHVlc1tudW1dID0gdmFsdWU7Ci0gICAgICAgIHRoaXMubnVtID0gbnVtICsgMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIG51bTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoaW50IGkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lc1tpXTsKLSAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKGludCBpKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZXNbaV07Ci0gICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoaW50IGkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZXNbaV07Ci0gICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZShTdHJpbmcgbmFtZSkgewotICAgICAgICBmb3IgKGludCBpID0gbnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGlmIChuYW1lc1tpXS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlc1tpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSBudW0gLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgaWYgKG5hbWVzW2ldLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1tpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvRFREUGFyc2VFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL0RURFBhcnNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNGJlOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvRFREUGFyc2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5QYXJzZUV4Y2VwdGlvbjsKLQotY2xhc3MgRFREUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBQYXJzZUV4Y2VwdGlvbiB7Ci0JcHVibGljIERURFBhcnNlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBEVERQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0JCXN1cGVyKG1zZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvRFREUGFyc2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9EVERQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlOGE5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9EVERQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLklTR01MQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwubW9kZWxncm91cC5BbmRNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwubW9kZWxncm91cC5JTW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLm1vZGVsZ3JvdXAuT3B0TW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLm1vZGVsZ3JvdXAuT3JNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwubW9kZWxncm91cC5QbHVzTW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLm1vZGVsZ3JvdXAuUmVwTW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLm1vZGVsZ3JvdXAuU2VxTW9kZWxHcm91cDsKLQotY2xhc3MgRFREUGFyc2VyIGltcGxlbWVudHMgSVNHTUxDb25zdGFudHMgewotCXByaXZhdGUgRFREVG9rZW5pemVyIHRva2VuaXplcjsKLQotCXByaXZhdGUgU3RhY2s8RFREVG9rZW5pemVyPiB0b2tlbml6ZXJTdGFjayA9IG5ldyBTdGFjazxEVERUb2tlbml6ZXI+KCk7Ci0KLQlwcml2YXRlIFNHTUxEb2NUeXBlRGVmIGR0ZDsKLQotCURURFBhcnNlcihEVERUb2tlbml6ZXIgdG9rZW5pemVyLCBTR01MRG9jVHlwZURlZiBkdGQpIHsKLQkJdGhpcy50b2tlbml6ZXIgPSB0b2tlbml6ZXI7Ci0JCXRoaXMuZHRkID0gZHRkOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIGEgRFRELiBPbmx5IHN1cHBvcnRzIGluaXRpYWxseSBzZXR0ZWQgcHVibGljIGVudGl0eS4gUmVhbCBlbnRpdHkgaXMKLQkgKiBpZ25vcmVkLgotCSAqIAotCSAqIEByZXR1cm4gdG9wIEVsZW1lbnREZWZpbml0aW9uIGluc3RhbmNlLiBJZiBET0NUWVBFIGRlY2xhcmF0aW9uIGRvZXMgbm90Ci0JICogCi0JICovCi0JZmluYWwgRWxlbWVudERlZmluaXRpb24gcmVhZERURCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlFbGVtZW50RGVmaW5pdGlvbiBsYXN0RGVmID0gbnVsbDsKLQkJbG9vcDogd2hpbGUgKHRydWUpIHsKLQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gRU9GKQotCQkJCWJyZWFrOwotCQkJd2hpbGUgKHRva2VuaXplci50dHlwZSA9PSBDT01NRU5UKQotCQkJCXRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCXN3aXRjaCAodG9rZW5pemVyLnR0eXBlKSB7Ci0JCQljYXNlIE1ETzogLy8gPCEKLQkJCQlzd2l0Y2ggKHRva2VuaXplci5uZXh0VG9rZW4oKSkgewotCQkJCWNhc2UgTkFNRV9DSEFSOgotCQkJCQlTdHJpbmcgc3RyID0gdG9rZW5pemVyLnN2YWw7Ci0JCQkJCWlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZSgiRUxFTUVOVCIpKSB7IC8vCi0JCQkJCQlsYXN0RGVmID0gcmVhZEVsZW1lbnREZWZpbml0aW9uKCk7Ci0JCQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIkFUVExJU1QiKSkgewotCQkJCQkJcmVhZEF0dHJpYnV0ZUxpc3QoKTsKLQkJCQkJfSBlbHNlIGlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZSgiRU5USVRZIikpIHsKLQkJCQkJCXJlYWRFbnRpdHkoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigiVW5rbm93biBEZWNsYXJhdGlvbjogIgotCQkJCQkJCQkrIHN0cik7Ci0JCQkJCX0KLQkJCQkJLy8gY29uc3VtZSAnPicKLQkJCQkJd2hpbGUgKHRva2VuaXplci5uZXh0VG9rZW4oKSAhPSBUQUdDKQotCQkJCQkJOwotCQkJCQlicmVhazsKLQkJCQljYXNlIERTTzogLy8gWwotCQkJCQlpZiAobWFyaygpKSB7Ci0JCQkJCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpID09ICdbJykgewotCQkJCQkJCXRva2VuaXplci5zd2l0Y2hUbyhERUZBVUxUKTsKLQkJCQkJCQlsYXN0RGVmID0gcmVhZERURCgpOwotCQkJCQkJCXRva2VuaXplci5zd2l0Y2hUbyhUQUcpOwotCQkJCQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gJ10nCi0JCQkJCQkJCQkmJiB0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gJ10nCi0JCQkJCQkJCQkmJiB0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gJz4nKQotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gJ1snKSB7Ci0JCQkJCQkJdG9rZW5pemVyLnNraXBUb0RTQygpOwotCQkJCQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gJ10nCi0JCQkJCQkJCQkmJiB0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gJz4nKQotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24oImludmFsaWQgbWFyayByZWdpb24uIik7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJpbnZhbGlkIGRlY2xhcmF0aW9uIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAnJSc6Ci0JCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQkJU0dNTEVudGl0eVJlZmVyZW5jZSByZWYgPSByZWFkRW50aXR5UmVmZXJlbmNlKCk7Ci0JCQkJU0dNTEVudGl0eURlY2xhcmF0aW9uIGVkID0gcmVmLmdldEVudGl0eURlY2xhcmF0aW9uKCk7Ci0JCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQkJdG9rZW5pemVyU3RhY2sucHVzaCh0b2tlbml6ZXIpOwotCQkJCQl0b2tlbml6ZXIgPSBuZXcgRFREVG9rZW5pemVyKGVkLmdldFJlcGxhY2VtZW50UmVhZGVyKCkpOwotCQkJCQlyZWFkRFREKCk7Ci0JCQkJCXRva2VuaXplciA9IChEVERUb2tlbml6ZXIpIHRva2VuaXplclN0YWNrLnBvcCgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBR086IC8vIDwKLQkJCWNhc2UgRVRBR086IC8vIDwvCi0JCQljYXNlIE1JU0M6IC8vCi0JCQlkZWZhdWx0OgotCQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJCWJyZWFrIGxvb3A7Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGFzdERlZjsKLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnREZWZpbml0aW9uIHJlYWRFbGVtZW50RGVmaW5pdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uIHsKLQkJRWxlbWVudERlZmluaXRpb24gZGVmc1tdID0gcmVhZEVsZW1lbnRUeXBlKCk7Ci0JCWJvb2xlYW4gc3RhcnQgPSBmYWxzZTsKLQkJYm9vbGVhbiBlbmQgPSBmYWxzZTsKLQkJYm9vbGVhbiBub3RYSFRNTCA9IGR0ZC50b1N0cmluZygpLmluZGV4T2YoIlhIVE1MIikgPCAwOwotCi0JCWlmIChub3RYSFRNTCkgewotCQkJc3RhcnQgPSBvbWl0KCk7Ci0JCQllbmQgPSBvbWl0KCk7Ci0JCX0KLQkJSU1vZGVsR3JvdXAgY29udGVudCA9IGV4cCgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlYWQ6ICIrZGVmc1swXS50b1N0cmluZygpKyIgIisKLQkJLy8gY29udGVudC50b1N0cmluZygpKTsKLQotCQkvLyBjYW4ndCBvbWl0Ci0JCWlmICghbm90WEhUTUwgJiYgY29udGVudC50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoIkVNUFRZIikpIHsKLQkJCWVuZCA9IHRydWU7Ci0JCX0KLQotCQlFbGVtZW50RGVmaW5pdGlvbiBleGNlcHRpb25zW107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVmcy5sZW5ndGg7IGkrKykgewotCQkJZGVmc1tpXS5zZXRTdGFydFRhZyhzdGFydCk7Ci0JCQlkZWZzW2ldLnNldEVuZFRhZyhlbmQpOwotCQkJZGVmc1tpXS5zZXRDb250ZW50TW9kZWwoY29udGVudCk7Ci0JCX0KLQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSBJTkNPKSB7Ci0JCQlleGNlcHRpb25zID0gaW5jbHVzaW9uKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlkZWZzW2ldLnNldEluY2x1c2lvbihleGNlcHRpb25zKTsKLQkJCX0KLQkJfSBlbHNlIGlmICh0b2tlbml6ZXIudHR5cGUgPT0gRVhDTykgewotCQkJZXhjZXB0aW9ucyA9IGluY2x1c2lvbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZGVmc1tpXS5zZXRFeGNsdXNpb24oZXhjZXB0aW9ucyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0b2tlbml6ZXIucHVzaEJhY2soKTsKLQkJfQotCQlyZXR1cm4gZGVmc1swXTsKLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnREZWZpbml0aW9uW10gcmVhZEVsZW1lbnRUeXBlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLAotCQkJSU9FeGNlcHRpb24gewotCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpID09IExFRlRQQVIpIHsKLQkJCVZlY3RvcjxFbGVtZW50RGVmaW5pdGlvbltdPiB0bXBWZWN0b3IgPSBuZXcgVmVjdG9yPEVsZW1lbnREZWZpbml0aW9uW10+KCk7Ci0JCQl0bXBWZWN0b3IuYWRkRWxlbWVudChtYWtlRWxlbWVudEFycmF5KGF0b20oKSkpOwotCQkJd2hpbGUgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSAnfCcpCi0JCQkJdG1wVmVjdG9yLmFkZEVsZW1lbnQobWFrZUVsZW1lbnRBcnJheShhdG9tKCkpKTsKLQkJCWlmICh0b2tlbml6ZXIudHR5cGUgIT0gJyknKQotCQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigiaW52YWxpZCBFTEVNRU5UIHR5cGUiKTsKLQkJCWludCBzaXplID0gMDsKLQkJCWZvciAoRW51bWVyYXRpb24gZSA9IHRtcFZlY3Rvci5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykKLQkJCQlzaXplICs9ICgoRWxlbWVudERlZmluaXRpb25bXSkgKGUubmV4dEVsZW1lbnQoKSkpLmxlbmd0aDsKLQkJCUVsZW1lbnREZWZpbml0aW9uIHJldFtdID0gbmV3IEVsZW1lbnREZWZpbml0aW9uW3NpemVdOwotCQkJaW50IGkgPSAwOwotCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gdG1wVmVjdG9yLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJRWxlbWVudERlZmluaXRpb24gZGVmc1tdID0gKEVsZW1lbnREZWZpbml0aW9uW10pIChlCi0JCQkJCQkubmV4dEVsZW1lbnQoKSk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZWZzLmxlbmd0aDsgaisrKQotCQkJCQlyZXRbaSsrXSA9IGRlZnNbal07Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UgewotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQlyZXR1cm4gbWFrZUVsZW1lbnRBcnJheShhdG9tKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgRW50aXR5LgotCSAqIAotCSAqIDxQUkU+Ci0JICogCi0JICogPCFFTlRJVFkgLi4uLi4gPiBeIF4gYWxyZWFkeSByZWFkIGF0IHRoaXMgcG9pbnQuIFJlYWRzIHVudGlsIHRoaXMgcG9pbnQuCi0JICogCi0JICogPC9QUkU+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRFbnRpdHkoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGVudGl0eU5hbWU7Ci0JCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gJyUnKSB7Ci0JCQlpZiAodG9rZW5pemVyLnR0eXBlID09IE5BTUVfQ0hBUikgewotCQkJCWVudGl0eU5hbWUgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCQlpbnQgbmV4dCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQlpZiAobmV4dCA9PSBOQU1FX0NIQVIKLQkJCQkJCSYmIHRva2VuaXplci5zdmFsLmVxdWFsc0lnbm9yZUNhc2UoIkNEQVRBIikpIHsKLQkJCQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSBTVFJJTkcpIHsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihlbnRpdHlOYW1lKyIgOiAiK3Rva2VuaXplci5zdmFsKTsKLQkJCQkJCWR0ZC5wdXRFbnRpdHlEZWNsYXJhdGlvbihlbnRpdHlOYW1lLCB0b2tlbml6ZXIuc3ZhbCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKG5leHQgPT0gU1RSSU5HKSB7Ci0JCQkJCS8vIGFkZCAwNDA5MzAgdG8gc3VwcG9ydCB4aHRtbC0qLmVudAotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZW50aXR5TmFtZSsiIDogIisgdG9rZW5pemVyLnN2YWwpOwotCQkJCQlkdGQucHV0RW50aXR5RGVjbGFyYXRpb24oZW50aXR5TmFtZSwgdG9rZW5pemVyLnN2YWwpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJpbnZhbGlkIGVudGl0eSIpOwotCQl9IGVsc2UgaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSBOQU1FX0NIQVIpIHsKLQkJCWVudGl0eU5hbWUgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gU1RSSU5HKSB7Ci0JCQkJaWYgKHRva2VuaXplci50dHlwZSA9PSBOQU1FX0NIQVIKLQkJCQkJCSYmIHRva2VuaXplci5zdmFsLmVxdWFsc0lnbm9yZUNhc2UoIlBVQkxJQyIpKSB7Ci0JCQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gU1RSSU5HKSB7Ci0JCQkJCQlTdHJpbmcgcHVibGljSUQgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCQkJCVN0cmluZyBlbnRpdHlGaWxlTmFtZSA9IChTdHJpbmcpIFNHTUxQYXJzZXIucHViRW50aXR5TWFwCi0JCQkJCQkJCS5nZXQocHVibGljSUQpOwotCQkJCQkJaWYgKGVudGl0eUZpbGVOYW1lICE9IG51bGwpIHsKLQkJCQkJCQlkdGQucHV0UHVibGljRW50aXR5KGVudGl0eU5hbWUsIHB1YmxpY0lELAotCQkJCQkJCQkJZW50aXR5RmlsZU5hbWUpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZW50aXR5TmFtZSArICIgOiAiICsgcHVibGljSUQKLQkJCQkJCQkJCSsgIiA6ICIgKyBlbnRpdHlGaWxlTmFtZSk7Ci0JCQkJCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJpbnZhbGlkIGVudGl0eSIpOwotCQkJCQkJfQotCQkJCQkJLy8gY2hlY2sgc3ludGF4Ci0JCQkJCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpID09ICc+JykgewotCQkJCQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0gZWxzZSBpZiAodG9rZW5pemVyLnR0eXBlID09IFNUUklORykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7IC8vIGlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gU1RSSU5HKSB7Ci0JCQkJZHRkLnB1dEVudGl0eURlY2xhcmF0aW9uKGVudGl0eU5hbWUsIHRva2VuaXplci5zdmFsKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJpbnZhbGlkIGVudGl0eSIpOwotCX0KLQotCXByaXZhdGUgU0dNTEVudGl0eVJlZmVyZW5jZSByZWFkRW50aXR5UmVmZXJlbmNlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLAotCQkJSU9FeGNlcHRpb24gewotCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpID09ICclJykgewotCQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSBOQU1FX0NIQVIgfHwgdG9rZW5pemVyLnR0eXBlID09IFBDREFUQSkgewotCQkJCVN0cmluZyBzdHIgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpICE9ICc7JykKLQkJCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQkJcmV0dXJuIGR0ZC5nZXRFbnRpdHlSZWZlcmVuY2Uoc3RyKTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24oImludmFsaWQgZW50aXR5IHJlZmVyZW5jZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkVG9rZW4oQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbiB7Ci0JCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gTkFNRV9DSEFSIHx8IHRva2VuaXplci50dHlwZSA9PSBOVU0pIHsKLQkJCWF0dHIuYWRkTmFtZVRva2VuKHRva2VuaXplci5zdmFsKTsKLQkJfSBlbHNlIGlmICh0b2tlbml6ZXIudHR5cGUgPT0gJyUnKSB7Ci0JCQl0b2tlbml6ZXIucHVzaEJhY2soKTsKLQkJCVNHTUxFbnRpdHlSZWZlcmVuY2UgZXIgPSByZWFkRW50aXR5UmVmZXJlbmNlKCk7Ci0JCQlTR01MRW50aXR5RGVjbGFyYXRpb24gZWQgPSBlci5nZXRFbnRpdHlEZWNsYXJhdGlvbigpOwotCQkJdG9rZW5pemVyU3RhY2sucHVzaCh0b2tlbml6ZXIpOwotCQkJdG9rZW5pemVyID0gbmV3IERURFRva2VuaXplcihlZC5nZXRSZXBsYWNlbWVudFJlYWRlcigpLCBUQUcpOwotCQkJcmVhZFRva2VuR3JvdXAoYXR0cik7Ci0JCQl0b2tlbml6ZXIgPSAoRFREVG9rZW5pemVyKSB0b2tlbml6ZXJTdGFjay5wb3AoKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigiaW52YWxpZCB0b2tlbiIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRUb2tlbkdyb3VwKEF0dHJpYnV0ZURlZmluaXRpb24gYXR0cikKLQkJCXRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZWFkVG9rZW4oYXR0cik7Ci0JCXdoaWxlICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gJyknICYmIHRva2VuaXplci50dHlwZSAhPSBFT0YpIHsKLQkJCWlmICh0b2tlbml6ZXIudHR5cGUgIT0gJ3wnKQotCQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigiaW52YWxpZCB0b2tlbiBncm91cCIpOwotCQkJcmVhZFRva2VuKGF0dHIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgYW4gZXhwIEVYUCAtPiBURVJNIFsoLCBURVJNKSogfCAofCBURVJNKSogfCAoJiBURVJNKSpdCi0JICovCi0JcHJpdmF0ZSBJTW9kZWxHcm91cCBleHAoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJSU1vZGVsR3JvdXAgcmV0OwotCQlyZXQgPSB0ZXJtKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZXhwOiAiK3JldC50b1N0cmluZygpKTsKLQkJaW50IHRtcEMgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCXN3aXRjaCAodG1wQykgewotCQljYXNlICcsJzoKLQkJCVNlcU1vZGVsR3JvdXAgc2VxID0gbmV3IFNlcU1vZGVsR3JvdXAocmV0KTsKLQkJCXNlcS5hZGQodGVybSgpKTsKLQkJCXdoaWxlICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gJywnKQotCQkJCXNlcS5hZGQodGVybSgpKTsKLQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJaWYgKHNlcS5nZXRDaGlsZExlbmd0aCgpID4gZHRkLm1heFNlcUxlbmd0aCkgewotCQkJCWR0ZC5tYXhTZXFMZW5ndGggPSBzZXEuZ2V0Q2hpbGRMZW5ndGgoKTsKLQkJCX0KLQkJCXJldHVybiBzZXE7Ci0JCWNhc2UgJ3wnOgotCQkJcmV0ID0gbmV3IE9yTW9kZWxHcm91cChyZXQpOwotCQkJKChPck1vZGVsR3JvdXApIHJldCkuYWRkKHRlcm0oKSk7Ci0JCQl3aGlsZSAodG9rZW5pemVyLm5leHRUb2tlbigpID09ICd8JykKLQkJCQkoKE9yTW9kZWxHcm91cCkgcmV0KS5hZGQodGVybSgpKTsKLQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJcmV0dXJuIHJldDsKLQkJY2FzZSAnJic6Ci0JCQlyZXQgPSBuZXcgQW5kTW9kZWxHcm91cChyZXQpOwotCQkJKChBbmRNb2RlbEdyb3VwKSByZXQpLmFkZCh0ZXJtKCkpOwotCQkJd2hpbGUgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSAnJicpCi0JCQkJKChBbmRNb2RlbEdyb3VwKSByZXQpLmFkZCh0ZXJtKCkpOwotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQlyZXR1cm4gcmV0OwotCQlkZWZhdWx0OgotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJleHBkOiAiK3RtcEMpOwotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogVEVSTSAtPiBGQUNUT1IgWz8gfCArIHwgKl0KLQkgKi8KLQlwcml2YXRlIElNb2RlbEdyb3VwIHRlcm0oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJSU1vZGVsR3JvdXAgcmV0ID0gZmFjdG9yKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidGVybSByZXQ6ICIrcmV0LnRvU3RyaW5nKCkpOwotCQlpbnQgdG1wQyA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ0ZXJtIG5leHQ6ICIrdG1wQysiICIrKGNoYXIpdG1wQyk7Ci0JCXN3aXRjaCAodG1wQykgewotCQljYXNlIFFVRVNUSU9OOgotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ0ZXJtOiA/Iik7Ci0JCQlyZXQgPSBuZXcgT3B0TW9kZWxHcm91cChyZXQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUExVUzoKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidGVybTogKyIpOwotCQkJcmV0ID0gbmV3IFBsdXNNb2RlbEdyb3VwKHJldCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNVUxUSToKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidGVybTogKiIpOwotCQkJcmV0ID0gbmV3IFJlcE1vZGVsR3JvdXAocmV0KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ0ZXJtOiBlcnJvciIpOwotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyBhIGZhY3RvciBGQUNUT1IgLT4gQVRPTSAoRVhQKSBQQ0RBVEEgQ0RBVEEgRU1QVFkKLQkgKi8KLQlwcml2YXRlIElNb2RlbEdyb3VwIGZhY3RvcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlzd2l0Y2ggKHRva2VuaXplci5uZXh0VG9rZW4oKSkgewotCQljYXNlIExFRlRQQVI6Ci0JCQlJTW9kZWxHcm91cCByZXQgPSBleHAoKTsKLQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gJyknKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJmYWN0b3I6IGVycm9yIik7Ci0JCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJyZXQ6ICIgKyByZXQudG9TdHJpbmcoKQotCQkJCQkJKyAiIHN2YWw6ICIgKyB0b2tlbml6ZXIuc3ZhbCArICIgdHR5cGU6ICIKLQkJCQkJCSsgdG9rZW5pemVyLnR0eXBlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJmYWN0b3I6ICIrcmV0LnRvU3RyaW5nKCkpOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCWNhc2UgQ0RBVEE6Ci0JCQlyZXR1cm4gU0dNTFBhcnNlci5jZGF0YTsKLQkJY2FzZSBOVU06IC8vICNQQ0RBVEEKLQkJCWlmICh0b2tlbml6ZXIuc3ZhbC5lcXVhbHNJZ25vcmVDYXNlKCIjUENEQVRBIikpIHsKLQkJCQlyZXR1cm4gU0dNTFBhcnNlci5wY2RhdGE7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigic3ZhbDogIiArIHRva2VuaXplci5zdmFsCi0JCQkJCQkrICIgdHR5cGU6ICIgKyB0b2tlbml6ZXIudHR5cGUpOwotCQkJfQotCQlkZWZhdWx0OgotCQkJaWYgKHRva2VuaXplci50dHlwZSA9PSBOQU1FX0NIQVIKLQkJCQkJJiYgdG9rZW5pemVyLnN2YWwuZXF1YWxzSWdub3JlQ2FzZSgiRU1QVFkiKSkgewotCQkJCXJldHVybiBTR01MUGFyc2VyLmVtcHR5OwotCQkJfSBlbHNlIGlmICh0b2tlbml6ZXIudHR5cGUgPT0gTkFNRV9DSEFSCi0JCQkJCSYmIHRva2VuaXplci5zdmFsLmVxdWFsc0lnbm9yZUNhc2UoIkNEQVRBIikpIHsKLQkJCQlyZXR1cm4gU0dNTFBhcnNlci5jZGF0YTsKLQkJCX0KLQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJcmV0dXJuIGF0b20oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYWRzIGF0b20uIEFUT00gLT4gPE5BTUVfQ0hBUj4gRU5USVRZX1JFRkVSRU5DRQotCSAqLwotCXByaXZhdGUgSU1vZGVsR3JvdXAgYXRvbSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpID09IE5BTUVfQ0hBUikgewotCQkJcmV0dXJuIGR0ZC5jcmVhdGVFbGVtZW50RGVmaW5pdGlvbih0b2tlbml6ZXIuc3ZhbCk7Ci0JCX0gZWxzZSBpZiAodG9rZW5pemVyLnR0eXBlID09ICclJykgewotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQlTR01MRW50aXR5UmVmZXJlbmNlIGVyID0gcmVhZEVudGl0eVJlZmVyZW5jZSgpOwotCQkJU0dNTEVudGl0eURlY2xhcmF0aW9uIGVkID0gZXIuZ2V0RW50aXR5RGVjbGFyYXRpb24oKTsKLQkJCUlNb2RlbEdyb3VwIHJldCA9IGVkLmdldFJlcGxhY2VtZW50U3VidHJlZSgpOwotCQkJaWYgKHJldCA9PSBudWxsKSB7Ci0JCQkJdG9rZW5pemVyU3RhY2sucHVzaCh0b2tlbml6ZXIpOwotCQkJCXRva2VuaXplciA9IG5ldyBEVERUb2tlbml6ZXIoZWQuZ2V0UmVwbGFjZW1lbnRSZWFkZXIoKSwgVEFHKTsKLQkJCQlyZXQgPSBleHAoKTsKLQkJCQllZC5zZXRSZXBsYWNlbWVudFN1YnRyZWUocmV0KTsKLQkJCQl0b2tlbml6ZXIgPSAoRFREVG9rZW5pemVyKSB0b2tlbml6ZXJTdGFjay5wb3AoKTsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24oInN2YWw6ICIgKyB0b2tlbml6ZXIuc3ZhbCArICIgdHR5cGU6ICIKLQkJCQkJKyB0b2tlbml6ZXIudHR5cGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlY2xhcmVkVmFsdWUoQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbiB7Ci0JCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gTkFNRV9DSEFSKSB7Ci0JCQlTdHJpbmcgc3RyID0gdG9rZW5pemVyLnN2YWw7Ci0JCQlpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIkNEQVRBIikpIHsKLQkJCQlhdHRyLnNldERlY2xhcmVkVHlwZShBdHRyaWJ1dGVEZWZpbml0aW9uLkNEQVRBKTsKLQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIklEIikpIHsKLQkJCQlhdHRyLnNldERlY2xhcmVkVHlwZShBdHRyaWJ1dGVEZWZpbml0aW9uLklEKTsKLQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIklEUkVGIikpIHsKLQkJCQlhdHRyLnNldERlY2xhcmVkVHlwZShBdHRyaWJ1dGVEZWZpbml0aW9uLklEUkVGKTsKLQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIklEUkVGUyIpKSB7Ci0JCQkJYXR0ci5zZXREZWNsYXJlZFR5cGUoQXR0cmlidXRlRGVmaW5pdGlvbi5JRFJFRlMpOwotCQkJfSBlbHNlIGlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZSgiTkFNRSIpKSB7Ci0JCQkJYXR0ci5zZXREZWNsYXJlZFR5cGUoQXR0cmlidXRlRGVmaW5pdGlvbi5OQU1FKTsKLQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIk5VTUJFUiIpKSB7Ci0JCQkJYXR0ci5zZXREZWNsYXJlZFR5cGUoQXR0cmlidXRlRGVmaW5pdGlvbi5OVU1CRVIpOwotCQkJfSBlbHNlIGlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZSgiTk1UT0tFTiIpKSB7Ci0JCQkJYXR0ci5zZXREZWNsYXJlZFR5cGUoQXR0cmlidXRlRGVmaW5pdGlvbi5OTVRPS0VOKTsKLQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIk5BTUVTIikpIHsKLQkJCQlhdHRyLnNldERlY2xhcmVkVHlwZShBdHRyaWJ1dGVEZWZpbml0aW9uLk5BTUVTKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKHRva2VuaXplci5nZXRDdXJyZW50TGluZSgpCi0JCQkJCQkrICI6IHVua25vd24gZGVjbGFyZWQgdmFsdWUgIiArIHN0cik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodG9rZW5pemVyLnR0eXBlID09ICcoJykgewotCQkJYXR0ci5zZXREZWNsYXJlZFR5cGUoQXR0cmlidXRlRGVmaW5pdGlvbi5OQU1FX1RPS0VOX0dST1VQKTsKLQkJCXJlYWRUb2tlbkdyb3VwKGF0dHIpOwotCQl9IGVsc2UgaWYgKHRva2VuaXplci50dHlwZSA9PSAnJScpIHsKLQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJU0dNTEVudGl0eVJlZmVyZW5jZSBlciA9IHJlYWRFbnRpdHlSZWZlcmVuY2UoKTsKLQkJCVNHTUxFbnRpdHlEZWNsYXJhdGlvbiBlZCA9IGVyLmdldEVudGl0eURlY2xhcmF0aW9uKCk7Ci0JCQl0b2tlbml6ZXJTdGFjay5wdXNoKHRva2VuaXplcik7Ci0JCQl0b2tlbml6ZXIgPSBuZXcgRFREVG9rZW5pemVyKGVkLmdldFJlcGxhY2VtZW50UmVhZGVyKCksIFRBRyk7Ci0JCQlkZWNsYXJlZFZhbHVlKGF0dHIpOwotCQkJdG9rZW5pemVyID0gKERURFRva2VuaXplcikgdG9rZW5pemVyU3RhY2sucG9wKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24oImF0ICIgKyB0b2tlbml6ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlZmF1bHRWYWx1ZShBdHRyaWJ1dGVEZWZpbml0aW9uIGF0dHIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uIHsKLQkJc3dpdGNoICh0b2tlbml6ZXIubmV4dFRva2VuKCkpIHsKLQkJY2FzZSBOQU1FX0NIQVI6Ci0JCQlhdHRyLnNldERlZmF1bHRWYWx1ZSh0b2tlbml6ZXIuc3ZhbCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTVFJJTkc6Ci0JCQlTdHJpbmcgc3RyID0gdG9rZW5pemVyLnN2YWw7Ci0JCQlicmVhazsKLQkJY2FzZSBOVU06Ci0JCQlzdHIgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCWlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZSgiI1JFUVVJUkVEIikpIHsKLQkJCQlhdHRyLnNldERlZmF1bHRUeXBlKEF0dHJpYnV0ZURlZmluaXRpb24uUkVRVUlSRUQpOwotCQkJfSBlbHNlIGlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZSgiI0lNUExJRUQiKSkgewotCQkJCWF0dHIuc2V0RGVmYXVsdFR5cGUoQXR0cmlidXRlRGVmaW5pdGlvbi5JTVBMSUVEKTsKLQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoIiNGSVhFRCIpKSB7Ci0JCQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSBFT0YpIHsKLQkJCQkJdG9rZW5pemVyID0gKERURFRva2VuaXplcikgdG9rZW5pemVyU3RhY2sucGVlaygpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJCX0KLQkJCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpICE9IFNUUklORykgewotCQkJCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24odG9rZW5pemVyLmdldEN1cnJlbnRMaW5lKCkKLQkJCQkJCQkrICI6IFNUUklORyBtdXN0IGZvbGxvdyAjRklYRUQiKTsKLQkJCQl9Ci0JCQkJYXR0ci5zZXREZWZhdWx0VHlwZShBdHRyaWJ1dGVEZWZpbml0aW9uLkZJWEVEKTsKLQkJCQlzdHIgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCQkvLyBkYXRhIGlzIGVudGl0eT8KLQkJCQl0b2tlbml6ZXJTdGFjay5wdXNoKHRva2VuaXplcik7Ci0JCQkJdG9rZW5pemVyID0gbmV3IERURFRva2VuaXplcihuZXcgU3RyaW5nUmVhZGVyKHN0ciksIFRBRyk7Ci0JCQkJU0dNTEVudGl0eVJlZmVyZW5jZSByZWY7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVmID0gcmVhZEVudGl0eVJlZmVyZW5jZSgpOwotCQkJCQlhdHRyLnNldERlZmF1bHRWYWx1ZShyZWYuZ2V0RW50aXR5RGVjbGFyYXRpb24oKQotCQkJCQkJCS5nZXRSZXBsYWNlbWVudFN0cmluZygpKTsKLQkJCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWF0dHIuc2V0RGVmYXVsdFZhbHVlKHN0cik7Ci0JCQkJfQotCQkJCXRva2VuaXplciA9IChEVERUb2tlbml6ZXIpIHRva2VuaXplclN0YWNrLnBvcCgpOwotCQkJfSBlbHNlIHsKLQkJCQlhdHRyLnNldERlZmF1bHRWYWx1ZShzdHIpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZEF0dHJpYnV0ZUxpc3QoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmVhZEF0dHJpYnV0ZUxpc3QocmVhZEVsZW1lbnRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIHJlYWQgbGluZXMgaW4gYXR0bGlzdC4KLQkgKi8KLQlwcml2YXRlIEF0dHJpYnV0ZURlZmluaXRpb25bXSByZWFkQXR0cmlidXRlTGlzdChFbGVtZW50RGVmaW5pdGlvbiBkZWZzW10pCi0JCQl0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJVmVjdG9yPEF0dHJpYnV0ZURlZmluaXRpb24+IHYgPSBuZXcgVmVjdG9yPEF0dHJpYnV0ZURlZmluaXRpb24+KCk7Ci0JCXdoaWxlICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gJz4nICYmIHRva2VuaXplci50dHlwZSAhPSBFT0YpIHsKLQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJQXR0cmlidXRlRGVmaW5pdGlvbltdIGFkcyA9IGF0dHJpYnV0ZURlZmluaXRpb25MaXN0KGRlZnMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZHMubGVuZ3RoOyBpKyspCi0JCQkJdi5hZGRFbGVtZW50KGFkc1tpXSk7Ci0JCX0KLQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCUF0dHJpYnV0ZURlZmluaXRpb24gcmV0W10gPSBuZXcgQXR0cmlidXRlRGVmaW5pdGlvblt2LnNpemUoKV07Ci0JCXYuY29weUludG8ocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiByZWFkIGVhY2ggbGluZSBpbiBhdHRsaXN0LgotCSAqLwotCXByaXZhdGUgQXR0cmlidXRlRGVmaW5pdGlvbltdIGF0dHJpYnV0ZURlZmluaXRpb25MaXN0KAotCQkJRWxlbWVudERlZmluaXRpb24gZGVmc1tdKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSBOQU1FX0NIQVIpIHsKLQkJCUF0dHJpYnV0ZURlZmluaXRpb24gYWQgPSBuZXcgQXR0cmlidXRlRGVmaW5pdGlvbih0b2tlbml6ZXIuc3ZhbCk7Ci0JCQlkZWNsYXJlZFZhbHVlKGFkKTsKLQkJCWRlZmF1bHRWYWx1ZShhZCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZnMubGVuZ3RoOyBpKyspCi0JCQkJZGVmc1tpXS5hZGRBdHRyaWJ1dGVEZWZpbml0aW9uKGFkKTsKLQkJCUF0dHJpYnV0ZURlZmluaXRpb24gYWRzW10gPSBuZXcgQXR0cmlidXRlRGVmaW5pdGlvbltdIHsgYWQgfTsKLQkJCXJldHVybiBhZHM7Ci0JCX0gZWxzZSBpZiAodG9rZW5pemVyLnR0eXBlID09ICclJykgewotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQlTR01MRW50aXR5UmVmZXJlbmNlIGVyID0gcmVhZEVudGl0eVJlZmVyZW5jZSgpOwotCQkJU0dNTEVudGl0eURlY2xhcmF0aW9uIGVkID0gZXIuZ2V0RW50aXR5RGVjbGFyYXRpb24oKTsKLQkJCXRva2VuaXplclN0YWNrLnB1c2godG9rZW5pemVyKTsKLQkJCXRva2VuaXplciA9IG5ldyBEVERUb2tlbml6ZXIoZWQuZ2V0UmVwbGFjZW1lbnRSZWFkZXIoKSwgVEFHKTsKLQkJCUF0dHJpYnV0ZURlZmluaXRpb24gYWRzW10gPSByZWFkQXR0cmlidXRlTGlzdChkZWZzKTsKLQkJCXRva2VuaXplciA9IChEVERUb2tlbml6ZXIpIHRva2VuaXplclN0YWNrLnBvcCgpOwotCQkJcmV0dXJuIGFkczsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigiaWxsZWdhbCBhdHRsaXN0LiIpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWFyaygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpID09IE5BTUVfQ0hBUikgewotCQkJaWYgKHRva2VuaXplci5zdmFsLmVxdWFsc0lnbm9yZUNhc2UoIklOQ0xVREUiKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmICh0b2tlbml6ZXIuc3ZhbC5lcXVhbHNJZ25vcmVDYXNlKCJJR05PUkUiKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJsYXN0IHN2YWw6ICIgKyB0b2tlbml6ZXIuc3ZhbCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodG9rZW5pemVyLnR0eXBlID09ICclJykgewotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQlTR01MRW50aXR5UmVmZXJlbmNlIGVyID0gcmVhZEVudGl0eVJlZmVyZW5jZSgpOwotCQkJU0dNTEVudGl0eURlY2xhcmF0aW9uIGVkID0gZXIuZ2V0RW50aXR5RGVjbGFyYXRpb24oKTsKLQkJCXRva2VuaXplclN0YWNrLnB1c2godG9rZW5pemVyKTsKLQkJCXRva2VuaXplciA9IG5ldyBEVERUb2tlbml6ZXIoZWQuZ2V0UmVwbGFjZW1lbnRSZWFkZXIoKSwgVEFHKTsKLQkJCWJvb2xlYW4gcmV0ID0gbWFyaygpOwotCQkJdG9rZW5pemVyID0gKERURFRva2VuaXplcikgdG9rZW5pemVyU3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJzdmFsOiAiICsgdG9rZW5pemVyLnN2YWwgKyAiIHR0eXBlOiAiCi0JCQkJCSsgdG9rZW5pemVyLnR0eXBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRWxlbWVudERlZmluaXRpb25bXSBtYWtlRWxlbWVudEFycmF5KElNb2RlbEdyb3VwIG1vZGVsKQotCQkJdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgRWxlbWVudERlZmluaXRpb24pIHsKLQkJCUVsZW1lbnREZWZpbml0aW9uIHJldFtdID0geyAoRWxlbWVudERlZmluaXRpb24pIG1vZGVsIH07Ci0JCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgT3JNb2RlbEdyb3VwKSB7Ci0JCQlyZXR1cm4gKChPck1vZGVsR3JvdXApIG1vZGVsKS5nZXRDaGlsZHJlbigpOwotCQl9Ci0JCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigic3ZhbDogIiArIHRva2VuaXplci5zdmFsICsgIiB0dHlwZTogIgotCQkJCSsgdG9rZW5pemVyLnR0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyBhIHRva2VuIHRoYXQgcmVwcmVzZW50cyB3aGV0aGVyIHRhZyBpcyBvbWl0dGFibGUgb3Igbm90LiBPTUlUIC0+IC0KLQkgKiBPCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG9taXQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJc3dpdGNoICh0b2tlbml6ZXIubmV4dFRva2VuKCkpIHsKLQkJY2FzZSBPTUlUVEFCTEU6Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJY2FzZSBNSU5VUzoKLQkJCXJldHVybiBmYWxzZTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigiJ08nIG9yICctJyBpcyByZXF1aXJlZCBhdCAiCi0JCQkJCSsgdG9rZW5pemVyLmdldEN1cnJlbnRMaW5lKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBFbGVtZW50RGVmaW5pdGlvbltdIGluY2x1c2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlWZWN0b3I8RWxlbWVudERlZmluaXRpb25bXT4gdG1wVmVjdG9yID0gbmV3IFZlY3RvcjxFbGVtZW50RGVmaW5pdGlvbltdPigpOwotCQl0bXBWZWN0b3IuYWRkRWxlbWVudChtYWtlRWxlbWVudEFycmF5KGF0b20oKSkpOwotCQl3aGlsZSAodG9rZW5pemVyLm5leHRUb2tlbigpID09ICd8JykKLQkJCXRtcFZlY3Rvci5hZGRFbGVtZW50KG1ha2VFbGVtZW50QXJyYXkoYXRvbSgpKSk7Ci0JCWlmICh0b2tlbml6ZXIudHR5cGUgIT0gJyknKQotCQkJdGhyb3cgbmV3IERURFBhcnNlRXhjZXB0aW9uKCJzdmFsOiAiICsgdG9rZW5pemVyLnN2YWwgKyAiIHR0eXBlOiAiCi0JCQkJCSsgdG9rZW5pemVyLnR0eXBlKTsKLQkJaW50IHNpemUgPSAwOwotCQlmb3IgKEVudW1lcmF0aW9uIGUgPSB0bXBWZWN0b3IuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspCi0JCQlzaXplICs9ICgoRWxlbWVudERlZmluaXRpb25bXSkgKGUubmV4dEVsZW1lbnQoKSkpLmxlbmd0aDsKLQkJRWxlbWVudERlZmluaXRpb24gcmV0W10gPSBuZXcgRWxlbWVudERlZmluaXRpb25bc2l6ZV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gdG1wVmVjdG9yLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlFbGVtZW50RGVmaW5pdGlvbiBkZWZzW10gPSAoRWxlbWVudERlZmluaXRpb25bXSkgKGUubmV4dEVsZW1lbnQoKSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGRlZnMubGVuZ3RoOyBqKyspCi0JCQkJcmV0W2krK10gPSBkZWZzW2pdOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvRFREVG9rZW5pemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9EVERUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U3NjA1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9EVERUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLlBhcnNlRXhjZXB0aW9uOwotCi1jbGFzcyBEVERUb2tlbml6ZXIgZXh0ZW5kcyBTR01MVG9rZW5pemVyIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIFNHTUxUb2tlbml6ZXIgaW5zdGFuY2UuCi0JICogQHBhcmFtIHJlYWRlciByZWFkZXIgdGhhdCByZWFkIFNHTUwgRG9jdW1lbnRzLgotCSAqLwotCURURFRva2VuaXplcihSZWFkZXIgcmVhZGVyKSB7Ci0JCXN1cGVyKHJlYWRlciwgREVGQVVMVCk7Ci0JfQotCURURFRva2VuaXplcihSZWFkZXIgcmVhZGVyLCBpbnQgc3RhdGUpIHsKLQkJc3VwZXIocmVhZGVyLCBzdGF0ZSk7Ci0JfQotCXByb3RlY3RlZCBpbnQgZGVmYXVsdFN0YXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7Ci0JCWludCBjaDsKLQkJY2ggPSByZWFkKCk7Ci0JCXdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKWNoKSkKLQkJCWNoID0gcmVhZCgpOwotCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICclJyA6Ci0JCQkJcmV0dXJuICh0dHlwZSA9ICclJyk7Ci0JCQljYXNlICc8JyA6Ci0JCQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gJy8nKSB7Ci0JCQkJCXN0YXRlID0gVEFHOwotCQkJCQlyZXR1cm4gKHR0eXBlID0gRVRBR08pOwotCQkJCX0gZWxzZSBpZiAoY2ggPT0gJz8nKSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBkYXRhID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAnPicgJiYgY2ggIT0gRU9GKSB7Ci0JCQkJCQlkYXRhLmFwcGVuZCgoY2hhciljaCk7Ci0JCQkJCX0KLQkJCQkJc3ZhbCA9IGRhdGEudG9TdHJpbmcoKTsKLQkJCQkJcmV0dXJuICh0dHlwZSA9IFBJKTsKLQkJCQl9IGVsc2UgaWYgKGNoID09ICchJykgeyAvLyBkZWNsYXJhdGlvbi4KLQkJCQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gJy0nKSB7IC8vIDwhLQotCQkJCQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gJy0nKSB7IC8vIDwhLS0gZW50ZXIgY29tbWVudAotCQkJCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAnLScgJiYgY2ggIT0gRU9GKQotCQkJCQkJCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQkJCQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gJy0nKSB7IC8vIC0tCi0JCQkJCQkJCQl3aGlsZSAoKGNoID0gcmVhZCgpKSA9PSAnLScpCi0JCQkJCQkJCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQkJCQkJCVN0cmluZ0J1ZmZlciB3cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQkJCXdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKWNoKSkgewotCQkJCQkJCQkJCXdzLmFwcGVuZCgoY2hhciljaCk7Ci0JCQkJCQkJCQkJY2ggPSByZWFkKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAoY2ggPT0gJz4nKSB7Ci0JCQkJCQkJCQkJc3RhdGUgPSBERUZBVUxUOwotCQkJCQkJCQkJCXN2YWwgPSBuZXcgU3RyaW5nKHNiKTsKLQkJCQkJCQkJCQlyZXR1cm4gKHR0eXBlID0gQ09NTUVOVCk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXNiLmFwcGVuZCgiLS0iKTsKLQkJCQkJCQkJCQlzYi5hcHBlbmQod3MpOwotCQkJCQkJCQkJCXVucmVhZChjaCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSBpZiAoY2ggPT0gRU9GKSB7Ci0JCQkJCQkJCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24oCi0JCQkJCQkJCQkJIlVuZXhwZWNldGVkIEVPRiBpbiBjb21tZW50LiBhdCAiCi0JCQkJCQkJCQkJCSsgZ2V0UmVhZGVyKCkKLQkJCQkJCQkJCQkJKyAnOicKLQkJCQkJCQkJCQkJKyBnZXRDdXJyZW50TGluZSgpKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXNiLmFwcGVuZCgnLScpOwotCQkJCQkJCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7IC8vIDwhLSAKLQkJCQkJCQl1bnJlYWQoY2gpOwotCQkJCQkJCXVucmVhZCgnLScpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJfQotCQkJCQlzdGF0ZSA9IFRBRzsKLQkJCQkJcmV0dXJuICh0dHlwZSA9IE1ETyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJc3RhdGUgPSBUQUc7Ci0JCQkJCXJldHVybiAodHR5cGUgPSBTVEFHTyk7Ci0JCQkJfQotCQkJY2FzZSBFT0YgOgotCQkJCXJldHVybiAodHR5cGUgPSBFT0YpOwotCQkJY2FzZSAnOycgOgotCQkJCXJldHVybiAodHR5cGUgPSAnOycpOwotCQkJY2FzZSAnXScgOgotCQkJCXJldHVybiAodHR5cGUgPSAnXScpOwotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcigoY2hhciljaCkpIHsKLQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJcmV0dXJuIHJlYWROYW1lQ2hhcigpOwotCQkJCX0KLQkJCQl0aHJvdyBuZXcgRFREUGFyc2VFeGNlcHRpb24oCi0JCQkJCSJVbmtub3duIGNoYXJhY3RlciAnIgotCQkJCQkJKyAoY2hhciljaAotCQkJCQkJKyAiYXQgIgotCQkJCQkJKyBnZXRSZWFkZXIoKQotCQkJCQkJKyAnOicKLQkJCQkJCSsgZ2V0Q3VycmVudExpbmUoKSk7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgc2tpcFRvRFNDKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHJlYWQoKSAhPSAnXScpOwotCX0KLQlwcm90ZWN0ZWQgaW50IHRhZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjaDsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0aHJvdWdoKCk7Ci0JCXN3aXRjaCAoY2ggPSByZWFkKCkpIHsKLQkJCWNhc2UgJy0nIDoKLQkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgKGNoID0gcmVhZCgpKSkpIHsKLQkJCQkJcmV0dXJuICh0dHlwZSA9IE1JTlVTKTsKLQkJCQl9IGVsc2UgaWYgKGNoID09ICcoJykgewotCQkJCQlyZXR1cm4gKHR0eXBlID0gRVhDTyk7Ci0JCQkJfSBlbHNlIGlmIChjaCA9PSAnKScpIHsKLQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJcmV0dXJuICh0dHlwZSA9IE1JTlVTKTsKLQkJCQl9IGVsc2UgaWYgKCFDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhciljaCkpIHsKLQkJCQkJd2hpbGUgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKWNoKSAmJiBjaCAhPSAnPicpIHsKLQkJCQkJCXNiLmFwcGVuZCgoY2hhciljaCk7Ci0JCQkJCQljaCA9IHJlYWQoKTsKLQkJCQkJfQotCQkJCQl1bnJlYWQoY2gpOwotCQkJCQlzdmFsID0gbmV3IFN0cmluZyhzYik7Ci0JCQkJCXJldHVybiAodHR5cGUgPSBNSVNDKTsKLQkJCQl9Ci0JCQkJc2IuYXBwZW5kKCctJyk7Ci0JCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQl3aGlsZSAoQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpIChjaCA9IHJlYWQoKSkpKQotCQkJCQlzYi5hcHBlbmQoKGNoYXIpY2gpOwotCQkJCWlmIChjaCA9PSAnJScpIHsKLQkJCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl1bnJlYWQoY2gpOwotCQkJCX0KLQkJCQlzdmFsID0gbmV3IFN0cmluZyhzYik7Ci0JCQkJcmV0dXJuICh0dHlwZSA9IE5VTSk7Ci0JCQljYXNlICcrJyA6Ci0JCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpIChjaCA9IHJlYWQoKSkpKSB7Ci0JCQkJCXJldHVybiAodHR5cGUgPSBQTFVTKTsKLQkJCQl9IGVsc2UgaWYgKGNoID09ICcoJykgewotCQkJCQlyZXR1cm4gKHR0eXBlID0gSU5DTyk7Ci0JCQkJCS8vYWRkIDA0MDcwMyB0byBoYW5kbGUgKHRib2R5K3x0cispCi0JCQkJCS8vYWRkIDA0MDkyOSB0byBoYW5kbGUgKHRyKSs+Ci0JCQkJfSBlbHNlIGlmIChjaCA9PSAnKScgfHwgY2g9PSd8JyB8fCBjaD09Jz4nKSB7Ci0JCQkJCXVucmVhZChjaCk7Ci0JCQkJCXJldHVybiAodHR5cGUgPSBQTFVTKTsKLQkJCQl9IGVsc2UgaWYgKCFDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhciljaCkpIHsKLQkJCQkJd2hpbGUgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKWNoKSAmJiBjaCAhPSAnPicpIHsKLQkJCQkJCXNiLmFwcGVuZCgoY2hhciljaCk7Ci0JCQkJCQljaCA9IHJlYWQoKTsKLQkJCQkJfQotCQkJCQl1bnJlYWQoY2gpOwotCQkJCQlzdmFsID0gbmV3IFN0cmluZyhzYik7Ci0JCQkJCXJldHVybiAodHR5cGUgPSBNSVNDKTsKLQkJCQl9Ci0JCQkJc2IuYXBwZW5kKCcrJyk7Ci0JCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQl3aGlsZSAoQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpIChjaCA9IHJlYWQoKSkpKQotCQkJCQlzYi5hcHBlbmQoKGNoYXIpY2gpOwotCQkJCWlmIChjaCA9PSAnJScpIHsKLQkJCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl1bnJlYWQoY2gpOwotCQkJCX0KLQkJCQlzdmFsID0gbmV3IFN0cmluZyhzYik7Ci0JCQkJcmV0dXJuICh0dHlwZSA9IE5VTSk7Ci0JCQljYXNlICcjJyA6Ci0JCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQl3aGlsZSAoQ2hhcmFjdGVyLmlzTGV0dGVyKChjaGFyKSAoY2ggPSByZWFkKCkpKQotCQkJCQl8fCBDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhciljaCkpCi0JCQkJCXNiLmFwcGVuZCgoY2hhciljaCk7Ci0JCQkJdW5yZWFkKGNoKTsKLQkJCQlzdmFsID0gbmV3IFN0cmluZyhzYik7Ci0JCQkJcmV0dXJuICh0dHlwZSA9IE5VTSk7Ci0JCQljYXNlICdcJycgOgotCQkJY2FzZSAnIicgOgotCQkJCWludCBjbG9zaW5nID0gY2g7Ci0JCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gY2xvc2luZykgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSBpZiAoY2ggPT0gRU9GKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0JCQkJCQkJIlVuZXhwZWN0ZWQgRU9GIGF0ICIKLQkJCQkJCQkJKyBnZXRSZWFkZXIoKQotCQkJCQkJCQkrICc6JwotCQkJCQkJCQkrIGdldEN1cnJlbnRMaW5lKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlzdmFsID0gbmV3IFN0cmluZyhzYik7Ci0JCQkJcmV0dXJuICh0dHlwZSA9IFNUUklORyk7Ci0JCQljYXNlICc+JyA6Ci0JCQkJc3RhdGUgPSBERUZBVUxUOwotCQkJCXJldHVybiAodHR5cGUgPSAnPicpOwotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcigoY2hhciljaCkpIHsKLQkJCQkJaWYgKGNoID09ICdPJykgewotCQkJCQkJaW50IGNoMTsKLQkJCQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSAoY2gxID0gcmVhZCgpKSkpCi0JCQkJCQkJcmV0dXJuICh0dHlwZSA9IE9NSVRUQUJMRSk7Ci0JCQkJCQl1bnJlYWQoY2gxKTsKLQkJCQkJfQotCQkJCQl1bnJlYWQoY2gpOwotCQkJCQlyZXR1cm4gcmVhZE5hbWVDaGFyKCk7Ci0JCQkJfSBlbHNlIGlmIChDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhciljaCkpIHsKLQkJCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQkJY2ggPSByZWFkKCk7Ci0JCQkJCXdoaWxlIChDaGFyYWN0ZXIuaXNEaWdpdCgoY2hhciljaCkpIHsKLQkJCQkJCXNiLmFwcGVuZCgoY2hhciljaCk7Ci0JCQkJCQljaCA9IHJlYWQoKTsKLQkJCQkJfQotCQkJCQlpZiAoY2ggPT0gJyUnKSB7Ci0JCQkJCQlzYi5hcHBlbmQoKGNoYXIpY2gpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJfQotCQkJCQlzdmFsID0gbmV3IFN0cmluZyhzYik7Ci0JCQkJCXJldHVybiAodHR5cGUgPSBOVU0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiAodHR5cGUgPSBjaCk7Ci0JCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgaW50IHJlYWROYW1lQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjaCA9IHJlYWQoKTsKLQkJaWYgKENoYXJhY3Rlci5pc0xldHRlcigoY2hhciljaCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXNiLmFwcGVuZCgoY2hhciljaCk7Ci0JCQljaCA9IHJlYWQoKTsKLQkJCXdoaWxlIChDaGFyYWN0ZXIuaXNMZXR0ZXIoKGNoYXIpY2gpCi0JCQkJfHwgQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpY2gpCi0JCQkJfHwgY2ggPT0gJy4nCi0JCQkJfHwgY2ggPT0gJy0nCi0JCQkJfHwgY2ggPT0gJzonCi0JCQkJfHwgY2ggPT0gJyMnKSB7Ci0JCQkJc2IuYXBwZW5kKChjaGFyKWNoKTsKLQkJCQljaCA9IHJlYWQoKTsKLQkJCX0KLQkJCXVucmVhZChjaCk7Ci0JCQlzdmFsID0gc2IudG9TdHJpbmcoKTsKLQkJCXJldHVybiAodHR5cGUgPSBOQU1FX0NIQVIpOwotCQl9IGVsc2UgewotCQkJdW5yZWFkKGNoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRocm91Z2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgY2g7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQljaCA9IHJlYWQoKTsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoY2hhciljaCkpIHsKLQkJCQlpZiAoY2ggPT0gJy0nKSB7Ci0JCQkJCWlmICgoY2ggPSByZWFkKCkpID09ICctJykgeyAvLyBnZXR0aW5nIGludG8gYSBjb21tZW50LgotCQkJCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAnLScgJiYgY2ggIT0gRU9GKTsgLy8gLQotCQkJCQkJCWlmIChjaCA9PSBFT0YpIHsKLQkJCQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmV4cGVjdGVkIEVPRiBpbiBjb21tZW50Iik7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChyZWFkKCkgPT0gJy0nKSB7IC8vIC0tIGdldHRpbmcgb3V0IG9mIGEgY29tbWVudAotCQkJCQkJCQl0aHJvdWdoKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXVucmVhZChjaCk7Ci0JCQkJCQl1bnJlYWQoJy0nKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXVucmVhZChjaCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9EZWZhdWx0RG9jdW1lbnRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9EZWZhdWx0RG9jdW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZGZhNDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvRGVmYXVsdERvY3VtZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5JU0dNTFBhcnNlcjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBEZWZhdWx0IERvY3VtZW50SGFuZGxlciBjbGFzcy4gVGhpcyBjbGFzcyBtYWtlcyBsaW5rZWQgbGlzdCBvZiBkb2N1bWVudAotICogaGFuZGxlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RG9jdW1lbnRIYW5kbGVyIGltcGxlbWVudHMgRG9jdW1lbnRIYW5kbGVyIHsKLQkvKioKLQkgKiBOZXh0IERvY3VtZW50SGFuZGxlciBtZXNzYWdlcyBhcmUgZm9yd2FyZGVkIHRvLgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudEhhbmRsZXIgYW5vdGhlcjsKLQotCS8qKgotCSAqIFBhcnNlciBpbnN0YW5jZSB3aGljaCB0aGlzIGluc3RhbmNlIGlzIGFkZGVkIHRvIGFuZCBob2xkaW5nIGEgbmV4dAotCSAqIGhhbmRsZXIuCi0JICovCi0JcHJvdGVjdGVkIElTR01MUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgRGVmYXVsdERvY3VtZW50SGFuZGxlciB0aGF0IHBvaW50cyBuZXh0IERvY3VtZW50SGFuZGxlciBob2xkCi0JICogYnkgdGhlIHBhcnNlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyc2VyCi0JICogICAgICAgICAgICBwYXJzZXIgaW5zdGFuY2UgdGhhdCBob2xkcyBhIG5leHQgaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgRGVmYXVsdERvY3VtZW50SGFuZGxlcihTR01MUGFyc2VyIHBhcnNlcikgewotCQl0aGlzLmFub3RoZXIgPSBwYXJzZXIuZ2V0RG9jdW1lbnRIYW5kbGVyKCk7Ci0JCXRoaXMucGFyc2VyID0gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEp1c3QgZm9yd2FyZHMgdGhpcyBtZXRob2QgaW52b2thdGlvbiB3aXRoIDxjb2RlPmxvY2F0b3I8L2NvZGU+IHRvIHRoZQotCSAqIG5leHQgaGFuZGxlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7Ci0JCWlmIChhbm90aGVyICE9IG51bGwpCi0JCQlhbm90aGVyLnNldERvY3VtZW50TG9jYXRvcihsb2NhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBKdXN0IGZvcndhcmRzIHRoaXMgbWV0aG9kIGludm9rYXRpb24gd2l0aCA8Y29kZT5sb2NhdG9yPC9jb2RlPiB0byB0aGUKLQkgKiBuZXh0IGhhbmRsZXIuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAoYW5vdGhlciAhPSBudWxsKQotCQkJYW5vdGhlci5zdGFydERvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSnVzdCBmb3J3YXJkcyB0aGlzIG1ldGhvZCBpbnZva2F0aW9uIHdpdGggPGNvZGU+bG9jYXRvcjwvY29kZT4gdG8gdGhlCi0JICogbmV4dCBoYW5kbGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChhbm90aGVyICE9IG51bGwpCi0JCQlhbm90aGVyLmVuZERvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSnVzdCBmb3J3YXJkcyB0aGlzIG1ldGhvZCBpbnZva2F0aW9uIHdpdGggPGNvZGU+bG9jYXRvcjwvY29kZT4gdG8gdGhlCi0JICogbmV4dCBoYW5kbGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlTGlzdCBhdHRzKQotCQkJdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChhbm90aGVyICE9IG51bGwpCi0JCQlhbm90aGVyLnN0YXJ0RWxlbWVudChuYW1lLCBhdHRzKTsKLQl9Ci0KLQkvKioKLQkgKiBKdXN0IGZvcndhcmRzIHRoaXMgbWV0aG9kIGludm9rYXRpb24gd2l0aCA8Y29kZT5sb2NhdG9yPC9jb2RlPiB0byB0aGUKLQkgKiBuZXh0IGhhbmRsZXIuCi0JICovCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChhbm90aGVyICE9IG51bGwpCi0JCQlhbm90aGVyLmVuZEVsZW1lbnQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogSnVzdCBmb3J3YXJkcyB0aGlzIG1ldGhvZCBpbnZva2F0aW9uIHdpdGggPGNvZGU+bG9jYXRvcjwvY29kZT4gdG8gdGhlCi0JICogbmV4dCBoYW5kbGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKGFub3RoZXIgIT0gbnVsbCkKLQkJCWFub3RoZXIuY2hhcmFjdGVycyhjaCwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogSnVzdCBmb3J3YXJkcyB0aGlzIG1ldGhvZCBpbnZva2F0aW9uIHdpdGggPGNvZGU+bG9jYXRvcjwvY29kZT4gdG8gdGhlCi0JICogbmV4dCBoYW5kbGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKGFub3RoZXIgIT0gbnVsbCkKLQkJCWFub3RoZXIuaWdub3JhYmxlV2hpdGVzcGFjZShjaCwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogSnVzdCBmb3J3YXJkcyB0aGlzIG1ldGhvZCBpbnZva2F0aW9uIHdpdGggPGNvZGU+bG9jYXRvcjwvY29kZT4gdG8gdGhlCi0JICogbmV4dCBoYW5kbGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkKLQkJCXRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAoYW5vdGhlciAhPSBudWxsKQotCQkJYW5vdGhlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBkYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9FbGVtZW50RGVmaW5pdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvRWxlbWVudERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2MTI1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9FbGVtZW50RGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5JU0dNTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLm1vZGVsZ3JvdXAuSU1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgbWFkZSBmcm9tIERURC4KLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnREZWZpbml0aW9uIGltcGxlbWVudHMgSU1vZGVsR3JvdXAgewotCXByaXZhdGUgYm9vbGVhbiBzdGFydCwgZW5kOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgSU1vZGVsR3JvdXAgY29udGVudE1vZGVsOwotCi0JcHJpdmF0ZSBFbGVtZW50RGVmaW5pdGlvbiBpbmNsdXNpb25zW107Ci0KLQlwcml2YXRlIEVsZW1lbnREZWZpbml0aW9uIGV4Y2x1c2lvbnNbXTsKLQotCXByaXZhdGUgQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyaWJ1dGVEZWZzW10gPSBuZXcgQXR0cmlidXRlRGVmaW5pdGlvblszMl07Ci0KLQlwcml2YXRlIGludCBhdHRyaWJ1dGVEZWZIYXNoZXNbXSA9IG5ldyBpbnRbMzJdOwotCi0JcHJpdmF0ZSBpbnQgYXR0ck51bSA9IDA7Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudERlZmluaXRpb24oU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudERlZmluaXRpb24oU3RyaW5nIG5hbWUsIElNb2RlbEdyb3VwIGNvbnRlbnRNb2RlbCkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmNvbnRlbnRNb2RlbCA9IGNvbnRlbnRNb2RlbDsKLQl9Ci0KLQlmaW5hbCB2b2lkIGFkZEF0dHJpYnV0ZURlZmluaXRpb24oQXR0cmlidXRlRGVmaW5pdGlvbiBkZWYpIHsKLQkJaWYgKGRlZiAhPSBudWxsKSB7Ci0JCQlpZiAoYXR0ck51bSA9PSBhdHRyaWJ1dGVEZWZzLmxlbmd0aCkgewotCQkJCUF0dHJpYnV0ZURlZmluaXRpb24gbmV3RGVmc1tdID0gbmV3IEF0dHJpYnV0ZURlZmluaXRpb25bYXR0ck51bSAqIDJdOwotCQkJCWludCBuZXdIYXNoZXNbXSA9IG5ldyBpbnRbYXR0ck51bSAqIDJdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ck51bTsgaSsrKSB7Ci0JCQkJCW5ld0RlZnNbaV0gPSBhdHRyaWJ1dGVEZWZzW2ldOwotCQkJCQluZXdIYXNoZXNbaV0gPSBhdHRyaWJ1dGVEZWZIYXNoZXNbaV07Ci0JCQkJfQotCQkJCWF0dHJpYnV0ZURlZnMgPSBuZXdEZWZzOwotCQkJCWF0dHJpYnV0ZURlZkhhc2hlcyA9IG5ld0hhc2hlczsKLQkJCX0KLQkJCWF0dHJpYnV0ZURlZnNbYXR0ck51bV0gPSBkZWY7Ci0JCQlhdHRyaWJ1dGVEZWZIYXNoZXNbYXR0ck51bSsrXSA9IGhhc2hDb2RlKGRlZi5nZXROYW1lKCkKLQkJCQkJLnRvQ2hhckFycmF5KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgYW4gZW5kIHRhZyBpcyBvbWl0dGFibGUgb3Igbm90Ci0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGFuIGVuZCB0YWcgaXMgb21pdHRhYmxlLCBvdGhlcndpc2UgZmFsc2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZW5kVGFnT21pdHRhYmxlKCkgewotCQlyZXR1cm4gZW5kOwotCX0KLQotCS8qKgotCSAqIE1hdGNoZXMgPGNvZGU+Y2hpbGQ8L2NvZGU+IHRvIDxjb2RlPnBhcmVudDwvY29kZT4gYnkKLQkgKiA8Y29kZT5wYXJzZXI8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2VlZGVkLiBPdGhlcndpc2UsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoKElTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudAotCQkJCSYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgewotCQkJcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChzdGFydCkgewotCQkJRWxlbWVudCB0bXAgPSBwYXJzZXIuZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KAotCQkJCQlwYXJzZXIuY2hhbmdlRGVmYXVsdFRhZ0Nhc2UobmFtZSkpOwotCQkJLy8gY2hlY2sgZXhjZXBpdG9uCi0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBlYyA9IChFbGVtZW50KSBjaGlsZDsKLQkJCQlpZiAoZXhjbHVzaW9uKGVjKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIGlmIChpbmNsdXNpb24oZWMpKSB7Ci0JCQkJCXRtcC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJCXBhcmVudC5hcHBlbmRDaGlsZCh0bXApOwotCQkJCQlwYXJzZXIuYWRkQXV0b0dlbmVyYXRlZCh0bXApOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlib29sZWFuIHJldCA9IGNvbnRlbnRNb2RlbC5tYXRjaChwYXJzZXIsIHRtcCwgY2hpbGQpOwotCQkJaWYgKHJldCkgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZCh0bXApOwotCQkJCXBhcnNlci5hZGRBdXRvR2VuZXJhdGVkKHRtcCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldHMgY29udGVudCBtb2RlbAotCSAqIAotCSAqIEByZXR1cm4gY29udGVudCBtb2RlbAotCSAqLwotCWZpbmFsIElNb2RlbEdyb3VwIGdldENvbnRlbnRNb2RlbCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBNYXRjaGVzIDxjb2RlPmNoaWxkPC9jb2RlPiB0byA8Y29kZT5wYXJlbnQ8L2NvZGU+IGJ5Ci0JICogPGNvZGU+cGFyc2VyPC9jb2RlPiBhcyBhIGNvbmVudC4gU3VwcG9zZSB0aGlzIGluc3RhbmNlIGlzIGEgZGVmaW5pdGlvbgotCSAqIGRlcml2ZWQgZnJvbSA8Y29kZT4mbHQ7IUVMRU1FTlQgVEJPRFkgTyBPIChUUikrJmd0OywKLQkgKiAmbHQ7VFImZ3Q7IGRvZXNuJ3QgbWF0Y2ggJmx0O1RCT0RZJmd0OyBpbiB0aGlzIG1ldGhvZCBidXQgaW4gdGhlIHtAbGluawotCSAqICNtYXRjaChJU0dNTFBhcnNlcixvcmcudzNjLmRvbS5Ob2RlLG9yZy53M2MuZG9tLk5vZGUpfSBtZXRob2QuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBzdWNjZWVkZWQuIE90aGVyd2lzZSwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGVudE1hdGNoKElTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGNvbnRlbnRNb2RlbC5tYXRjaChwYXJzZXIsIHBhcmVudCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIGdldHMgZGVmYXVsdCB2YWx1ZSBvZiBhIHNwZWNpZmllZCBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gZGVmYXVsdCB2YWx1ZS4gSWYgPGNvZGU+YXR0ck5hbWU8L2NvZGU+IGlzIG5vdCBhbiBhdHRyaWJ1dGUgb2YKLQkgKiAgICAgICAgIHRoaXMgb2JqZWN0LCBudWxsLgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKFN0cmluZyBhdHRyTmFtZSkgewotCQlpbnQgaGFzaCA9IGhhc2hDb2RlKGF0dHJOYW1lLnRvQ2hhckFycmF5KCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJOdW07IGkrKykgewotCQkJaWYgKGF0dHJpYnV0ZURlZkhhc2hlc1tpXSA9PSBoYXNoKSB7Ci0JCQkJQXR0cmlidXRlRGVmaW5pdGlvbiBhZCA9IGF0dHJpYnV0ZURlZnNbaV07Ci0JCQkJaWYgKGFkLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJCQlyZXR1cm4gYWQuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCWZpbmFsIGJvb2xlYW4gZXhjbHVzaW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZXhjbHVzaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gZXhjbHVzaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKGV4Y2x1c2lvbnNbaV0ubmFtZS5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JZmluYWwgYm9vbGVhbiBpbmNsdXNpb24oRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChpbmNsdXNpb25zID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSBpbmNsdXNpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoaW5jbHVzaW9uc1tpXS5uYW1lLmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXROb2RlTmFtZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGVsZW1lbnQgZGVmaW5lZCBieSB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIG5hbWUuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlmaW5hbCBib29sZWFuIGluc3RhbmNlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQKLQkJCQkmJiBub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgY29udGVudCBtb2RlbAotCSAqLwotCWZpbmFsIHZvaWQgc2V0Q29udGVudE1vZGVsKElNb2RlbEdyb3VwIGFyZykgewotCQljb250ZW50TW9kZWwgPSBhcmc7Ci0JfQotCi0JZmluYWwgdm9pZCBzZXRFbmRUYWcoYm9vbGVhbiBlbmQpIHsKLQkJdGhpcy5lbmQgPSBlbmQ7Ci0JfQotCi0JZmluYWwgdm9pZCBzZXRFeGNsdXNpb24oRWxlbWVudERlZmluaXRpb24gZXhjbHVzaW9uc1tdKSB7Ci0JCXRoaXMuZXhjbHVzaW9ucyA9IGV4Y2x1c2lvbnM7Ci0JfQotCi0JZmluYWwgdm9pZCBzZXRJbmNsdXNpb24oRWxlbWVudERlZmluaXRpb24gaW5jbHVzaW9uc1tdKSB7Ci0JCXRoaXMuaW5jbHVzaW9ucyA9IGluY2x1c2lvbnM7Ci0JfQotCi0JZmluYWwgdm9pZCBzZXRTdGFydFRhZyhib29sZWFuIHN0YXJ0KSB7Ci0JCXRoaXMuc3RhcnQgPSBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVja3MgaWYgZGVmaW5pbmcgZWxlbWVudCdzIHN0YXJ0IHRhZyBpcyBvbWl0dGFibGUgb3Igbm90Ci0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSB0YWcgaXMgb21pdHRhYmxlLCBvdGhlcndpc2UgZmFsc2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gc3RhcnRUYWdPbWl0dGFibGUoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgZGVidWcuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJldCA9ICI8IUVMRU1FTlQgIiArIG5hbWUgKyAnICcgKyAoc3RhcnQgPyAnTycgOiAnLScpICsgJyAnCi0JCQkJKyAoZW5kID8gJ08nIDogJy0nKSArICcgJyArICc+JzsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlRGVmaW5pdGlvbiBnZXRBdHRyaWJ1dGVEZWYoU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWludCBoYXNoID0gaGFzaENvZGUoYXR0ck5hbWUudG9DaGFyQXJyYXkoKSk7Ci0JCWZvciAoaW50IGkgPSBhdHRyTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChhdHRyaWJ1dGVEZWZIYXNoZXNbaV0gPT0gaGFzaAotCQkJCQkmJiBhdHRyaWJ1dGVEZWZzW2ldLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGVEZWZzW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgaW50IGhhc2hDb2RlKGNoYXIga2V5W10pIHsKLQkJaW50IHJldCA9IDA7Ci0JCWZvciAoaW50IGkgPSBrZXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCXJldCA9IDI1ICogcmV0ICsgKGtleVtpXSAmIDB4MWYpIC0gMTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYWx3YXlzIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgcmVmZXJjb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBTZXRzIHJlZmVyZW5jZSBmbGFnLgotCSAqIAotCSAqIEBwYXJhbSBpbmZpbml0ZQotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVmZXJlbmNlZCBpbmZpbml0ZWx5LiBPdGhlcndpc2UsCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZlcihib29sZWFuIGluZmluaXRlKSB7Ci0JCWlmIChpbmZpbml0ZSkgewotCQkJdGhpcy5pbmZpbml0ZSA9IGluZmluaXRlOwotCQl9IGVsc2UgewotCQkJcmVmZXJjb3VudCsrOwotCQl9Ci0JCWlmIChpbmNsdXNpb25zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVzaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWluY2x1c2lvbnNbaV0ucmVmZXIodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbnRlbnRNb2RlbCAhPSBudWxsKSB7Ci0JCQljb250ZW50TW9kZWwucmVmZXIoaW5maW5pdGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluZmluaXRlID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhpcyBpcyBhIHNpbmdsZXRvbiBlbGVtZW50IGluIGEgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgaXMgc2luZ2xldG9uLiBPdGhlcndpc2UKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xldG9uKCkgewotCQlyZXR1cm4gIWluZmluaXRlOwotCX0KLQotCWludCBudW1iZXI7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBNYWdpYyBOdW1iZXIgb2YgdGhpcyBkZWZpbml0aW9uLiBBIE1hZ2ljIE51bWJlciBpcyB1c2VkIGZvcgotCSAqIGNvbXBhcmlzb24gdG8gbm9kZXMuCi0JICovCi0JcHVibGljIGludCBnZXRNYWdpY051bWJlcigpIHsKLQkJcmV0dXJuIHRoaXMubnVtYmVyOwotCX0KLQotCS8qKgotCSAqIEp1c3QgY2hlY2tzIGEgbm9kZSB3aXRoIDxjb2RlPm51bWJlcjwvY29kZT4gYXMgTWFnaWMgTnVtYmVyIGNhbiBtYXRjaAotCSAqIHRvIGEgcGFyZW50IGRlZmluZWQgYnkgdGhpcyBpbnN0YW5jZS4gUmF0aGVyIHRoYW4ge0BsaW5rCi0JICogI21hdGNoKFNHTUxQYXJzZXIsb3JnLnczYy5kb20uTm9kZSxvcmcudzNjLmRvbS5Ob2RlKX0gb3Ige0BsaW5rCi0JICogI2NvbnRlbnRNYXRjaChTR01MUGFyc2VyLG9yZy53M2MuZG9tLk5vZGUsb3JnLnczYy5kb20uTm9kZSl9LCB0aGlzIGhhcyBubwotCSAqIHNpZGUgZWZmZWN0cy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChpbnQgbnVtYmVyKSB7Ci0JCXJldHVybiBoYXNoW251bWJlcl07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluY2x1c2lvblZlY3RvcltdOwotCi0JZmluYWwgYm9vbGVhbltdIGdldEluY2x1c2lvblZlY3RvcigpIHsKLQkJcmV0dXJuIGluY2x1c2lvblZlY3RvcjsKLQl9Ci0KLQlmaW5hbCBib29sZWFuIGluY2x1c2lvbihpbnQgZWxlbWVudE51bWJlcikgewotCQlyZXR1cm4gaW5jbHVzaW9uVmVjdG9yW2VsZW1lbnROdW1iZXJdOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleGNsdXNpb25WZWN0b3JbXTsKLQotCWZpbmFsIGJvb2xlYW5bXSBnZXRFeGNsdXNpb25WZWN0b3IoKSB7Ci0JCXJldHVybiBleGNsdXNpb25WZWN0b3I7Ci0JfQotCi0JZmluYWwgYm9vbGVhbiBleGNsdXNpb24oaW50IGVsZW1lbnROdW1iZXIpIHsKLQkJcmV0dXJuIGV4Y2x1c2lvblZlY3RvcltlbGVtZW50TnVtYmVyXTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzaFtdID0gbnVsbDsKLQotCS8qKgotCSAqIFJlaGFzaGVzIE1hZ2ljIE51bWJlciB2ZWN0b3JzLgotCSAqIAotCSAqIEBwYXJhbSB0b3RhbFNpemUKLQkgKiAgICAgICAgICAgIHNpemUgb2YgdGhlIHZlY3RvcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW5bXSByZWhhc2goaW50IHRvdGFsU2l6ZSkgewotCQlpZiAodGhpcy5oYXNoICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5oYXNoOwotCQlpbmNsdXNpb25WZWN0b3IgPSBuZXcgYm9vbGVhblt0b3RhbFNpemVdOwotCQlpZiAoaW5jbHVzaW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2x1c2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbmNsdXNpb25WZWN0b3JbaW5jbHVzaW9uc1tpXS5udW1iZXJdID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlleGNsdXNpb25WZWN0b3IgPSBuZXcgYm9vbGVhblt0b3RhbFNpemVdOwotCQlpZiAoZXhjbHVzaW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1c2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlleGNsdXNpb25WZWN0b3JbZXhjbHVzaW9uc1tpXS5udW1iZXJdID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQl0aGlzLmhhc2ggPSBuZXcgYm9vbGVhblt0b3RhbFNpemVdOwotCQlib29sZWFuIGNvbnRlbnRNb2RlbEhhc2hbXSA9IGNvbnRlbnRNb2RlbC5yZWhhc2godG90YWxTaXplKTsKLQkJaWYgKHN0YXJ0KSB7Ci0JCQlpZiAoY29udGVudE1vZGVsSGFzaCA9PSBudWxsKSB7Ci0JCQkJY29udGVudE1vZGVsSGFzaCA9IG5ldyBib29sZWFuW3RvdGFsU2l6ZV07Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gdG90YWxTaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQloYXNoW2ldID0gKGluY2x1c2lvblZlY3RvcltpXSB8IGNvbnRlbnRNb2RlbEhhc2hbaV0pCi0JCQkJCQkmICFleGNsdXNpb25WZWN0b3JbaV07Ci0JCQl9Ci0JCX0KLQkJaGFzaFt0aGlzLm51bWJlcl0gPSB0cnVlOwotCQlyZXR1cm4gaGFzaDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9FbmRUYWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL0VuZFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjU4MzhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL0VuZFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGludGVybWVkaWF0ZSBkYXRhIG9mIGVuZCB0YWcuIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzCi0gKiBhcmUgdXNlZCBpbnRlcm1lZGlhdGVseSBieSBwYXJzZXJzLCBzbyB0aGV5IGFyZSBub3QgaW5jbHVkZWQgaW4gRE9NIHRyZWUKLSAqIGdlbmVyYXRlZCBieSBwYXJzZXJzLgotICovCi1wdWJsaWMgY2xhc3MgRW5kVGFnIGV4dGVuZHMgU0dNTE5vZGUgewotCXByaXZhdGUgU3RyaW5nIHRhZ05hbWU7Ci0KLQlFbmRUYWcoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRhZ05hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiB0YWdOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYWx3YXlzIC0xCi0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhbHdheXMgIiIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCS8qKgotCSAqIGRvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICI8LyIgKyB0YWdOYW1lICsgJz4nOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBFbmRUYWcKLQkJCQkmJiBub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQotCS8qKgotCSAqIEdldHMgYW4gZWxlbWVudCB0aGlzIGVuZCB0YWcgY2xvc2VzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gZWxlbWVudCB0aGlzIGVuZCB0YWcgY2xvc2VzLiA8Y29kZT5udWxsPC9jb2RlPmlmIHRoaXMgZW5kCi0JICogICAgICAgICB0YWcgaXMgYW4gZXJyb3Igbm9kZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gZWxlbWVudCB0aGlzIGVuZCB0YWcgY2xvc2VzLgotCSAqIAotCSAqIEBwYXJhbSBhbgotCSAqICAgICAgICAgICAgZWxlbWVudCB0aGlzIGVuZCB0YWcgY2xvc2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQgPT0gbnVsbCA/IG51bGwgOiBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9JbnNUb2tlbml6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL0luc1Rva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDVmN2U4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL0luc1Rva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklQYXJzZXJFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuSVNHTUxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIFRva2VuaXplciBmb3IgZG9jdW1lbnQgaW5zdGFuY2UuCi0gKi8KLWNsYXNzIEluc1Rva2VuaXplciBpbXBsZW1lbnRzIElTR01MQ29uc3RhbnRzLCBMb2NhdG9yIHsKLQlwcml2YXRlIGJvb2xlYW4gZXh0cmFjdENoYXIgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGV4dHJhY3ROdW0gPSB0cnVlOwotCi0JcHJpdmF0ZSBpbnQgc3RhdGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHVzaEJhY2tlZDsKLQotCXB1YmxpYyBTdHJpbmcgc3ZhbDsKLQotCXB1YmxpYyBpbnQgdHR5cGU7Ci0KLQlwcml2YXRlIFJlYWRlciByZWFkZXI7Ci0KLQl2b2lkIGV4dHJhY3RDaGFyRW50aXR5KGJvb2xlYW4gYikgewotCQlleHRyYWN0Q2hhciA9IGI7Ci0JfQotCi0Jdm9pZCBleHRyYWN0TnVtRW50aXR5KGJvb2xlYW4gYikgewotCQlleHRyYWN0TnVtID0gYjsKLQl9Ci0KLQlwcml2YXRlIFNHTUxQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBJbnNUb2tlbml6ZXIgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHJlYWRlcgotCSAqICAgICAgICAgICAgcmVhZGVyIHRoYXQgcmVhZCBTR01MIERvY3VtZW50cy4KLQkgKi8KLQlwdWJsaWMgSW5zVG9rZW5pemVyKFJlYWRlciByZWFkZXIsIFNHTUxQYXJzZXIgcGFyc2VyKSB7Ci0JCXRoaXMocmVhZGVyLCBERUZBVUxULCBwYXJzZXIpOwotCX0KLQotCUluc1Rva2VuaXplcihSZWFkZXIgcmVhZGVyLCBpbnQgc3RhdGUsIFNHTUxQYXJzZXIgcGFyc2VyKSB7Ci0JCXRoaXMucmVhZGVyID0gcmVhZGVyOwotCQl0aGlzLnN0YXRlID0gc3RhdGU7Ci0JCXRoaXMucGFyc2VyID0gcGFyc2VyOwotCQlwdXNoQmFja2VkID0gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZvcndhcmQoU3RyaW5nIHN0ciwgYm9vbGVhbiBpZ25vcmVDYXNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYnVmW10gPSBuZXcgaW50W3N0ci5sZW5ndGgoKV07Ci0JCWJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQkJaW50IGk7Ci0JCWlmICghaWdub3JlQ2FzZSkgewotCQkJZm9yIChpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykgewotCQkJCWJ1ZltpXSA9IHJlYWQoKTsKLQkJCQlpZiAoYnVmW2ldICE9IHN0ci5jaGFyQXQoaSkpIHsKLQkJCQkJcmV0ID0gZmFsc2U7Ci0JCQkJCWkrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykgewotCQkJCWJ1ZltpXSA9IHJlYWQoKTsKLQkJCQlpZiAoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKChjaGFyKSBidWZbaV0pICE9IENoYXJhY3RlcgotCQkJCQkJLnRvVXBwZXJDYXNlKHN0ci5jaGFyQXQoaSkpCi0JCQkJCQkmJiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoKGNoYXIpIGJ1ZltpXSkgIT0gQ2hhcmFjdGVyCi0JCQkJCQkJCS50b0xvd2VyQ2FzZShzdHIuY2hhckF0KGkpKSkgewotCQkJCQlyZXQgPSBmYWxzZTsKLQkJCQkJaSsrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKGkgPiAwKQotCQkJdW5yZWFkKGJ1ZlstLWldKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcml2YXRlIGludCBlYXRDb21tZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7Ci0JCWludCBjaDsKLQkJbWlzY0luZGV4ID0gMDsKLQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gJy0nKSB7IC8vIDwhLQotCi0JCQlpZiAoKGNoID0gcmVhZCgpKSA9PSAnLScpIHsgLy8gPCEtLSBlbnRlciBjb21tZW50Ci0JCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJd2hpbGUgKChjaCA9IHJlYWQoKSkgIT0gJy0nICYmIGNoICE9IEVPRikgewotCQkJCQkJc2V0Q2hhclRvTWlzY0J1ZmZlcihtaXNjSW5kZXgsIChjaGFyKSBjaCk7Ci0JCQkJCQltaXNjSW5kZXgrKzsKLQkJCQkJfQotCQkJCQlpZiAoKGNoID0gcmVhZCgpKSA9PSAnLScpIHsgLy8gLS0KLQkJCQkJCWlmICgoY2ggPSByZWFkKCkpID09ICctJykgewotCQkJCQkJCS8vIFRoaXMgaXMgYSB2ZXJ5IG5hc3R5IGNhc2UuIDwhLS0gLi4uIC0tLS4uLj4KLQkJCQkJCQkvLyBlYXQgY29tbWVudCB1bnRpbCAnPicgYXBwZWFycy4KLQkJCQkJCQlpZiAobWlzY0J1ZmZlci5sZW5ndGggPD0gbWlzY0luZGV4ICsgMikgewotCQkJCQkJCQlleHBhbmRNaXNjQnVmZmVyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCW1pc2NCdWZmZXJbbWlzY0luZGV4XSA9IG1pc2NCdWZmZXJbbWlzY0luZGV4ICsgMV0gPSBtaXNjQnVmZmVyW21pc2NJbmRleCArIDJdID0gJy0nOwotCQkJCQkJCW1pc2NJbmRleCArPSAzOwotCQkJCQkJCXN0b3JlVW50aWwoJz4nKTsKLQkJCQkJCQlpZiAoQ2hhcmFjdGVyCi0JCQkJCQkJCQkuaXNXaGl0ZXNwYWNlKG1pc2NCdWZmZXJbbWlzY0luZGV4IC0gMV0pCi0JCQkJCQkJCQl8fCBtaXNjQnVmZmVyW21pc2NJbmRleCAtIDFdID09ICctJwotCQkJCQkJCQkJfHwgbWlzY0J1ZmZlclttaXNjSW5kZXggLSAxXSA9PSAnIScpIHsKLQkJCQkJCQkJaWYgKG1pc2NCdWZmZXJbbWlzY0luZGV4IC0gMl0gPT0gJy0nCi0JCQkJCQkJCQkJJiYgbWlzY0J1ZmZlclttaXNjSW5kZXggLSAxXSA9PSAnLScpIHsKLQkJCQkJCQkJCW1pc2NJbmRleCAtPSAyOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXN0YXRlID0gREVGQVVMVDsKLQkJCQkJCQkJc3ZhbCA9IG5ldyBTdHJpbmcobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQkJCQkJCQkJcGFyc2VyLnNldENoYXJhY3RlcihtaXNjQnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQkJCQkJCQlyZXR1cm4gKHR0eXBlID0gQ09NTUVOVCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc2V0Q2hhclRvTWlzY0J1ZmZlcihtaXNjSW5kZXgsICc+Jyk7Ci0JCQkJCQkJCW1pc2NJbmRleCsrOwotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKGNoID09ICchJykgeyAvLyBkb2Vzbid0IG1lZXQgc3BlY2lmaWNhdGlvbiwKLQkJCQkJCQkJCQkJCS8vIGJ1dC4uLgotCQkJCQkJCWlmICgoY2ggPSByZWFkKCkpID09ICc+JykgewotCQkJCQkJCQlzdGF0ZSA9IERFRkFVTFQ7Ci0JCQkJCQkJCXN2YWwgPSBuZXcgU3RyaW5nKG1pc2NCdWZmZXIsIDAsIG1pc2NJbmRleCk7Ci0JCQkJCQkJCXBhcnNlci5zZXRDaGFyYWN0ZXIobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQkJCQkJCQkJcmV0dXJuICh0dHlwZSA9IENPTU1FTlQpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChtaXNjQnVmZmVyLmxlbmd0aCA8PSBtaXNjSW5kZXggKyAyKSB7Ci0JCQkJCQkJCQlleHBhbmRNaXNjQnVmZmVyKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJbWlzY0J1ZmZlclttaXNjSW5kZXhdID0gbWlzY0J1ZmZlclttaXNjSW5kZXggKyAxXSA9ICctJzsKLQkJCQkJCQkJbWlzY0J1ZmZlclttaXNjSW5kZXggKyAyXSA9ICchJzsKLQkJCQkJCQkJbWlzY0luZGV4ICs9IDM7Ci0JCQkJCQkJCXVucmVhZChjaCk7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWludCB3c0luZGV4ID0gMDsKLQkJCQkJCWNoYXIgd3NbXSA9IG51bGw7Ci0JCQkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgY2gpKSB7Ci0JCQkJCQkJLy8gQ29tcHJlc3NlZCBSZXByZXNlbnRhdGlvbi4KLQkJCQkJCQl3cyA9IG5ldyBjaGFyWzI1Nl07Ci0JCQkJCQkJd3NbMF0gPSAoY2hhcikgY2g7Ci0JCQkJCQkJd3NbMV0gPSAxOwotCQkJCQkJCXdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSBjaCkpIHsKLQkJCQkJCQkJaWYgKGNoID09IHdzW3dzSW5kZXhdKSB7Ci0JCQkJCQkJCQl3c1t3c0luZGV4ICsgMV0rKzsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXdzSW5kZXggKz0gMjsKLQkJCQkJCQkJCXdzW3dzSW5kZXhdID0gKGNoYXIpIGNoOwotCQkJCQkJCQkJd3Nbd3NJbmRleCArIDFdID0gMTsKLQkJCQkJCQkJfQotCQkJCQkJCQljaCA9IHJlYWQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoY2ggPT0gJz4nKSB7Ci0JCQkJCQkJc3RhdGUgPSBERUZBVUxUOwotCQkJCQkJCXN2YWwgPSBuZXcgU3RyaW5nKG1pc2NCdWZmZXIsIDAsIG1pc2NJbmRleCk7Ci0JCQkJCQkJcGFyc2VyLnNldENoYXJhY3RlcihtaXNjQnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQkJCQkJCXJldHVybiAodHR5cGUgPSBDT01NRU5UKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKG1pc2NCdWZmZXIubGVuZ3RoIDw9IG1pc2NJbmRleCArIDIpIHsKLQkJCQkJCQkJZXhwYW5kTWlzY0J1ZmZlcigpOwotCQkJCQkJCX0KLQkJCQkJCQltaXNjQnVmZmVyW21pc2NJbmRleF0gPSBtaXNjQnVmZmVyW21pc2NJbmRleCArIDFdID0gJy0nOwotCQkJCQkJCW1pc2NJbmRleCArPSAyOwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd3NJbmRleDsgaSArPSAyKSB7Ci0JCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgd3NbaSArIDFdOyBqKyspCi0JCQkJCQkJCQlzZXRDaGFyVG9NaXNjQnVmZmVyKG1pc2NJbmRleCwgd3NbaV0pOwotCQkJCQkJCQltaXNjSW5kZXgrKzsKLQkJCQkJCQl9Ci0JCQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChjaCA9PSBFT0YpIHsKLQkJCQkJCXBhcnNlci5lcnJvcihJUGFyc2VyRXJyb3IuTUlTQ19FUlIsICJVbmV4cGVjdGVkIEVPRiBpbiBjb21tZW50LiIpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaXNjQnVmZmVyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaWYgKG1pc2NCdWZmZXJbaV0gPT0gJz4nKSB7Ci0JCQkJCQkJCXVucmVhZChtaXNjQnVmZmVyLCBpICsgMSwgbWlzY0luZGV4IC0gaSAtIDEpOwotCQkJCQkJCQlzdGF0ZSA9IERFRkFVTFQ7Ci0JCQkJCQkJCXN2YWwgPSBuZXcgU3RyaW5nKG1pc2NCdWZmZXIsIDAsIGkpOwotCQkJCQkJCQlwYXJzZXIuc2V0Q2hhcmFjdGVyKG1pc2NCdWZmZXIsIDAsIG1pc2NJbmRleCk7Ci0JCQkJCQkJCXJldHVybiAodHR5cGUgPSBDT01NRU5UKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgRU9GIGluIGNvbW1lbnQuIik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZXRDaGFyVG9NaXNjQnVmZmVyKG1pc2NJbmRleCwgJy0nKTsKLQkJCQkJCW1pc2NJbmRleCsrOwotCQkJCQkJc2V0Q2hhclRvTWlzY0J1ZmZlcihtaXNjSW5kZXgsIChjaGFyKSBjaCk7Ci0JCQkJCQltaXNjSW5kZXgrKzsKLQkJCQkJfQotCQkJCX0gLy8gd2hpbGUgKHRydWUpIHsKLQkJCX0gZWxzZSB7IC8vIDwhLQotCQkJCS8vIGlmIGZpbmlzaGVkIHJlYWRpbmcgZHRkLCBkZWFscyB3aXRoIDwhLSAuLi4gPiBhcyBhIGNvbW1lbnQKLQkJCQlzdmFsID0gIi0iICsgKGNoYXIpIGNoICsgZWF0VW50aWwoJz4nKTsKLQkJCQljaGFyIHN2YWxDaGFyW10gPSBzdmFsLnRvQ2hhckFycmF5KCk7Ci0JCQkJcGFyc2VyLnNldENoYXJhY3RlcihzdmFsQ2hhciwgMCwgc3ZhbENoYXIubGVuZ3RoKTsKLQkJCQlyZXR1cm4gKHR0eXBlID0gQ09NTUVOVCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKGNoID09ICdEJyB8fCBjaCA9PSAnZCcpICYmIGZvcndhcmQoIk9DVFlQRSIsIHRydWUpKSB7IC8vIGNoZWNoCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gaWYKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyA8IURPQ1RZUEUKLQkJCXVucmVhZChjaCk7Ci0JCQlzdGF0ZSA9IFRBRzsKLQkJCXJldHVybiAodHR5cGUgPSBNRE8pOwotCQl9IGVsc2UgewotCQkJLy8gaWYgZmluaXNoZWQgcmVhZGluZyBkdGQsIGRlYWxzIHdpdGggPCEgLi4uID4gYXMgYSBjb21tZW50Ci0JCQlzdmFsID0gKGNoYXIpIGNoICsgZWF0VW50aWwoJz4nKTsKLQkJCWNoYXIgc3ZhbENoYXJbXSA9IHN2YWwudG9DaGFyQXJyYXkoKTsKLQkJCXBhcnNlci5zZXRDaGFyYWN0ZXIoc3ZhbENoYXIsIDAsIHN2YWxDaGFyLmxlbmd0aCk7Ci0JCQlyZXR1cm4gKHR0eXBlID0gQ09NTUVOVCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBldGFnU3RhcnRJbmRleDsKLQotCXByaXZhdGUgaW50IGRlZmF1bHRTdGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCW1pc2NJbmRleCA9IDA7Ci0JCWludCBjaCA9IHJlYWQoKTsKLQkJd2hpbGUgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpIGNoKSkgewotCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcigoY2hhcikgY2gpOwotCQkJY2ggPSByZWFkKCk7Ci0JCX0KLQkJaWYgKG1pc2NJbmRleCA+IDApIHsKLQkJCWlmIChwcnN2V1MpIHsKLQkJCQl1bnJlYWQoY2gpOwotCQkJCXN2YWwgPSBuZXcgU3RyaW5nKG1pc2NCdWZmZXIsIDAsIG1pc2NJbmRleCk7Ci0JCQkJcGFyc2VyLnNldENoYXJhY3RlcihtaXNjQnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQkJCXJldHVybiAodHR5cGUgPSBXSElURVNQQUNFKTsKLQkJCX0KLQkJfQotCQlzd2l0Y2ggKGNoKSB7Ci0JCWNhc2UgJzwnOgotCQkJaWYgKG1pc2NJbmRleCA+IDAgJiYgIXByc3ZXUykgewotCQkJCURvY3VtZW50SGFuZGxlciBkb2NIYW5kbGVyID0gcGFyc2VyLmdldERvY3VtZW50SGFuZGxlcigpOwotCQkJCWlmIChkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJZG9jSGFuZGxlci5pZ25vcmFibGVXaGl0ZXNwYWNlKG1pc2NCdWZmZXIsIDAsIG1pc2NJbmRleCk7Ci0JCQkJCXJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQltaXNjSW5kZXggPSAwOwotCQkJaWYgKChjaCA9IHJlYWQoKSkgPT0gJy8nKSB7Ci0JCQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZSgoY2hhcikgKGNoID0gcmVhZCgpKSkKLQkJCQkJCXx8IENoYXJhY3Rlci5pc1VwcGVyQ2FzZSgoY2hhcikgY2gpKSB7Ci0JCQkJCXVucmVhZChjaCk7Ci0JCQkJCXN0YXRlID0gRVRBRzsKLQkJCQkJZXRhZ1N0YXJ0SW5kZXggPSBtaXNjSW5kZXg7Ci0JCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoJzwnKTsKLQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcignLycpOwotCQkJCQlyZXR1cm4gKHR0eXBlID0gRVRBR08pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoJzwnKTsKLQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcignLycpOwotCQkJCQlyZXR1cm4gcmVhZFBDREFUQShjaCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjaCA9PSAnPycpIHsKLQkJCQltaXNjSW5kZXggPSAwOwotCQkJCXdoaWxlICgoY2ggPSByZWFkKCkpICE9ICc+JyAmJiBjaCAhPSBFT0YpIHsKLQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcigoY2hhcikgY2gpOwotCQkJCX0KLQkJCQlzdmFsID0gbmV3IFN0cmluZyhtaXNjQnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQkJCXJldHVybiAodHR5cGUgPSBQSSk7Ci0JCQl9IGVsc2UgaWYgKGNoID09ICchJykgeyAvLyBkZWNsYXJhdGlvbi4KLQkJCQlyZXR1cm4gZWF0Q29tbWVudCgpOwotCQkJfSBlbHNlIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoKGNoYXIpIGNoKQotCQkJCQl8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoKGNoYXIpIGNoKSkgewotCQkJCXVucmVhZChjaCk7Ci0JCQkJc3RhdGUgPSBUQUc7Ci0JCQkJcmV0dXJuICh0dHlwZSA9IFNUQUdPKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcignPCcpOwotCQkJCXJldHVybiByZWFkUENEQVRBKGNoKTsKLQkJCX0KLQkJY2FzZSBFT0Y6Ci0JCQlyZXR1cm4gKHR0eXBlID0gRU9GKTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiByZWFkUENEQVRBKGNoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGVudGl0eUJ1ZltdID0gbmV3IGludFs2NF07Ci0KLQlwcml2YXRlIGludCBlbnRpdHlCdWZJbmRleDsKLQotCXByaXZhdGUgaW50IHJzbHZDaGFyRW50KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJZW50aXR5QnVmSW5kZXggPSAwOwotCQlpbnQgY2ggPSBlbnRpdHlCdWZbZW50aXR5QnVmSW5kZXgrK10gPSByZWFkKCk7Ci0JCWlmIChjaCA9PSAnIycpIHsKLQkJCWNoID0gZW50aXR5QnVmW2VudGl0eUJ1ZkluZGV4KytdID0gcmVhZCgpOwotCQkJaW50IHJhZGl4ID0gMTA7Ci0JCQlpZiAoY2ggPT0gJ3gnIHx8IGNoID09ICdYJykgewotCQkJCXJhZGl4ID0gMTY7Ci0JCQkJY2ggPSBlbnRpdHlCdWZbZW50aXR5QnVmSW5kZXgrK10gPSByZWFkKCk7Ci0JCQl9Ci0JCQlpbnQgayA9IENoYXJhY3Rlci5kaWdpdCgoY2hhcikgY2gsIHJhZGl4KTsKLQkJCWlmIChrID49IDApIHsKLQkJCQlpbnQgbnVtID0gazsKLQkJCQljaCA9IGVudGl0eUJ1ZltlbnRpdHlCdWZJbmRleCsrXSA9IHJlYWQoKTsKLQkJCQl3aGlsZSAoKGsgPSBDaGFyYWN0ZXIuZGlnaXQoKGNoYXIpIGNoLCByYWRpeCkpID49IDApIHsKLQkJCQkJbnVtID0gbnVtICogcmFkaXggKyBrOwotCQkJCQljaCA9IGVudGl0eUJ1ZltlbnRpdHlCdWZJbmRleCsrXSA9IHJlYWQoKTsKLQkJCQl9Ci0JCQkJaWYgKGNoID09ICc7JykgewotCQkJCQljaGFyIG9yaWdbXSA9IG5ldyBjaGFyW2VudGl0eUJ1ZkluZGV4IC0gMV07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50aXR5QnVmSW5kZXggLSAxOyBpKyspIHsKLQkJCQkJCW9yaWdbaV0gPSAoY2hhcikgZW50aXR5QnVmW2ldOwotCQkJCQl9Ci0JCQkJCXBhcnNlci5wdXRDaGFyTnVtRW50aXR5KG5ldyBDaGFyYWN0ZXIoKGNoYXIpIG51bSksCi0JCQkJCQkJbmV3IFN0cmluZyhvcmlnKSk7Ci0JCQkJCXJldHVybiBudW07Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZSgoY2hhcikgY2gpCi0JCQkJfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKChjaGFyKSBjaCkpIHsKLQkJCWRvIHsKLQkJCQljaCA9IGVudGl0eUJ1ZltlbnRpdHlCdWZJbmRleCsrXSA9IHJlYWQoKTsKLQkJCX0gd2hpbGUgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZSgoY2hhcikgY2gpCi0JCQkJCXx8IENoYXJhY3Rlci5pc1VwcGVyQ2FzZSgoY2hhcikgY2gpKTsKLQkJCWlmIChjaCA9PSAnOycpIHsKLQkJCQljaGFyIG9yaWdbXSA9IG5ldyBjaGFyW2VudGl0eUJ1ZkluZGV4IC0gMV07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRpdHlCdWZJbmRleCAtIDE7IGkrKykKLQkJCQkJb3JpZ1tpXSA9IChjaGFyKSBlbnRpdHlCdWZbaV07Ci0JCQkJU3RyaW5nIG9yZ1N0ciA9IG5ldyBTdHJpbmcob3JpZyk7Ci0JCQkJaW50IGNoYXJFbnRpdHkgPSBwYXJzZXIuZ2V0Q2hhckVudGl0eShvcmdTdHIpOwotCQkJCWlmIChjaGFyRW50aXR5ICE9IC0xKSB7Ci0JCQkJCXBhcnNlci5wdXRDaGFyTnVtRW50aXR5KG5ldyBDaGFyYWN0ZXIoKGNoYXIpIGNoYXJFbnRpdHkpLAotCQkJCQkJCW9yZ1N0cik7Ci0JCQkJCXJldHVybiBjaGFyRW50aXR5OwotCQkJCX0KLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gZW50aXR5QnVmSW5kZXggLSAxOyBpID49IDA7IGktLSkKLQkJCXVucmVhZChlbnRpdHlCdWZbaV0pOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENoYXJUb01pc2NCdWZmZXIoaW50IG1pc2NJbmRleCwgY2hhciBjKSB7Ci0JCWlmIChtaXNjQnVmZmVyLmxlbmd0aCA8PSBtaXNjSW5kZXgpIHsKLQkJCWV4cGFuZE1pc2NCdWZmZXIoKTsKLQkJfQotCQltaXNjQnVmZmVyW21pc2NJbmRleF0gPSBjOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDaGFyVG9NaXNjQnVmZmVyKGNoYXIgYykgewotCQlpZiAobWlzY0J1ZmZlci5sZW5ndGggPD0gbWlzY0luZGV4KSB7Ci0JCQlleHBhbmRNaXNjQnVmZmVyKCk7Ci0JCX0KLQkJbWlzY0J1ZmZlclttaXNjSW5kZXgrK10gPSBjOwotCX0KLQotCXByaXZhdGUgaW50IHJlYWRQQ0RBVEEoaW50IGN1cikgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiwKLQkJCVNBWEV4Y2VwdGlvbiB7Ci0JCWludCBzdWNjZWVkaW5nOwotCQlpbnQgZmlyc3RMRmluZGV4ID0gdGhpcy5sYXN0TEZpbmRleDsKLQkJaWYgKCFleHRyYWN0Q2hhciAmJiAhZXh0cmFjdE51bSkgewotCQkJc2V0Q2hhclRvTWlzY0J1ZmZlcihtaXNjSW5kZXgsIChjaGFyKSBjdXIpOwotCQkJbWlzY0luZGV4Kys7Ci0KLQkJCXdoaWxlICgoKGN1ciA9IHJlYWQoKSkgIT0gJzwnIHx8ICFDaGFyYWN0ZXIKLQkJCQkJLmlzTG93ZXJDYXNlKChjaGFyKSAoc3VjY2VlZGluZyA9IHNlbmNlKCkpKQotCQkJCQkmJiAhQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKChjaGFyKSBzdWNjZWVkaW5nKQotCQkJCQkmJiBzdWNjZWVkaW5nICE9ICchJwotCQkJCQkmJiBzdWNjZWVkaW5nICE9ICc/JwotCQkJCQkmJiAoc3VjY2VlZGluZyAhPSAnLycgfHwgIUNoYXJhY3RlcgotCQkJCQkJCS5pc0xvd2VyQ2FzZSgoY2hhcikgKHN1Y2NlZWRpbmcgPSBzZW5jZSgxKSkpCi0JCQkJCQkJJiYgIUNoYXJhY3Rlci5pc1VwcGVyQ2FzZSgoY2hhcikgc3VjY2VlZGluZykpKQotCQkJCQkmJiBjdXIgIT0gRU9GKSB7Ci0JCQkJc2V0Q2hhclRvTWlzY0J1ZmZlcihtaXNjSW5kZXgsIChjaGFyKSBjdXIpOwotCi0JCQkJaWYgKG1pc2NCdWZmZXJbbWlzY0luZGV4IC0gMV0gPT0gJ1xuJyAmJiBjdXIgIT0gJ1xuJykgewotCQkJCQlmaXJzdExGaW5kZXggPSB0aGlzLmluZGV4IC0gMTsKLQkJCQl9Ci0JCQkJbWlzY0luZGV4Kys7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY3VyICE9IEVPRikgewotCQkJZG8gewotCQkJCWlmIChjdXIgPT0gJyYnKSB7Ci0JCQkJCWlmICghZXh0cmFjdE51bSkgewotCQkJCQkJaWYgKChjdXIgPSByZWFkKCkpID09ICcjJykgewotCQkJCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoJyYnKTsKLQkJCQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKCcjJyk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXVucmVhZChjdXIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWludCBjaGFyRW50aXR5ID0gcnNsdkNoYXJFbnQoKTsKLQkJCQkJaWYgKGNoYXJFbnRpdHkgPT0gLTEpIHsKLQkJCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoJyYnKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGNoYXJFbnRpdHkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0Q2hhclRvTWlzY0J1ZmZlcihtaXNjSW5kZXgsIChjaGFyKSBjdXIpOwotCQkJCQlpZiAobWlzY0luZGV4ID4gMCAmJiBtaXNjQnVmZmVyW21pc2NJbmRleCAtIDFdID09ICdcbicKLQkJCQkJCQkmJiBjdXIgIT0gJ1xuJykgewotCQkJCQkJZmlyc3RMRmluZGV4ID0gdGhpcy5pbmRleCAtIDI7Ci0JCQkJCX0KLQkJCQkJbWlzY0luZGV4Kys7Ci0JCQkJfQotCQkJfSB3aGlsZSAoKChjdXIgPSByZWFkKCkpICE9ICc8JyB8fCAhQ2hhcmFjdGVyCi0JCQkJCS5pc0xvd2VyQ2FzZSgoY2hhcikgKHN1Y2NlZWRpbmcgPSBzZW5jZSgpKSkKLQkJCQkJJiYgIUNoYXJhY3Rlci5pc1VwcGVyQ2FzZSgoY2hhcikgc3VjY2VlZGluZykKLQkJCQkJJiYgc3VjY2VlZGluZyAhPSAnIScKLQkJCQkJJiYgc3VjY2VlZGluZyAhPSAnPycKLQkJCQkJJiYgKHN1Y2NlZWRpbmcgIT0gJy8nIHx8ICFDaGFyYWN0ZXIKLQkJCQkJCQkuaXNMb3dlckNhc2UoKGNoYXIpIChzdWNjZWVkaW5nID0gc2VuY2UoMSkpKQotCQkJCQkJCSYmICFDaGFyYWN0ZXIuaXNVcHBlckNhc2UoKGNoYXIpIHN1Y2NlZWRpbmcpKSkKLQkJCQkJJiYgY3VyICE9IEVPRik7Ci0JCX0KLQkJaWYgKGN1ciAhPSBFT0YpCi0JCQl1bnJlYWQoY3VyKTsKLQkJaWYgKCFwcnN2V1MpIHsKLQkJCWludCBiZWdpbiA9IDA7Ci0JCQl3aGlsZSAoKGN1ciA9IG1pc2NCdWZmZXJbYmVnaW5dKSA9PSAnXHInIHx8IGN1ciA9PSAnXG4nKQotCQkJCWJlZ2luKys7Ci0JCQlpbnQgZW5kID0gbWlzY0luZGV4IC0gMTsKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKChjdXIgPSBtaXNjQnVmZmVyW2VuZF0pID09ICdccicgfHwgY3VyID09ICdcbicpCi0JCQkJCWVuZC0tOwotCQkJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQlzdmFsID0gbmV3IFN0cmluZyhtaXNjQnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQkJCXBhcnNlci5zZXRDaGFyYWN0ZXIobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQkJCQlyZXR1cm4gKHR0eXBlID0gUENEQVRBKTsKLQkJCX0KLQkJCWludCBsZW4gPSBlbmQgKyAxIC0gYmVnaW47Ci0JCQlzdmFsID0gbmV3IFN0cmluZyhtaXNjQnVmZmVyLCBiZWdpbiwgbGVuKTsKLQkJCXBhcnNlci5zZXRDaGFyYWN0ZXIobWlzY0J1ZmZlciwgYmVnaW4sIGxlbik7Ci0JCQlpZiAoZW5kICE9IG1pc2NJbmRleCAtIDEpIHsKLQkJCQl1bnJlYWQobWlzY0J1ZmZlciwgZW5kICsgMSwgbWlzY0luZGV4IC0gZW5kIC0gMSk7Ci0JCQkJbGFzdExGaW5kZXggPSBmaXJzdExGaW5kZXg7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdmFsID0gbmV3IFN0cmluZyhtaXNjQnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQkJcGFyc2VyLnNldENoYXJhY3RlcihtaXNjQnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQkJcmV0dXJuICh0dHlwZSA9IFdISVRFU1BBQ0UpOwotCQl9Ci0JCXJldHVybiAodHR5cGUgPSBQQ0RBVEEpOwotCX0KLQotCXByaXZhdGUgY2hhciBlbmRUYWdCdWZmZXJbXSA9IG5ldyBjaGFyWzY0XTsKLQotCS8qKgotCSAqIEdldHMgcmF3IHRleHQgdXAgdG8gZW5kIHRhZyBzcGVjaWZpZWQoJmx0Ozxjb2RlPmVuZDwvY29kZT4mZ3Q7KQotCSAqIAotCSAqIEBwYXJhbSBlbmQKLQkgKiAgICAgICAgICAgIHNwZWNpZmVkIGVuZCB0YWdzIG5hbWUKLQkgKiBAcmV0dXJuIHJhdyB0ZXh0IHVwIHRvIHNwZWNpZmllZCBlbmQgdGFnLgotCSAqLwotCWZpbmFsIFN0cmluZyByYXdUZXh0KFN0cmluZyBlbmQpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24gewotCQljaGFyIGVuZFRhZ0FycmF5W10gPSBlbmQudG9VcHBlckNhc2UoKS50b0NoYXJBcnJheSgpOwotCQlpbnQgY2g7Ci0JCW1pc2NJbmRleCA9IDA7Ci0JCWludCBsaW1pdENhbmRpZGF0ZSA9IDA7Ci0KLQkJYm9vbGVhbiBpbkNvbW1lbnQgPSBmYWxzZTsKLQotCQlvdXRlcjogd2hpbGUgKHRydWUpIHsKLQkJCWNoID0gcmVhZCgpOwotCQkJaWYgKCFpbkNvbW1lbnQgJiYgY2ggPT0gJzwnKSB7Ci0JCQkJY2ggPSByZWFkKCk7Ci0JCQkJaWYgKGNoID09ICcvJykgewotCQkJCQlpZiAobGltaXRDYW5kaWRhdGUgPT0gMCkgewotCQkJCQkJbGltaXRDYW5kaWRhdGUgPSBtaXNjSW5kZXg7Ci0JCQkJCX0KLQkJCQkJZW5kVGFnQnVmZmVySW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCQllbmRUYWdCdWZmZXJbZW5kVGFnQnVmZmVySW5kZXhdID0gKGNoYXIpIHJlYWQoKTsKLQkJCQkJCWlmICgoZW5kVGFnQnVmZmVyW2VuZFRhZ0J1ZmZlckluZGV4XSAmIDB4ZmZkZikgPT0gZW5kVGFnQXJyYXlbZW5kVGFnQnVmZmVySW5kZXhdKSB7Ci0JCQkJCQkJZW5kVGFnQnVmZmVySW5kZXgrKzsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZW5kVGFnQnVmZmVySW5kZXgrKzsKLQkJCQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKCc8Jyk7Ci0JCQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcignLycpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZW5kVGFnQnVmZmVySW5kZXg7IGorKykgewotCQkJCQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKGVuZFRhZ0J1ZmZlcltqXSk7Ci0JCQkJCQkJfQotCQkJCQkJCWNvbnRpbnVlIG91dGVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSAoY2ggPSByZWFkKCkpKSkgewotCQkJCQkJZW5kVGFnQnVmZmVyW2VuZFRhZ0J1ZmZlckluZGV4KytdID0gKGNoYXIpIGNoOwotCQkJCQl9Ci0JCQkJCWlmIChjaCA9PSAnPicpIHsKLQkJCQkJCWVuZFRhZ0J1ZmZlckluZGV4ICs9IDM7Ci0JCQkJCQl1bnJlYWQoZW5kVGFnQnVmZmVyLCAwLCBlbmRUYWdCdWZmZXJJbmRleCk7Ci0JCQkJCQlyZXR1cm4gbmV3IFN0cmluZyhtaXNjQnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZW5kVGFnQnVmZmVyW2VuZFRhZ0J1ZmZlckluZGV4KytdID0gKGNoYXIpIGNoOwotCQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcignPCcpOwotCQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcignLycpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmRUYWdCdWZmZXJJbmRleDsgaSsrKSB7Ci0JCQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcihlbmRUYWdCdWZmZXJbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChjaCA9PSAnIScpIHsKLQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcignPCcpOwotCQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKChjaGFyKSBjaCk7Ci0JCQkJCWNoID0gcmVhZCgpOwotCQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKChjaGFyKSBjaCk7Ci0JCQkJCWlmIChjaCA9PSAnLScpIHsKLQkJCQkJCWNoID0gcmVhZCgpOwotCQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcigoY2hhcikgY2gpOwotCQkJCQkJaWYgKGNoID09ICctJykgewotCQkJCQkJCWluQ29tbWVudCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0gZWxzZSB7Ci0JCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoJzwnKTsKLQkJCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcigoY2hhcikgY2gpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY2ggPT0gRU9GKSB7Ci0JCQkJcGFyc2VyLmVycm9yKElQYXJzZXJFcnJvci5NSVNDX0VSUiwgIlVuZXhwZWN0ZWQgRU9GIGluIENEQVRBIGFmdGVyICIgKyBlbmQpOwotCQkJCWVuZFRhZ0J1ZmZlckluZGV4ID0gMDsKLQkJCQlpZiAobGltaXRDYW5kaWRhdGUgIT0gMCkgewotCQkJCQl1bnJlYWQobWlzY0J1ZmZlciwgbGltaXRDYW5kaWRhdGUsIG1pc2NJbmRleAotCQkJCQkJCS0gbGltaXRDYW5kaWRhdGUpOwotCQkJCQlyZXR1cm4gbmV3IFN0cmluZyhtaXNjQnVmZmVyLCAwLCBsaW1pdENhbmRpZGF0ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG5ldyBTdHJpbmcobWlzY0J1ZmZlciwgMCwgbWlzY0luZGV4KTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGluQ29tbWVudCAmJiBjaCA9PSAnLScpIHsKLQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKChjaGFyKSBjaCk7Ci0JCQkJY2ggPSByZWFkKCk7Ci0JCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcigoY2hhcikgY2gpOwotCQkJCWlmIChjaCA9PSAnLScpIHsKLQkJCQkJY2ggPSByZWFkKCk7Ci0JCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGNoKTsKLQkJCQkJaWYgKGNoID09ICc+JykgewotCQkJCQkJaW5Db21tZW50ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gc2V0Q2hhclRvTWlzY0J1ZmZlcihtaXNjSW5kZXgsIChjaGFyKWNoKTsKLQkJCQkvLyBtaXNjSW5kZXgrKzsKLQkJCQlhZGRDaGFyVG9NaXNjQnVmZmVyKChjaGFyKSBjaCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBlbmRUYWdCdWZmZXJJbmRleCA9IDA7Ci0KLQl2b2lkIGVhdENEQVRBRW5kVGFnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IGVuZFRhZ0J1ZmZlckluZGV4OyBpID4gMDsgaS0tKQotCQkJcmVhZCgpOwotCX0KLQotCXByaXZhdGUgY2hhciBhdHRyVmFsQnVmZmVyW10gPSBuZXcgY2hhcls4MTkyXTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5jbHVkZUFuZ2xlQnJhY2tldChjaGFyIGNoYXJzW10sIGludCBiZWdpbiwgaW50IGVuZCkgewotCQl3aGlsZSAoYmVnaW4gPCBlbmQpIHsKLQkJCWNoYXIgY2ggPSBjaGFyc1tiZWdpbisrXTsKLQkJCWlmIChjaCA9PSAnPicgfHwgY2ggPT0gJzwnKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tBdHRyVmFsQnVmZmVyKGludCBpbmRleCkgewotCQlpbnQgY3VyU2l6ZSA9IGF0dHJWYWxCdWZmZXIubGVuZ3RoOwotCQlpZiAoY3VyU2l6ZSA8IGluZGV4ICsgMTI4KSB7Ci0JCQljaGFyIHRtcEJ1ZmZlcltdID0gbmV3IGNoYXJbY3VyU2l6ZSArIDgxOTJdOwotCQkJU3lzdGVtLmFycmF5Y29weShhdHRyVmFsQnVmZmVyLCAwLCB0bXBCdWZmZXIsIDAsIGN1clNpemUpOwotCQkJYXR0clZhbEJ1ZmZlciA9IHRtcEJ1ZmZlcjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYWRzIGF0dHJpYnV0ZSB2YWx1ZXMuIE5hc3R5IGF0dHJpYnV0ZSB2YWx1ZSBleGFtcGxlczoKLQkgKiA8dWw+Ci0JICogPGxpPndpZHRoPTxlbT4mcXVvdDsxMDAmcXVvdDslPC9lbT4KLQkgKiA8bGk+d2lkdGg9PGVtPiZxdW90OzEwMCU8L2VtPiBoZWlnaHQ9Li4uCi0JICogPC91bD4KLQkgKi8KLQlmaW5hbCBTdHJpbmcgcmVhZEF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZURlZmluaXRpb24gYWQsIEVsZW1lbnREZWZpbml0aW9uIGVkKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJaW50IGNoOwotCQl3aGlsZSAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgKGNoID0gcmVhZCgpKSkpCi0JCQk7Ci0JCW1pc2NJbmRleCA9IDA7Ci0JCWludCBhdHRyVmFsQnVmZmVySW5kZXggPSAwOwotCi0JCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGNoKTsKLQotCQlpZiAoY2ggPT0gJ1wnJyB8fCBjaCA9PSAnIicpIHsKLQkJCWludCBlbmRDaGFyID0gY2g7Ci0JCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSBFT0YgJiYgY2ggIT0gZW5kQ2hhcikgewotCQkJCWNoZWNrQXR0clZhbEJ1ZmZlcihhdHRyVmFsQnVmZmVySW5kZXgpOwotCi0JCQkJc2V0Q2hhclRvTWlzY0J1ZmZlcihtaXNjSW5kZXgsIChjaGFyKSBjaCk7Ci0JCQkJbWlzY0luZGV4Kys7Ci0JCQkJaWYgKGNoID09ICcmJyAmJiAoZXh0cmFjdENoYXIgfHwgZXh0cmFjdE51bSkpIHsKLQkJCQkJaWYgKCFleHRyYWN0TnVtKSB7Ci0JCQkJCQlpZiAoKGNoID0gcmVhZCgpKSA9PSAnIycpIHsKLQkJCQkJCQlhdHRyVmFsQnVmZmVyW2F0dHJWYWxCdWZmZXJJbmRleCsrXSA9ICcmJzsKLQkJCQkJCQlhdHRyVmFsQnVmZmVyW2F0dHJWYWxCdWZmZXJJbmRleCsrXSA9ICcjJzsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpbnQgY2hhckVudGl0eSA9IHJzbHZDaGFyRW50KCk7Ci0JCQkJCWlmIChjaGFyRW50aXR5ID09IC0xKSB7Ci0JCQkJCQlhdHRyVmFsQnVmZmVyW2F0dHJWYWxCdWZmZXJJbmRleCsrXSA9ICcmJzsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWF0dHJWYWxCdWZmZXJbYXR0clZhbEJ1ZmZlckluZGV4KytdID0gKGNoYXIpIGNoYXJFbnRpdHk7Ci0KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50aXR5QnVmSW5kZXg7IGkrKykgewotCQkJCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGVudGl0eUJ1ZltpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl0cnkgewotCQkJCQkJYXR0clZhbEJ1ZmZlclthdHRyVmFsQnVmZmVySW5kZXhdID0gKGNoYXIpIGNoOwotCQkJCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCQkJY2hhciBuZXdBdHRyVmFsQnVmZmVyW10gPSBuZXcgY2hhclthdHRyVmFsQnVmZmVyLmxlbmd0aCAqIDJdOwotCQkJCQkJU3lzdGVtLmFycmF5Y29weShhdHRyVmFsQnVmZmVyLCAwLCBuZXdBdHRyVmFsQnVmZmVyLCAwLAotCQkJCQkJCQlhdHRyVmFsQnVmZmVySW5kZXgpOwotCQkJCQkJYXR0clZhbEJ1ZmZlciA9IG5ld0F0dHJWYWxCdWZmZXI7Ci0JCQkJCX0KLQkJCQkJYXR0clZhbEJ1ZmZlckluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNoICE9IEVPRikgewotCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGNoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGFyc2VyLmVycm9yKElQYXJzZXJFcnJvci5BVFRSX1ZBTFVFLCAiRU9GIGluIGF0dHJpYnV0ZSB2YWx1ZS4iKTsKLQkJCX0KLQkJCWlmIChtaXNjSW5kZXggPiAxCi0JCQkJCSYmIChpbmNsdWRlQW5nbGVCcmFja2V0KG1pc2NCdWZmZXIsIDEsIG1pc2NJbmRleCAtIDEpIHx8IG1pc2NCdWZmZXJbbWlzY0luZGV4IC0gMl0gPT0gJz0nKQotCQkJCQkmJiBwYXJzZXIuaGFuZGxlRXJyb3IoSVBhcnNlckVycm9yLkFUVFJfVkFMVUUsIG5ldyBTdHJpbmcobWlzY0J1ZmZlciwgMCwKLQkJCQkJCQltaXNjSW5kZXgpKSkgewotCQkJCXJldHVybiByZWFkQXR0cmlidXRlVmFsdWUoYWQsIGVkKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjaCA9PSAnPicpIHsKLQkJCXVucmVhZChjaCk7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgY2gxID0gLTE7Ci0JCQlpZiAoIWlzVW5xdW90ZWRDaGFyKChjaGFyKSBjaCkgJiYgKGNoMSA9IHNlbmNlKCkpID09ICciJwotCQkJCQl8fCBjaDEgPT0gJ1wnJyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSBjaDEpKSB7Ci0JCQkJcmV0dXJuIHJlYWRBdHRyaWJ1dGVWYWx1ZShhZCwgZWQpOwotCQkJfQotCQkJYXR0clZhbEJ1ZmZlclthdHRyVmFsQnVmZmVySW5kZXgrK10gPSAoY2hhcikgY2g7Ci0JCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSBFT0YgJiYgY2ggIT0gJz4nCi0JCQkJCSYmICFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSBjaCkpIHsKLQotCQkJCWNoZWNrQXR0clZhbEJ1ZmZlcihhdHRyVmFsQnVmZmVySW5kZXgpOwotCi0JCQkJaWYgKGNoID09ICcmJyAmJiAoZXh0cmFjdENoYXIgfHwgZXh0cmFjdE51bSkpIHsKLQkJCQkJaWYgKCFleHRyYWN0TnVtKSB7Ci0JCQkJCQlpZiAoKGNoID0gcmVhZCgpKSA9PSAnIycpIHsKLQkJCQkJCQlhdHRyVmFsQnVmZmVyW2F0dHJWYWxCdWZmZXJJbmRleCsrXSA9ICcmJzsKLQkJCQkJCQlhdHRyVmFsQnVmZmVyW2F0dHJWYWxCdWZmZXJJbmRleCsrXSA9ICcjJzsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpbnQgY2hhckVudGl0eSA9IHJzbHZDaGFyRW50KCk7Ci0JCQkJCWlmIChjaGFyRW50aXR5ID09IC0xKSB7Ci0JCQkJCQlhdHRyVmFsQnVmZmVyW2F0dHJWYWxCdWZmZXJJbmRleCsrXSA9ICcmJzsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWF0dHJWYWxCdWZmZXJbYXR0clZhbEJ1ZmZlckluZGV4KytdID0gKGNoYXIpIGNoYXJFbnRpdHk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlhdHRyVmFsQnVmZmVyW2F0dHJWYWxCdWZmZXJJbmRleCsrXSA9IChjaGFyKSBjaDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2ggPT0gJz4nKQotCQkJCXVucmVhZChjaCk7Ci0JCX0KLQkJY2ggPSByZWFkKCk7Ci0JCVN0cmluZyByZXQgPSBuZXcgU3RyaW5nKGF0dHJWYWxCdWZmZXIsIDAsIGF0dHJWYWxCdWZmZXJJbmRleCk7Ci0JCWlmIChjaCA9PSAnIicgfHwgY2ggPT0gJ1wnJykgewotCQkJaWYgKCFwYXJzZXIuaGFuZGxlRXJyb3IoSVBhcnNlckVycm9yLkJFRk9SRV9BVFRSTkFNRSwgIlwiIikpIHsKLQkJCQlwYXJzZXIuZXJyb3IoSVBhcnNlckVycm9yLlNUQVJUVEFHX1NZTlRBWF9FUlIsCi0JCQkJCQkicmVxdWlyZXMgYXR0cmlidXRlIG5hbWUgYWZ0ZXIgXCIiICsgcmV0ICsgJyInKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXVucmVhZChjaCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcml2YXRlIGludCBzZW5jZShpbnQgZm9yd2FyZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3dpdGNoIChmb3J3YXJkKSB7Ci0JCWNhc2UgMDoKLQkJCWludCBjaCA9IHJlYWQoKTsKLQkJCXVucmVhZChjaCk7Ci0JCQlyZXR1cm4gY2g7Ci0JCWNhc2UgMToKLQkJCWludCBjaDAgPSByZWFkKCk7Ci0JCQljaCA9IHJlYWQoKTsKLQkJCXVucmVhZChjaCk7Ci0JCQl1bnJlYWQoY2gwKTsKLQkJCXJldHVybiBjaDsKLQkJZGVmYXVsdDoKLQkJCWludCBidWZbXSA9IG5ldyBpbnRbZm9yd2FyZF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZvcndhcmQ7IGkrKykgewotCQkJCWJ1ZltpXSA9IHJlYWQoKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSBmb3J3YXJkIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQl1bnJlYWQoYnVmW2ldKTsKLQkJCX0KLQkJCXJldHVybiBidWZbZm9yd2FyZCAtIDFdOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgc2VuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgY2ggPSByZWFkKCk7Ci0JCXVucmVhZChjaCk7Ci0JCXJldHVybiBjaDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVbnF1b3RlZENoYXIoY2hhciBjaCkgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGNoKSB8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoY2gpCi0JCQkJfHwgQ2hhcmFjdGVyLmlzRGlnaXQoY2gpIHx8IGNoID09ICctJyB8fCBjaCA9PSAnLic7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZXRhZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpbnQgY2g7Ci0JCS8vIHdoaWxlIChDaGFyYWN0ZXIKLQkJLy8gLmlzV2hpdGVzcGFjZShtaXNjQnVmZmVyW21pc2NJbmRleCsrXSA9IChjaGFyKSAoY2ggPSByZWFkKCkpKSk7Ci0JCXdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSAoY2ggPSByZWFkKCkpKSkgewotCQkJYWRkQ2hhclRvTWlzY0J1ZmZlcigoY2hhcikgY2gpOwotCQl9Ci0JCTsKLQkJYWRkQ2hhclRvTWlzY0J1ZmZlcigoY2hhcikgY2gpOwotCi0JCWlmIChjaCA9PSAnPicpIHsKLQkJCXN0YXRlID0gREVGQVVMVDsKLQkJCXN2YWwgPSAiPiI7Ci0JCQlwYXJzZXIuc2V0Q2hhcmFjdGVyKG1pc2NCdWZmZXIsIGV0YWdTdGFydEluZGV4LCBtaXNjSW5kZXgKLQkJCQkJLSBldGFnU3RhcnRJbmRleCk7Ci0JCQlyZXR1cm4gKHR0eXBlID0gJz4nKTsKLQkJfSBlbHNlIGlmIChjaCA9PSBFT0YpIHsKLQkJCXN0YXRlID0gREVGQVVMVDsKLQkJCXN2YWwgPSAiIjsKLQkJCXJldHVybiAodHR5cGUgPSBFT0YpOwotCQl9IGVsc2UgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZSgoY2hhcikgY2gpCi0JCQkJfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKChjaGFyKSBjaCkpIHsKLQkJCWludCBzdGFydEluZGV4ID0gbWlzY0luZGV4IC0gMTsKLQkJCWRvIHsKLQkJCQlzZXRDaGFyVG9NaXNjQnVmZmVyKG1pc2NJbmRleCwgKGNoYXIpIChjaCA9IHJlYWQoKSkpOwotCQkJCW1pc2NJbmRleCsrOwotCQkJfSB3aGlsZSAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKChjaGFyKSBjaCkKLQkJCQkJfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKChjaGFyKSBjaCkKLQkJCQkJfHwgQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpIGNoKSB8fCBjaCA9PSAnLicgfHwgY2ggPT0gJy0nCi0JCQkJCXx8IGNoID09ICc6JyB8fCBjaCA9PSAnIycpOwotCQkJdW5yZWFkKGNoKTsKLQkJCW1pc2NJbmRleC0tOwotCQkJc3ZhbCA9IG5ldyBTdHJpbmcobWlzY0J1ZmZlciwgc3RhcnRJbmRleCwgbWlzY0luZGV4IC0gc3RhcnRJbmRleCk7Ci0JCQlyZXR1cm4gKHR0eXBlID0gTkFNRV9DSEFSKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBldGFnKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCB0YWcoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaW50IGNoOwotCQltaXNjSW5kZXggPSAwOwotCQl3aGlsZSAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgoY2hhcikgKGNoID0gcmVhZCgpKSkpCi0JCQk7Ci0KLQkJaWYgKGNoID09ICchJykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJjb21tZW50IGJldHdlZW4gRE9DVFlQRSBhbmQgSFRNTCAhISEiKTsKLQkJCXJldHVybiBlYXRDb21tZW50KCk7Ci0JCX0KLQotCQlpZiAoY2ggPT0gJz4nKSB7Ci0JCQlzdGF0ZSA9IERFRkFVTFQ7Ci0JCQlzdmFsID0gIj4iOwotCQkJcmV0dXJuICh0dHlwZSA9ICc+Jyk7Ci0JCX0gZWxzZSBpZiAoY2ggPT0gRU9GKSB7Ci0JCQlzdGF0ZSA9IERFRkFVTFQ7Ci0JCQlzdmFsID0gIiI7Ci0JCQlyZXR1cm4gKHR0eXBlID0gRU9GKTsKLQkJfSBlbHNlIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoKGNoYXIpIGNoKQotCQkJCXx8IENoYXJhY3Rlci5pc1VwcGVyQ2FzZSgoY2hhcikgY2gpKSB7Ci0KLQkJCWRvIHsKLQkJCQlzZXRDaGFyVG9NaXNjQnVmZmVyKG1pc2NJbmRleCwgKGNoYXIpIGNoKTsKLQkJCQltaXNjSW5kZXgrKzsKLQkJCQljaCA9IHJlYWQoKTsKLQkJCX0gd2hpbGUgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZSgoY2hhcikgY2gpCi0JCQkJCXx8IENoYXJhY3Rlci5pc1VwcGVyQ2FzZSgoY2hhcikgY2gpCi0JCQkJCXx8IENoYXJhY3Rlci5pc0RpZ2l0KChjaGFyKSBjaCkgfHwgY2ggPT0gJy4nIHx8IGNoID09ICctJwotCQkJCQl8fCBjaCA9PSAnOicgfHwgY2ggPT0gJyMnKTsKLQkJCXVucmVhZChjaCk7Ci0JCQlzdmFsID0gbmV3IFN0cmluZyhtaXNjQnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQkJcmV0dXJuICh0dHlwZSA9IE5BTUVfQ0hBUik7Ci0JCX0gZWxzZSBpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoKGNoYXIpIGNoKSkgewotCQkJZG8gewotCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGNoKTsKLQkJCQljaCA9IHJlYWQoKTsKLQkJCX0gd2hpbGUgKENoYXJhY3Rlci5pc0RpZ2l0KChjaGFyKSBjaCkpOwotCQkJaWYgKGNoID09ICclJykgewotCQkJCWFkZENoYXJUb01pc2NCdWZmZXIoKGNoYXIpIGNoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdW5yZWFkKGNoKTsKLQkJCX0KLQkJCXN2YWwgPSBuZXcgU3RyaW5nKG1pc2NCdWZmZXIsIDAsIG1pc2NJbmRleCk7Ci0JCQlyZXR1cm4gKHR0eXBlID0gTlVNKTsKLQkJfSBlbHNlIGlmIChjaCA9PSAnPCcpIHsKLQkJCWNoID0gcmVhZCgpOwotCQkJaWYgKGNoID09ICcvJykgewotCQkJCXN2YWwgPSAiPC8iOwotCQkJCW1pc2NCdWZmZXJbMF0gPSAnPCc7Ci0JCQkJbWlzY0J1ZmZlclsxXSA9ICcvJzsKLQkJCQlldGFnU3RhcnRJbmRleCA9IDA7Ci0JCQkJc3RhdGUgPSBFVEFHTzsKLQkJCQlyZXR1cm4gKHR0eXBlID0gRVRBR08pOwotCQkJfSBlbHNlIHsKLQkJCQl1bnJlYWQoY2gpOwotCQkJCXN2YWwgPSAiPCI7Ci0JCQkJcmV0dXJuICh0dHlwZSA9ICc8Jyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKHR0eXBlID0gY2gpOwotCQl9Ci0JfQotCi0JZmluYWwgdm9pZCBjb25zdW1lVW50aWwoY2hhciBsaW1pdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGxpbWl0ICE9IHJlYWQoKSkKLQkJCTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJzdldTID0gZmFsc2U7Ci0KLQl2b2lkIHNldFByZXNlcnZlV2hpdGVzcGFjZShib29sZWFuIHByZXNlcnYpIHsKLQkJdGhpcy5wcnN2V1MgPSBwcmVzZXJ2OwotCX0KLQotCXByaXZhdGUgaW50IGluZGV4ID0gMDsKLQotCXByaXZhdGUgY2hhciBjaGFyQnVmZmVyW10gPSBuZXcgY2hhcltJTklUSUFMX0JVRl9TSVpdOwotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZEJ1ZmZlcihpbnQgaW5jcmVhc2UpIHsKLQkJaWYgKGJ1ZkxpbWl0ICE9IGluZGV4KSB7Ci0JCQlpbmNyZWFzZSArPSBpbmRleCA8IGJ1ZkxpbWl0ID8gKGJ1ZkxpbWl0ICsgaW5kZXgpCi0JCQkJCTogKGNoYXJCdWZmZXIubGVuZ3RoIC0gaW5kZXggKyBidWZMaW1pdCk7Ci0JCX0KLQkJaW50IGxlbmd0aCA9IGNoYXJCdWZmZXIubGVuZ3RoICogMjsKLQkJd2hpbGUgKGxlbmd0aCA8IGluY3JlYXNlKQotCQkJbGVuZ3RoICo9IDI7Ci0JCWNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhcltsZW5ndGhdOwotCQlpZiAoaW5kZXggPCBidWZMaW1pdCkgewotCQkJU3lzdGVtLmFycmF5Y29weShjaGFyQnVmZmVyLCBpbmRleCwgbmV3QnVmZmVyLCBpbmRleCwgYnVmTGltaXQKLQkJCQkJLSBpbmRleCk7Ci0JCX0gZWxzZSBpZiAoaW5kZXggIT0gYnVmTGltaXQpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoY2hhckJ1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCBidWZMaW1pdCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGNoYXJCdWZmZXIsIGluZGV4LCBuZXdCdWZmZXIsIGxlbmd0aAotCQkJCQktIGNoYXJCdWZmZXIubGVuZ3RoICsgaW5kZXgsIGNoYXJCdWZmZXIubGVuZ3RoIC0gaW5kZXgpOwotCQkJaW5kZXggPSBsZW5ndGggLSBjaGFyQnVmZmVyLmxlbmd0aCArIGluZGV4OwotCQl9Ci0JCWNoYXJCdWZmZXIgPSBuZXdCdWZmZXI7Ci0JfQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5JVElBTF9CVUZfU0laID0gODE5MjsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFQURfVU5JVCA9IDEwMjQ7Ci0KLQlwcml2YXRlIGludCBidWZMaW1pdCA9IDA7Ci0KLQlwcml2YXRlIGNoYXIgbWlzY0J1ZmZlcltdID0gbmV3IGNoYXJbSU5JVElBTF9CVUZfU0laXTsKLQotCXByaXZhdGUgaW50IG1pc2NJbmRleCA9IDA7Ci0KLQlwcml2YXRlIHZvaWQgZXhwYW5kTWlzY0J1ZmZlcigpIHsKLQkJY2hhciBuZXdCdWZmZXJbXTsKLQkJaWYgKG1pc2NCdWZmZXIubGVuZ3RoIDwgMzI3NjgpIHsKLQkJCW5ld0J1ZmZlciA9IG5ldyBjaGFyW21pc2NCdWZmZXIubGVuZ3RoICogMl07Ci0JCX0gZWxzZSB7Ci0JCQluZXdCdWZmZXIgPSBuZXcgY2hhclttaXNjQnVmZmVyLmxlbmd0aCArIDMyNzY4XTsKLQkJfQotCi0JCVN5c3RlbS5hcnJheWNvcHkobWlzY0J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCBtaXNjSW5kZXgpOwotCQltaXNjQnVmZmVyID0gbmV3QnVmZmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9yZVVudGlsKGNoYXIgbGltaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjaCA9IHJlYWQoKTsKLQkJd2hpbGUgKGNoICE9IGxpbWl0ICYmIGNoICE9IEVPRikgewotCQkJc2V0Q2hhclRvTWlzY0J1ZmZlcihtaXNjSW5kZXgsIChjaGFyKSBjaCk7Ci0JCQltaXNjSW5kZXgrKzsKLQkJCWNoID0gcmVhZCgpOwotCQl9Ci0JfQotCi0JZmluYWwgU3RyaW5nIGVhdFVudGlsKGNoYXIgbGltaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW1pc2NJbmRleCA9IDA7Ci0JCWludCBjaCA9IHJlYWQoKTsKLQkJd2hpbGUgKGNoICE9IGxpbWl0ICYmIGNoICE9IEVPRikgewotCQkJc2V0Q2hhclRvTWlzY0J1ZmZlcihtaXNjSW5kZXgsIChjaGFyKSBjaCk7Ci0JCQltaXNjSW5kZXgrKzsKLQkJCWNoID0gcmVhZCgpOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKG1pc2NCdWZmZXIsIDAsIG1pc2NJbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNraXBMRjsKLQotCXByaXZhdGUgYm9vbGVhbiBmaWxsQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGJ1ZkxpbWl0ID09IGNoYXJCdWZmZXIubGVuZ3RoKSB7Ci0JCQlpbmRleCA9IDA7Ci0JCQlidWZMaW1pdCA9IHJlYWRlci5yZWFkKGNoYXJCdWZmZXIsIDAsIFJFQURfVU5JVCk7Ci0JCQlpZiAoYnVmTGltaXQgPT0gLTEpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKGJ1ZkxpbWl0ICsgUkVBRF9VTklUIDwgY2hhckJ1ZmZlci5sZW5ndGgpIHsKLQkJCWludCBjb3VudCA9IHJlYWRlci5yZWFkKGNoYXJCdWZmZXIsIGJ1ZkxpbWl0LCBSRUFEX1VOSVQpOwotCQkJaWYgKGNvdW50ID09IC0xKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWJ1ZkxpbWl0ICs9IGNvdW50OwotCQl9IGVsc2UgewotCQkJaW50IGNvdW50ID0gcmVhZGVyLnJlYWQoY2hhckJ1ZmZlciwgYnVmTGltaXQsIGNoYXJCdWZmZXIubGVuZ3RoCi0JCQkJCS0gYnVmTGltaXQpOwotCQkJaWYgKGNvdW50ID09IC0xKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWJ1ZkxpbWl0ICs9IGNvdW50OwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIHByaXZhdGUgdm9pZCBwcmludENoYXJCdWZmZXIoKSB7Ci0JLy8gaWYgKGJ1ZkxpbWl0IDwgaW5kZXgpIHsKLQkvLyBTeXN0ZW0uZXJyLnByaW50KAotCS8vIG5ldyBTdHJpbmcoY2hhckJ1ZmZlciwgaW5kZXgsIGNoYXJCdWZmZXIubGVuZ3RoIC0gaW5kZXgpKTsKLQkvLyBTeXN0ZW0uZXJyLnByaW50bG4obmV3IFN0cmluZyhjaGFyQnVmZmVyLCAwLCBidWZMaW1pdCkpOwotCS8vIH0gZWxzZSBpZiAoYnVmTGltaXQgPT0gaW5kZXgpIHsKLQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oIkVtcHR5Iik7Ci0JLy8gfSBlbHNlIHsKLQkvLyBTeXN0ZW0uZXJyLnByaW50bG4obmV3IFN0cmluZyhjaGFyQnVmZmVyLCBpbmRleCwgYnVmTGltaXQgLSBpbmRleCkpOwotCS8vIH0KLQkvLyB9Ci0KLQlwcml2YXRlIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGJ1ZkxpbWl0ID09IGluZGV4KSB7Ci0JCQlpZiAoIWZpbGxCdWZmZXIoKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gY2hhckJ1ZmZlci5sZW5ndGgpIHsKLQkJCWluZGV4ID0gMDsKLQkJfQotCQlpbnQgcmV0ID0gY2hhckJ1ZmZlcltpbmRleCsrXTsKLQkJaWYgKHNraXBMRikgewotCQkJaWYgKHJldCA9PSAnXG4nKSB7Ci0JCQkJaWYgKGJ1ZkxpbWl0ID09IGluZGV4KSB7Ci0JCQkJCWlmICghZmlsbEJ1ZmZlcigpKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCX0gZWxzZSBpZiAoaW5kZXggPT0gY2hhckJ1ZmZlci5sZW5ndGgpIHsKLQkJCQkJaW5kZXggPSAwOwotCQkJCX0KLQkJCQlsYXN0TEZpbmRleCsrOwotCQkJCXJldCA9IGNoYXJCdWZmZXJbaW5kZXgrK107Ci0JCQl9Ci0JCQlza2lwTEYgPSBmYWxzZTsKLQkJfQotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlICdccic6Ci0JCQlza2lwTEYgPSB0cnVlOwotCQljYXNlICdcbic6Ci0JCQlsaW5lTnVtYmVyKys7Ci0JCQlsYXN0TEZpbmRleCA9IGluZGV4IC0gMTsKLQkJCXJldHVybiAnXG4nOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgbGFzdExGaW5kZXggPSAtMTsKLQotCXByaXZhdGUgaW50IGxpbmVOdW1iZXIgPSAwOwotCi0JcHJpdmF0ZSB2b2lkIHVucmVhZChpbnQgY2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChjaCA9PSAnXG4nKQotCQkJbGluZU51bWJlci0tOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJY2hhckJ1ZmZlcltpbmRleCA9IGNoYXJCdWZmZXIubGVuZ3RoIC0gMV0gPSAoY2hhcikgY2g7Ci0JCX0gZWxzZSB7Ci0JCQljaGFyQnVmZmVyWy0taW5kZXhdID0gKGNoYXIpIGNoOwotCQl9Ci0JfQotCi0Jdm9pZCB1bnJlYWQoU3RyaW5nIHN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdW5yZWFkKHN0ci50b0NoYXJBcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5yZWFkKGNoYXIgc3RyW10sIGludCBiZWdpbiwgaW50IGxlbikgewotCQlpZiAoYnVmTGltaXQgPj0gaW5kZXgpIHsKLQkJCWlmIChjaGFyQnVmZmVyLmxlbmd0aCAtIChidWZMaW1pdCAtIGluZGV4KSA8IGxlbikgewotCQkJCWV4cGFuZEJ1ZmZlcihsZW4pOwotCQkJfQotCQl9IGVsc2UgaWYgKGluZGV4IC0gYnVmTGltaXQgPCBsZW4pIHsKLQkJCWV4cGFuZEJ1ZmZlcihsZW4pOwotCQl9Ci0JCWlmIChpbmRleCA8IGxlbikgewotCQkJaW50IGkgPSBiZWdpbiArIGxlbiAtIDE7Ci0JCQlpbnQgajsKLQkJCWZvciAoaiA9IGluZGV4IC0gMTsgaiA+PSAwOyBqLS0pIHsKLQkJCQlpZiAoKGNoYXJCdWZmZXJbal0gPSBzdHJbaS0tXSkgPT0gJ1xuJykKLQkJCQkJbGluZU51bWJlci0tOwotCQkJfQotCQkJaiA9IGNoYXJCdWZmZXIubGVuZ3RoIC0gMTsKLQkJCWZvciAoOyBpID49IGJlZ2luOyBqLS0pIHsKLQkJCQlpZiAoKGNoYXJCdWZmZXJbal0gPSBzdHJbaS0tXSkgPT0gJ1xuJykKLQkJCQkJbGluZU51bWJlci0tOwotCQkJfQotCQkJaW5kZXggPSBqICsgMTsKLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSBiZWdpbiArIGxlbiAtIDE7IGkgPj0gYmVnaW47IGktLSkgewotCQkJCWlmICgoY2hhckJ1ZmZlclstLWluZGV4XSA9IHN0cltpXSkgPT0gJ1xuJykKLQkJCQkJbGluZU51bWJlci0tOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVucmVhZChjaGFyIHN0cltdKSB7Ci0JCXVucmVhZChzdHIsIDAsIHN0ci5sZW5ndGgpOwotCX0KLQotCWZpbmFsIGludCBuZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlpZiAocHVzaEJhY2tlZCkgewotCQkJcHVzaEJhY2tlZCA9IGZhbHNlOwotCQkJcmV0dXJuIHR0eXBlOwotCQl9Ci0KLQkJc3dpdGNoIChzdGF0ZSkgewotCQljYXNlIERFRkFVTFQ6Ci0JCQlyZXR1cm4gZGVmYXVsdFN0YXRlKCk7Ci0JCWNhc2UgVEFHOgotCQkJcmV0dXJuIHRhZygpOwotCQljYXNlIEVUQUc6Ci0JCQlyZXR1cm4gZXRhZygpOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JZmluYWwgdm9pZCBwdXNoQmFjaygpIHsKLQkJcHVzaEJhY2tlZCA9IHRydWU7Ci0JfQotCi0JZmluYWwgaW50IGdldEN1cnJlbnRMaW5lKCkgewotCQlyZXR1cm4gbGluZU51bWJlciArIDE7Ci0JfQotCi0JZmluYWwgaW50IGdldEN1cnJlbnRDb2woKSB7Ci0JCXJldHVybiBnZXRDb2x1bW5OdW1iZXIoKTsKLQl9Ci0KLQlmaW5hbCB2b2lkIHN3aXRjaFRvKGludCBzdGF0ZSkgewotCQl0aGlzLnN0YXRlID0gc3RhdGU7Ci0JfQotCi0JZmluYWwgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMucmVhZGVyLmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQlyZXR1cm4gbGluZU51bWJlciArIDE7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7Ci0JCWludCByZXQ7Ci0JCWlmIChpbmRleCA+PSBsYXN0TEZpbmRleCkgewotCQkJcmV0ID0gaW5kZXggLSBsYXN0TEZpbmRleDsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IGNoYXJCdWZmZXIubGVuZ3RoIC0gbGFzdExGaW5kZXggKyBpbmRleDsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxBdHRyaWJ1dGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzNWVlYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVHlwZUluZm87Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi1jbGFzcyBTR01MQXR0cmlidXRlIGltcGxlbWVudHMgQXR0ciwgU2VyaWFsaXphYmxlIHsKLQkvLyBOb2RlIGludGVyZmFjZTsKLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhpcy52YWx1ZSA9IG5vZGVWYWx1ZTsKLQkJdGhpcy5pc1NwZWNpZmllZCA9IHRydWU7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQVRUUklCVVRFX05PREU7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCXJldHVybiBuZXcgTm9kZUxpc3QoKSB7Ci0JCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0TmV4dFNpYmxpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBvd25lckRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBOb2RlIGluc2VydEJlZm9yZShOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZkNoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fREFUQV9BTExPV0VEX0VSUiwKLQkJCQkiYXR0cmlidXRlcyBjYW4ndCBoYXZlIHNpYmxpbmdzLiIpIHsKLQkJfTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSByZXBsYWNlQ2hpbGQoTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX0RBVEFfQUxMT1dFRF9FUlIsCi0JCQkJImF0dHJpYnV0ZXMgY2FuJ3QgaGF2ZSBzaWJsaW5ncy4iKSB7Ci0JCX07Ci0JfQotCi0JcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX0RBVEFfQUxMT1dFRF9FUlIsCi0JCQkJImF0dHJpYnV0ZXMgY2FuJ3QgaGF2ZSBzaWJsaW5ncy4iKSB7Ci0JCX07Ci0JfQotCi0JcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX0RBVEFfQUxMT1dFRF9FUlIsCi0JCQkJImF0dHJpYnV0ZXMgY2FuJ3QgaGF2ZSBzaWJsaW5ncy4iKSB7Ci0JCX07Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJcmV0dXJuIG5ldyBTR01MQXR0cmlidXRlKHRoaXMpOwotCX0KLQotCS8vIEF0dHIgaW50ZXJmYWNlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBOb3Qgc3VwcG9ydGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFNwZWNpZmllZCgpIHsKLQkJcmV0dXJuIGlzU3BlY2lmaWVkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmlzU3BlY2lmaWVkID0gdHJ1ZTsKLQl9Ci0KLQlTdHJpbmcgbmFtZSwgdmFsdWU7Ci0KLQlib29sZWFuIGlzU3BlY2lmaWVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIERvY3VtZW50IG93bmVyRG9jdW1lbnQ7Ci0KLQlTR01MQXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIERvY3VtZW50IGRvYykgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMub3duZXJEb2N1bWVudCA9IGRvYzsKLQl9Ci0KLQkvLyBjb3B5IGNvbnN0cnVjdG9yCi0JU0dNTEF0dHJpYnV0ZShTR01MQXR0cmlidXRlIGFub3RoZXIpIHsKLQkJdGhpcy5uYW1lID0gYW5vdGhlci5uYW1lOwotCQl0aGlzLnZhbHVlID0gYW5vdGhlci52YWx1ZTsKLQkJdGhpcy5pc1NwZWNpZmllZCA9IGFub3RoZXIuaXNTcGVjaWZpZWQ7Ci0JCXRoaXMub3duZXJEb2N1bWVudCA9IGFub3RoZXIub3duZXJEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTR01MRG9jdW1lbnQgZG9jID0gKFNHTUxEb2N1bWVudCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNoYXIgcXVvdGUgPSAnIic7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IHZhbHVlLmNoYXJBdChpKTsKLQkJCVN0cmluZyBlbnRpdHlPcmlnaW4gPSBkb2MuZ2V0RW50aXR5T3JpZ2luKG5ldyBDaGFyYWN0ZXIoY2gpKTsKLQkJCWlmIChlbnRpdHlPcmlnaW4gIT0gbnVsbCkgewotCQkJCXNiLmFwcGVuZCgnJicgKyBlbnRpdHlPcmlnaW4gKyAnOycpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoY2ggPT0gJyInKQotCQkJCQlxdW90ZSA9ICdcJyc7Ci0JCQkJc2IuYXBwZW5kKGNoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJyAnICsgbmFtZSArICc9JyArIHF1b3RlICsgc2IgKyBxdW90ZTsKLQl9Ci0KLQlTdHJpbmcgdG9YTUxTdHJpbmcoKSB7Ci0JCVNHTUxEb2N1bWVudCBkb2MgPSAoU0dNTERvY3VtZW50KSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2hhciBxdW90ZSA9ICciJzsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaGFyIGNoID0gdmFsdWUuY2hhckF0KGkpOwotCQkJU3RyaW5nIGVudGl0eU9yaWdpbiA9IGRvYy5nZXRFbnRpdHlPcmlnaW4obmV3IENoYXJhY3RlcihjaCkpOwotCQkJaWYgKGVudGl0eU9yaWdpbiAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKCImIyIgKyAoaW50KSBjaCArICc7Jyk7Ci0JCQl9IGVsc2UgaWYgKGNoID09ICcmJykgewotCQkJCXNiLmFwcGVuZCgiJmFtcDsiKTsKLQkJCX0gZWxzZSBpZiAoY2ggPT0gJzwnKSB7Ci0JCQkJc2IuYXBwZW5kKCImbHQ7Iik7Ci0JCQl9IGVsc2UgaWYgKGNoID09ICc+JykgewotCQkJCXNiLmFwcGVuZCgiJmd0OyIpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoY2ggPT0gJyInKQotCQkJCQlxdW90ZSA9ICdcJyc7Ci0JCQkJc2IuYXBwZW5kKGNoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJyAnICsgbmFtZSArICc9JyArIHF1b3RlICsgc2IgKyBxdW90ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGFsd2F5cyBudWxsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgewotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYWx3YXlzIHNhbWUgYXMgPGNvZGU+Z2V0TmFtZSgpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGFsd2F5cyBudWxsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3JtYWxpemUoKSB7Ci0JfQotCi0JcHJpdmF0ZSBFbGVtZW50IG93bmVyRWxlbWVudCA9IG51bGw7Ci0KLQlwdWJsaWMgRWxlbWVudCBnZXRPd25lckVsZW1lbnQoKSB7Ci0JCXJldHVybiBvd25lckVsZW1lbnQ7Ci0JfQotCi0Jdm9pZCBzZXRPd25lckVsZW1lbnQoRWxlbWVudCBvd25lcikgewotCQl0aGlzLm93bmVyRWxlbWVudCA9IG93bmVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYWx3YXlzIGZhbHNlIGJlY2F1c2UgdGhpcyBpcyBub3QgWE1MIGltcGxlbWVudGF0aW9uIGJ1dCBTR01MLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWQoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogRE9NIExldmVsIDMKLQkgKi8KLQotCXB1YmxpYyBUeXBlSW5mbyBnZXRTY2hlbWFUeXBlSW5mbygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0lkKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc2hvcnQgY29tcGFyZURvY3VtZW50UG9zaXRpb24oTm9kZSBvdGhlcikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRDb250ZW50KCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YShTdHJpbmcga2V5KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFcXVhbE5vZGUoTm9kZSBhcmcpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTYW1lTm9kZShOb2RlIG90aGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgbG9va3VwTmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGxvb2t1cFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dENvbnRlbnQoU3RyaW5nIHRleHRDb250ZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIE9iamVjdCBzZXRVc2VyRGF0YShTdHJpbmcga2V5LCBPYmplY3QgZGF0YSwgVXNlckRhdGFIYW5kbGVyIGhhbmRsZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MQ0RBVEFTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MQ0RBVEFTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YjUzMTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTENEQVRBU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5JUHJpbnRYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgU0dNTENEQVRBU2VjdGlvbiBleHRlbmRzIFNHTUxUZXh0IGltcGxlbWVudHMgQ0RBVEFTZWN0aW9uLAotCQlJUHJpbnRYTUwgewotCXB1YmxpYyBTR01MQ0RBVEFTZWN0aW9uKFN0cmluZyBzdHIsIERvY3VtZW50IGRvYykgewotCQlzdXBlcihzdHIsIGRvYyk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ0RBVEFfU0VDVElPTl9OT0RFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2NkYXRhLXNlY3Rpb24iOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50QXNYTUwoUHJpbnRXcml0ZXIgcHcsIGludCBpbmRlbnRMZXZlbCwgYm9vbGVhbiBpbmRlbnQpIHsKLQkJaWYgKGluZGVudCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50TGV2ZWw7IGkrKykKLQkJCQlwdy5wcmludCgnICcpOwotCQlwdy5wcmludCgiPCFbQ0RBVEFbIiArIHRleHQgKyAiXV0+Iik7Ci0JCWlmIChpbmRlbnQpCi0JCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRBc1NHTUwoUHJpbnRXcml0ZXIgcHcsIGludCBpbmRlbnRMZXZlbCwgYm9vbGVhbiBpbmRlbnQpIHsKLQkJcHcucHJpbnQodGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTENoYXJhY3RlckRhdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxDaGFyYWN0ZXJEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzdmZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTENoYXJhY3RlckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5pbXBsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQ2hhcmFjdGVyRGF0YTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLWFic3RyYWN0IGNsYXNzIFNHTUxDaGFyYWN0ZXJEYXRhIGV4dGVuZHMgU0dNTE5vZGUgaW1wbGVtZW50cyBDaGFyYWN0ZXJEYXRhIHsKLQlwcm90ZWN0ZWQgU0dNTENoYXJhY3RlckRhdGEoU3RyaW5nIHN0ciwgRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKGRvYyk7Ci0JCXRleHQgPSBzdHI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0ZXh0OwotCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB7Ci0JCXRleHQgPSBub2RlVmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGRhdGEpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0ZXh0ID0gZGF0YTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRleHQubGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBzdWJzdHJpbmdEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcob2Zmc2V0LCBjb3VudCk7Ci0JCX0gY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIGUuZ2V0TWVzc2FnZSgpKSB7Ci0JCQl9OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwZW5kRGF0YShTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGV4dCA9IHRleHQgKyBhcmc7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0RGF0YShpbnQgb2Zmc2V0LCBTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBvZmZzZXQpICsgYXJnICsgdGV4dC5zdWJzdHJpbmcob2Zmc2V0KTsKLQkJfSBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgZS5nZXRNZXNzYWdlKCkpIHsKLQkJCX07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgb2Zmc2V0KSArIHRleHQuc3Vic3RyaW5nKG9mZnNldCArIGNvdW50KTsKLQkJfSBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgZS5nZXRNZXNzYWdlKCkpIHsKLQkJCX07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBsYWNlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQsIFN0cmluZyBhcmcpCi0JCQl0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmICh0ZXh0Lmxlbmd0aCgpIDwgb2Zmc2V0ICsgY291bnQpIHsKLQkJCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgb2Zmc2V0KSArIGFyZy5zdWJzdHJpbmcoMCwgY291bnQpOwotCQkJfSBlbHNlIHsKLQkJCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgb2Zmc2V0KSArIGFyZy5zdWJzdHJpbmcoMCwgY291bnQpCi0JCQkJCQkrIHRleHQuc3Vic3RyaW5nKG9mZnNldCArIGNvdW50KTsKLQkJCX0KLQkJfSBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgZS5nZXRNZXNzYWdlKCkpIHsKLQkJCX07Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MQ29tbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTENvbW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ2M2Q3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MQ29tbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5JUHJpbnRYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFNHTUxDb21tZW50IGV4dGVuZHMgU0dNTENoYXJhY3RlckRhdGEgaW1wbGVtZW50cyBDb21tZW50LAotCQlJUHJpbnRYTUwgewotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENPTU1FTlRfTk9ERTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiNjb21tZW50IjsKLQl9Ci0KLQlwdWJsaWMgU0dNTENvbW1lbnQoU3RyaW5nIGRhdGEsIERvY3VtZW50IGRvYykgewotCQlzdXBlcihkYXRhLCBkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiPCEtLSIgKyB0ZXh0ICsgIi0tPiI7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRBc1hNTChQcmludFdyaXRlciBwdywgaW50IGluZGVudExldmVsLCBib29sZWFuIGluZGVudCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbiAtIDI7IGkrKykgewotCQkJaWYgKHRleHQuY2hhckF0KGkpID09ICctJyAmJiB0ZXh0LmNoYXJBdChpICsgMSkgPT0gJy0nKSB7Ci0JCQkJaSsrOwotCQkJfSBlbHNlIHsKLQkJCQlzYi5hcHBlbmQodGV4dC5jaGFyQXQoaSkpOwotCQkJfQotCQl9Ci0JCWlmIChsZW4gLSAyID49IDApIHsKLQkJCWlmICh0ZXh0LmNoYXJBdChsZW4gLSAxKSAhPSAnLScpIHsKLQkJCQlzYi5hcHBlbmQodGV4dC5jaGFyQXQobGVuIC0gMikpOwotCQkJCXNiLmFwcGVuZCh0ZXh0LmNoYXJBdChsZW4gLSAxKSk7Ci0JCQl9IGVsc2UgaWYgKHRleHQuY2hhckF0KGxlbiAtIDIpICE9ICctJykgewotCQkJCXNiLmFwcGVuZCh0ZXh0LmNoYXJBdChsZW4gLSAyKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobGVuIC0gMSA+PSAwICYmIHRleHQuY2hhckF0KGxlbiAtIDEpICE9ICctJykgewotCQkJc2IuYXBwZW5kKHRleHQuY2hhckF0KGxlbiAtIDEpKTsKLQkJfQotCQlwdy5wcmludCgiPCEtLSIgKyBzYiArICItLT4iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludEFzU0dNTChQcmludFdyaXRlciBwdywgaW50IGluZGVudExldmVsLCBib29sZWFuIGluZGVudCkgewotCQlwdy5wcmludCgiPCEtLSIgKyB0ZXh0ICsgIi0tPiIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxET01JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MRE9NSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGE0YWIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxET01JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci0KLS8qKgotICogTGlnaHQtd2VpZ2h0IGltcGxlbWVudGF0aW9uIG9mIERPTTwvYT4uCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHRocmVhZC11bnNhZmUuIElmIHlvdSByZXF1aXJlIHRocmVhZC1zYWZlCi0gKiBpbXBsZW1lbnRhdGlvbiwgdXNlIFhlcmNlcyBET00uCi0gKiBUaGlzIHN1cHBvcnRzOgotICogPHVsPgotICogPGxpPkxldmVsIDEgQ29yZQotICogPGxpPkxldmVsIDEgSFRNTAotICogPGxpPkxldmVsIDIgQ29yZSAoTm8gbmFtZXNwYWNlcykKLSAqIDxsaT5MZXZlbCAyIEhUTUwKLSAqIDwvdWw+Ci0gKiAKLSAqIEBzZWUgU0dNTFBhcnNlciNzZXRET01JbXBsZW1lbnRhdGlvbihvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbikKLSAqLwotcHVibGljIGNsYXNzIFNHTUxET01JbXBsIGltcGxlbWVudHMgRE9NSW1wbGVtZW50YXRpb24gewotCS8qKgotCSAqIEByZXR1cm4gYWx3YXlzIGZhbHNlIGJlY2F1c2UgdGhpcyBpcyBub3QgWE1MIGltcGxlbWVudGF0aW9uIGJ1dCBTR01MLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnRUeXBlIGNyZWF0ZURvY3VtZW50VHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSwKLQkJCVN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCXJldHVybiBuZXcgU0dNTERvY1R5cGUocXVhbGlmaWVkTmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0JICogICAgICAgICAgICBhbHdheXMgaWdub3JlZC4KLQkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZQotCSAqICAgICAgICAgICAgYWx3YXlzIGlnbm9yZWQuCi0JICovCi0JcHVibGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lLAotCQkJRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoZG9jdHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFNHTUxEb2N1bWVudCh0aGlzKTsKLQkJfSBlbHNlIGlmIChkb2N0eXBlLmdldE93bmVyRG9jdW1lbnQoKSAhPSBudWxsCi0JCQkJfHwgIShkb2N0eXBlIGluc3RhbmNlb2YgU0dNTERvY1R5cGUpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKAotCQkJCQlET01FeGNlcHRpb24uV1JPTkdfRE9DVU1FTlRfRVJSLAotCQkJCQlkb2N0eXBlCi0JCQkJCQkJKyAiIGhhcyBiZWVuIGFscmVhZHkgb3duZWQgb3IgY3JlYXRlZCBieSBhIGRpZmZlcmVudCBET01JbXBsZW1lbnRhdGlvbiIpIHsKLQkJCX07Ci0JCX0gZWxzZSB7Ci0JCQlEb2N1bWVudCByZXQgPSBuZXcgU0dNTERvY3VtZW50KHRoaXMpOwotCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkgewotCQkJCXJldC5hcHBlbmRDaGlsZChkb2N0eXBlKTsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU0dNTERPTUltcGwoKSB7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU0dNTERPTUltcGwgaW5zdGFuY2UgPSBuZXcgU0dNTERPTUltcGwoKTsKLQotCXB1YmxpYyBzdGF0aWMgRE9NSW1wbGVtZW50YXRpb24gZ2V0RE9NSW1wbGVtZW50YXRpb24oKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKgotCSAqIERPTSBMZXZlbCAzCi0JICovCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbiNnZXRGZWF0dXJlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxEb2NUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MRG9jVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODAwYmJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxEb2NUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU0dNTERvY1R5cGUgZXh0ZW5kcyBTR01MTm9kZSBpbXBsZW1lbnRzIERvY3VtZW50VHlwZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQxMzM5MDEyOTA4MzY5ODkxNDJMOwotCi0JLyoqCi0JICogQHNlcmlhbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBJRC4gRm9yIEhUTUw0LjAgc3RyaWN0LCBpdCBpcyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIi4KLQkgKiAKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgc3lzdGVtSUQ7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gc3lzdGVtSUQ7Ci0JfQotCi0JLy8gU0dNTERvY1R5cGUoU3RyaW5nIG5hbWUsIFN0cmluZyBpZCwgRG9jdW1lbnQgZG9jKSB7Ci0JLy8gc3VwZXIoZG9jKTsKLQkvLyB0aGlzLm5hbWUgPSBuYW1lOwotCS8vIHRoaXMuaWQgPSBpZDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxTdWJzZXQ7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEludGVybmFsU3Vic2V0KCkgewotCQlyZXR1cm4gaW50ZXJuYWxTdWJzZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW50ZXJuYWxTdWJzZXQoU3RyaW5nIHN0cikgewotCQlpbnRlcm5hbFN1YnNldCA9IHN0cjsKLQl9Ci0KLQlwdWJsaWMgU0dNTERvY1R5cGUoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmlkID0gcHVibGljSUQ7Ci0JCXRoaXMuc3lzdGVtSUQgPSBzeXN0ZW1JRDsKLQl9Ci0KLQkvLyBTR01MTm9kZSBhYnN0cmFjdCBtZXRob2QgaW1wbGVtZW50YXRpb24uCi0Jdm9pZCBjaGVjayhOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCB0aGlzCi0JCQkJKyAiY2Fubm90IGhhdmUgY2hpbGRyZW4uIikgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTEyNTEwOTM4MjQ5MjM0NTM2NTlMOwotCQl9OwotCX0KLQotCS8qKgotCSAqIERvZXMgbm90IHN1cHBvcnQgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHJldHVybiBhbHdheXMgcmV0dXJuIG51bGwKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBEb2N1bWVudFR5cGUgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLy8gTm9kZSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24uCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIERPQ1VNRU5UX1RZUEVfTk9ERTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIG5vdCBzdXBwb3J0IHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEByZXR1cm4gYWx3YXlzIHJldHVybiBudWxsCi0JICovCi0JcHVibGljIE5hbWVkTm9kZU1hcCBnZXROb3RhdGlvbnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLAotCQkJCSJjYW5ub3Qgc2V0IHZhbHVlIG9uICIgKyB0aGlzKSB7Ci0JCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMDQwNzUyMTI3MTAyMTExMjQ3TDsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcmF3U3RyaW5nOwotCi0JcHVibGljIHZvaWQgc2V0UmF3U3RyaW5nKFN0cmluZyBzdHIpIHsKLQkJdGhpcy5yYXdTdHJpbmcgPSBzdHI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiByYXcgc3RyaW5nIGZyb20gb3JpZ2luYWwgZG9jdW1lbnQgaWYge0BsaW5rIAotCSAqICAgICAgICAgI3NldFJhd1N0cmluZyhqYXZhLmxhbmcuU3RyaW5nKX0gaGFzIGJlZW4gaW52b2tlZC4gT3RoZXJ3aXNlLAotCSAqICAgICAgICAgPGNvZGU+Jmx0OyFET0NUWVBFIG5hbWUgUFVCTElDICJpZCIgJmd0OzwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gcmF3U3RyaW5nICE9IG51bGwgPyByYXdTdHJpbmcgOiAiPCFET0NUWVBFICIgKyBuYW1lCi0JCQkJKyAiIFBVQkxJQyBcIiIgKyBpZCArICJcIj4iOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxEb2NUeXBlRGVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MRG9jVHlwZURlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjMwODA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxEb2NUeXBlRGVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLlBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBEb2N1bWVudCBUeXBlIERlZmluaXRpb24gYW5kIGhvbGRzIDxjb2RlPgotICogRWxlbWVudG50RGVmaW5pdGlvbiA8L2NvZGU+Ci0gKiBpbnN0YW5jZXMgY3JlYXRlZCBieSB0aGUgRFRELCBlbnRpdHkgZGVjbGFyYXRpb25zIGFuZCBzbyBvbi4KLSAqLwotcHVibGljIGNsYXNzIFNHTUxEb2NUeXBlRGVmIHsKLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGU8U3RyaW5nLCBTR01MRG9jVHlwZURlZj4gdGFibGUgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU0dNTERvY1R5cGVEZWY+KCk7Ci0KLQlwcml2YXRlIFNHTUxQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICoga2V5OiBlbGVtZW50IG5hbWUgdmFsdWU6IEVsZW1lbnREZWZpbml0aW9uIGluc3RhbmNlCi0JICovCi0JcHJvdGVjdGVkIFVuc3luY2hyb25pemVkSGFzaHRhYmxlIGVsZW1lbnREZWZzID0gbmV3IFVuc3luY2hyb25pemVkSGFzaHRhYmxlKCk7Ci0KLQlwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIFNHTUxFbnRpdHlSZWZlcmVuY2U+IGVudGl0eVJlZnMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU0dNTEVudGl0eVJlZmVyZW5jZT4oKTsKLQotCXByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgU0dNTEVudGl0eURlY2xhcmF0aW9uPiBlbnRpdHlEZWNscyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTR01MRW50aXR5RGVjbGFyYXRpb24+KCk7Ci0KLQlwcml2YXRlIFN0cmluZyBpZDsKLQotCXByb3RlY3RlZCBTR01MRG9jVHlwZURlZihTR01MUGFyc2VyIHBhcnNlciwgU3RyaW5nIGlkKSB7Ci0JCXRoaXMucGFyc2VyID0gcGFyc2VyOwotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0Jc3RhdGljIFNHTUxEb2NUeXBlRGVmIGNyZWF0ZUFub255bW91cyhTR01MUGFyc2VyIHBhcnNlcikgewotCQlyZXR1cm4gbmV3IFNHTUxEb2NUeXBlRGVmKHBhcnNlciwgImFub255bW91cyIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgRWxlbWVudERlZmluaXRpb24gaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgbmFtZS4gVGhlcmUgaXMgb25seSBvbmUKLQkgKiBFbGVtZW50RGVmaW5pdGlvbiBpbnN0YW5jZSB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lLiBTbyBpZiBhIGRlZmluaXRpb24KLQkgKiB0aGF0IGhhcyBzcGVjaWZpZWQgbmFtZSBhbHJlYWR5IGV4aXN0cywgcmV0dXJuIHRoYXQgdmFyaWFibGUuIElmIG5vdCBtYWtlCi0JICogbmV3IGluc3RhbmNlLiBVc2luZyBzaW5nbGV0b24gcGF0dGVybi4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgbmFtZSBvZiBlbGVtZW50IGRlZmluZWQgYnkgYSBvYmplY3QuCi0JICogQHJldHVybiBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEVsZW1lbnREZWZpbml0aW9uIGNyZWF0ZUVsZW1lbnREZWZpbml0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCW5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCUVsZW1lbnREZWZpbml0aW9uIHJldCA9IGVsZW1lbnREZWZzLmdldChuYW1lKTsKLQkJaWYgKHJldCA9PSBudWxsKSB7Ci0JCQlyZXQgPSBuZXcgRWxlbWVudERlZmluaXRpb24obmFtZSk7Ci0JCQllbGVtZW50RGVmcy5wdXQobmFtZSwgcmV0KTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgcHVibGljIDxjb2RlPlNHTUxEb2NUeXBlRGVmPC9jb2RlPiBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSUQKLQkgKiAgICAgICAgICAgIGlkIHJlbGF0ZWQgdG8gcHVibGljIGVudGl0eS4gRm9yIGV4YW1wbGUgPGNvZGU+Ci0JICogIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNHTUxEb2NUeXBlRGVmIGNyZWF0ZVB1YmxpYyhTdHJpbmcgcHVibGljSUQsIFNHTUxQYXJzZXIgcGFyc2VyKSB7Ci0JCXJldHVybiBuZXcgU0dNTERvY1R5cGVEZWYocGFyc2VyLCBwdWJsaWNJRCk7Ci0JfQotCi0Jc3RhdGljIHZvaWQgcHV0UHVibGljKFN0cmluZyBwdWJsaWNJRCwgU0dNTERvY1R5cGVEZWYgZHRkKSB7Ci0JCXRhYmxlLnB1dChwdWJsaWNJRCwgZHRkKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBFbGVtZW50RGVmaW5pdGlvbiBpbnN0YW5jZSByZWxhdGVkIHRvIHRoZSBhcmd1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgRWxlbWVudERlZmluaXRpb24ncyBuYW1lLgotCSAqIEByZXR1cm4gRWxlbWVudERlZmluaXRpb24gbmFtZWQgbmFtZS4gSWYgbm8gaW5zdGFuY2UsIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGVmaW5pdGlvbiBnZXRFbGVtZW50RGVmaW5pdGlvbihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZWxlbWVudERlZnMuZ2V0KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEVsZW1lbnREZWZpbml0aW9uIGluc3RhbmNlIHdob3NlIE1hZ2ljIE51bWJlciBpcyBzcGVjaWZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbnVtCi0JICogICAgICAgICAgICBFbGVtZW50RGVmaW5pdGlvbidzIE1hZ2ljIE51bWJlci4KLQkgKiBAcmV0dXJuIEVsZW1lbnREZWZpbml0aW9uIG5hbWVkIG5hbWUuIElmIG5vIGluc3RhbmNlLCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERlZmluaXRpb24gZ2V0RWxlbWVudERlZmluaXRpb24oaW50IG51bSkgewotCQl0cnkgewotCQkJcmV0dXJuIGVsZW1lbnREZWZzLmdldChudW0pOwotCQl9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlTR01MRW50aXR5RGVjbGFyYXRpb24gZ2V0RW50aXR5RGVjbGFyYXRpb24oU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJcmV0dXJuIChTR01MRW50aXR5RGVjbGFyYXRpb24pIGVudGl0eURlY2xzLmdldChlbnRpdHlOYW1lKTsKLQl9Ci0KLQlTR01MRW50aXR5UmVmZXJlbmNlIGdldEVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLQkJU0dNTEVudGl0eVJlZmVyZW5jZSByZXQgPSAoU0dNTEVudGl0eVJlZmVyZW5jZSkgZW50aXR5UmVmcy5nZXQobmFtZSk7Ci0JCWlmIChyZXQgPT0gbnVsbCkgewotCQkJU0dNTEVudGl0eURlY2xhcmF0aW9uIGVkID0gZ2V0RW50aXR5RGVjbGFyYXRpb24obmFtZSk7Ci0JCQlpZiAoZWQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBEVERQYXJzZUV4Y2VwdGlvbigiTm8gRW50aXR5IERlZmluaXRpb246ICIgKyBuYW1lKTsKLQkJCX0KLQkJCXJldCA9IG5ldyBTR01MRW50aXR5UmVmZXJlbmNlKG5hbWUsIGVkKTsKLQkJCWVudGl0eVJlZnMucHV0KG5hbWUsIHJldCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHB1YmxpYyA8Y29kZT5TR01MRG9jVHlwZURlZjwvY29kZT4gaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lECi0JICogICAgICAgICAgICBpZCByZWxhdGVkIHRvIHB1YmxpYyBlbnRpdHkuIEZvciBleGFtcGxlIDxjb2RlPgotCSAqICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTR01MRG9jVHlwZURlZiBnZXRQdWJsaWMoU3RyaW5nIHB1YmxpY0lEKSB7Ci0JCXJldHVybiAoU0dNTERvY1R5cGVEZWYpIHRhYmxlLmdldChwdWJsaWNJRCk7Ci0JfQotCi0Jdm9pZCBwdXRFbnRpdHlEZWNsYXJhdGlvbihTdHJpbmcgZW50aXR5TmFtZSwgU3RyaW5nIGVudGl0eVN0cmluZykgewotCQlpZiAoZW50aXR5RGVjbHMuZ2V0KGVudGl0eU5hbWUpICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCVNHTUxFbnRpdHlEZWNsYXJhdGlvbiBkZWMgPSBuZXcgU0dNTEVudGl0eURlY2xhcmF0aW9uKGVudGl0eU5hbWUsCi0JCQkJZW50aXR5U3RyaW5nLCB0aGlzKTsKLQkJZW50aXR5RGVjbHMucHV0KGVudGl0eU5hbWUsIGRlYyk7Ci0JfQotCi0Jdm9pZCBwdXRQdWJsaWNFbnRpdHkoU3RyaW5nIGVudGl0eU5hbWUsIFN0cmluZyBlbnRpdHlTdHJpbmcsIFN0cmluZyBmaWxlbmFtZSkgewotCQlpZiAoZW50aXR5RGVjbHMuZ2V0KGVudGl0eU5hbWUpICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNsYXNzIFBVQkxJQ0VudGl0eSBleHRlbmRzIFNHTUxFbnRpdHlEZWNsYXJhdGlvbiB7Ci0JCQlTdHJpbmcgZmlsZW5hbWU7Ci0KLQkJCVJlYWRlciBnZXRSZXBsYWNlbWVudFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkJcmV0dXJuIHBhcnNlci5nZXRSZXNvdXJjZShmaWxlbmFtZSk7Ci0JCQl9Ci0KLQkJCVBVQkxJQ0VudGl0eShTdHJpbmcgZW50aXR5TmFtZSwgU3RyaW5nIGVudGl0eVN0cmluZywKLQkJCQkJU3RyaW5nIGZpbGVuYW1lLCBTR01MRG9jVHlwZURlZiBkdGQpIHsKLQkJCQlzdXBlcihlbnRpdHlOYW1lLCBlbnRpdHlTdHJpbmcsIGR0ZCk7Ci0JCQkJdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOwotCQkJfQotCQl9Ci0JCTsKLQkJZW50aXR5RGVjbHMucHV0KGVudGl0eU5hbWUsIG5ldyBQVUJMSUNFbnRpdHkoZW50aXR5TmFtZSwgZW50aXR5U3RyaW5nLAotCQkJCWZpbGVuYW1lLCB0aGlzKSk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyBpdHMgcHVibGljIGlkLiBGb3IgZXhhbXBsZSAiLS8vVzNDLy9EVEQgSFRNTCA0LjAKLQkgKiBUcmFuc2l0aW9uYWwvL0VOIi4KLQkgKiAKLQkgKiBAcmV0dXJuIHB1YmxpYyBpZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGEgZWxlbWVudCBpcyBzaW5nbGV0b24gb3Igbm90LiBBIHNpbmdsZXRvbiBlbGVtZW50IGFwcGVhcnMgb25seQotCSAqIG9uY2UgaW4gYSBkb2N1bWVudC4gRm9yIGV4YW1wbGUsIEhUTUwsIEhFQUQgYW5kIEJPRFkgYXJlIHNpbmdsZXRvbiBpbgotCSAqIEhUTUwsIGJ1dCBub3QgVEFCTEUsIExJLgotCSAqIAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBlbGVtZW50IG5hbWUgdG8gYmUgY2hlY2tlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaW5nbGV0b24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJRWxlbWVudERlZmluaXRpb24gZWQgPSBnZXRFbGVtZW50RGVmaW5pdGlvbih0YWdOYW1lKTsKLQkJcmV0dXJuIGVkICE9IG51bGwgJiYgZWQuaXNTaW5nbGV0b24oKTsKLQl9Ci0KLQlwcml2YXRlIGludCBlbGVtZW50TnVtOwotCi0JLyoqCi0JICogQHJldHVybiBudW1iZXIgb2YgZWxlbWVudHMgdGhpcyBEVEQgZGVmaW5lcwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RWxlbWVudENvdW50KCkgewotCQlyZXR1cm4gZWxlbWVudE51bTsKLQl9Ci0KLQl2b2lkIHJlaGFzaCgpIHsKLQkJZWxlbWVudE51bSA9IGVsZW1lbnREZWZzLnNpemUoKTsKLQkJaW50IHNpemUgPSBlbGVtZW50TnVtICsgMjsgLy8gVGhlIHNlY29uZCBsYXN0IGVsZW1lbnQgaXMgZm9yICNQQ0RBVEEuCi0JCS8vIFRoZSBsYXN0IGVsZW1lbnQgaXMgZm9yIEFOT05ZTU9VUy4KLQkJZm9yIChpbnQgaSA9IGVsZW1lbnROdW0gLSAxOyBpID49IDA7IGktLSkgewotCQkJZWxlbWVudERlZnMuZ2V0KGkpLnJlaGFzaChzaXplKTsKLQkJfQotCX0KLQotCWludCBtYXhTZXFMZW5ndGggPSAwOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxEb2N1bWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOTVmMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLklTR01MRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiBSb290IG5vZGUgaXMgYSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU0dNTERvY3VtZW50IGV4dGVuZHMgU0dNTFBhcmVudE5vZGUgaW1wbGVtZW50cyBJU0dNTERvY3VtZW50IHsKLQkvKioKLQkgKiBAc2VyaWFsCi0JICovCi0JcHVibGljIEVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBudWxsOwotCi0JcHJpdmF0ZSB0cmFuc2llbnQgRE9NSW1wbGVtZW50YXRpb24gZG9tSW1wbDsKLQotCS8qKgotCSAqIEBzZWUgU0dNTERPTUltcGwjY3JlYXRlRG9jdW1lbnQoamF2YS5sYW5nLlN0cmluZyxqYXZhLmxhbmcuU3RyaW5nLG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZSkKLQkgKi8KLQlwdWJsaWMgU0dNTERvY3VtZW50KCkgewotCQl0aGlzKFNHTUxET01JbXBsLmdldERPTUltcGxlbWVudGF0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBTR01MRG9jdW1lbnQoRE9NSW1wbGVtZW50YXRpb24gaW1wbGUpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuZG9tSW1wbCA9IGltcGxlOwotCX0KLQotCXZvaWQgY2hlY2soTm9kZSBub2RlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpICE9IHRoaXMgJiYgIShub2RlIGluc3RhbmNlb2YgU0dNTERvY1R5cGUpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5XUk9OR19ET0NVTUVOVF9FUlIsIG5vZGUKLQkJCQkJKyAiIGNyZWF0ZWQgZnJvbSAiICsgbm9kZS5nZXRPd25lckRvY3VtZW50KCkgKyAiIHRoaXMuIikgewotCQkJfTsKLQkJfQotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQljYXNlIEVMRU1FTlRfTk9ERToKLQkJCWlmIChkb2N1bWVudEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCWRvY3VtZW50RWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5ISUVSQVJDSFlfUkVRVUVTVF9FUlIsCi0JCQkJCQkiIGRvY3VtZW50IGNhbm5vdCBoYXZlIHJvb3RzLiIpIHsKLQkJCQl9OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgotCQljYXNlIENPTU1FTlRfTk9ERToKLQkJCWJyZWFrOwotCQljYXNlIERPQ1VNRU5UX1RZUEVfTk9ERToKLQkJCWRvY3R5cGUgPSAoRG9jdW1lbnRUeXBlKSBub2RlOwotCQkJKChTR01MTm9kZSkgbm9kZSkub3duZXJEb2N1bWVudCA9IHRoaXM7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgbm9kZQotCQkJCQkrICIgaXMgbm90IGFsbG93ZWQgYXMgYSBjaGlsZCBvZiAiICsgdGhpcykgewotCQkJfTsKLQkJfQotCX0KLQotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJU0dNTERvY3VtZW50IHJldCA9IChTR01MRG9jdW1lbnQpIHN1cGVyLmNsb25lTm9kZSh0cnVlKTsKLQkJc2V0T3duZXJEb2N1bWVudChyZXQsIHJldCk7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IHJldC5maXJzdENoaWxkOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlyZXQuZG9jdW1lbnRFbGVtZW50ID0gKEVsZW1lbnQpIGNoaWxkOwotCQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIERvY3VtZW50VHlwZSkgewotCQkJCXJldC5kb2N0eXBlID0gKERvY3VtZW50VHlwZSkgY2hpbGQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0T3duZXJEb2N1bWVudChTR01MTm9kZSByZXQsIERvY3VtZW50IGRvYykgewotCQlyZXQub3duZXJEb2N1bWVudCA9IGRvYzsKLQkJZm9yIChTR01MTm9kZSBjaGlsZCA9IChTR01MTm9kZSkgcmV0LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSAoU0dNTE5vZGUpIGNoaWxkCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCXNldE93bmVyRG9jdW1lbnQoY2hpbGQsIGRvYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQXR0ciBjcmVhdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5ldyBTR01MQXR0cmlidXRlKG5hbWUsIG5hbWUsIHRoaXMpOwotCX0KLQotCXB1YmxpYyBDREFUQVNlY3Rpb24gY3JlYXRlQ0RBVEFTZWN0aW9uKFN0cmluZyBjKSB7Ci0JCXJldHVybiBuZXcgU0dNTENEQVRBU2VjdGlvbihjLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWVudCBjcmVhdGVDb21tZW50KFN0cmluZyBkYXRhKSB7Ci0JCXJldHVybiBuZXcgU0dNTENvbW1lbnQoZGF0YSwgdGhpcyk7Ci0JfQotCi0JcHVibGljIERvY3VtZW50RnJhZ21lbnQgY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpIHsKLQkJcmV0dXJuIG5ldyBTR01MRG9jdW1lbnRGcmFnbWVudCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiBuZXcgU0dNTEVsZW1lbnQodGFnTmFtZSwgdGhpcyk7Ci0JfQotCi0JcHVibGljIEVudGl0eVJlZmVyZW5jZSBjcmVhdGVFbnRpdHlSZWZlcmVuY2UoU3RyaW5nIGEpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwKLQkJCQkiY2Fubm90IGNyZWF0ZSBFbnRpdHkgUmVmLiIpIHsKLQkJfTsKLQl9Ci0KLQlwdWJsaWMgUHJvY2Vzc2luZ0luc3RydWN0aW9uIGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LAotCQkJU3RyaW5nIGRhdGEpIHsKLQkJcmV0dXJuIG5ldyBTR01MUEkodGFyZ2V0LCBkYXRhLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dCBjcmVhdGVUZXh0Tm9kZShTdHJpbmcgZGF0YSkgewotCQlyZXR1cm4gbmV3IFNHTUxUZXh0KGRhdGEsIHRoaXMpOwotCX0KLQotCXB1YmxpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdHlwZSgpIHsKLQkJcmV0dXJuIGRvY3R5cGU7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0RG9jdW1lbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZG9jdW1lbnRFbGVtZW50OwotCX0KLQotCS8vIGltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50IGludGVyZmFjZTsKLQlwdWJsaWMgTm9kZSBnZXREb2N1bWVudFR5cGUoKSB7Ci0JCXJldHVybiBkb2N0eXBlOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgdGFnbmFtZSkgewotCQlmaW5hbCBib29sZWFuIGFsbCA9IHRhZ25hbWUuZXF1YWxzKCIqIik7Ci0JCWZpbmFsIFN0cmluZyB0YXJnZXROYW1lID0gdGFnbmFtZTsKLQkJcmV0dXJuIG5ldyBOb2RlTGlzdCgpIHsKLQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJCWludCByZXQgPSAwOwotCQkJCU5vZGUgdG1wMSwgdG1wMjsKLQkJCQl0bXAxID0gZG9jdW1lbnRFbGVtZW50OwotCQkJCW91dGVyOiB3aGlsZSAodG1wMSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0bXAxIGluc3RhbmNlb2YgRWxlbWVudAotCQkJCQkJCSYmIChhbGwgfHwgdGFyZ2V0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKHRtcDEKLQkJCQkJCQkJCS5nZXROb2RlTmFtZSgpKSkpIHsKLQkJCQkJCXJldCsrOwotCQkJCQl9Ci0JCQkJCWlmICgodG1wMiA9IHRtcDEuZ2V0Rmlyc3RDaGlsZCgpKSA9PSBudWxsKSB7Ci0JCQkJCQlpZiAodG1wMSA9PSBkb2N1bWVudEVsZW1lbnQpIHsKLQkJCQkJCQlicmVhayBvdXRlcjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdG1wMiA9IHRtcDEuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl3aGlsZSAodG1wMiA9PSBudWxsICYmIHRtcDEgIT0gbnVsbCkgewotCQkJCQkJdG1wMSA9IHRtcDIgPSB0bXAxLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmICh0bXAxICE9IGRvY3VtZW50RWxlbWVudCkgewotCQkJCQkJCXRtcDIgPSB0bXAxLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWJyZWFrIG91dGVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXRtcDEgPSB0bXAyOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCi0JCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJCU5vZGUgdG1wMSwgdG1wMjsKLQkJCQl0bXAxID0gZG9jdW1lbnRFbGVtZW50OwotCQkJCW91dGVyOiB3aGlsZSAodG1wMSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0bXAxIGluc3RhbmNlb2YgRWxlbWVudAotCQkJCQkJCSYmIChhbGwgfHwgdGFyZ2V0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKHRtcDEKLQkJCQkJCQkJCS5nZXROb2RlTmFtZSgpKSkpIHsKLQkJCQkJCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkJCQkJcmV0dXJuIHRtcDE7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWluZGV4LS07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCh0bXAyID0gdG1wMS5nZXRGaXJzdENoaWxkKCkpID09IG51bGwpIHsKLQkJCQkJCWlmICh0bXAxID09IGRvY3VtZW50RWxlbWVudCkgewotCQkJCQkJCWJyZWFrIG91dGVyOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl0bXAyID0gdG1wMS5nZXROZXh0U2libGluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXdoaWxlICh0bXAyID09IG51bGwgJiYgdG1wMSAhPSBudWxsKSB7Ci0JCQkJCQl0bXAxID0gdG1wMiA9IHRtcDEuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKHRtcDEgIT0gZG9jdW1lbnRFbGVtZW50KSB7Ci0JCQkJCQkJdG1wMiA9IHRtcDEuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYnJlYWsgb3V0ZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdG1wMSA9IHRtcDI7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBET01JbXBsZW1lbnRhdGlvbiBnZXRJbXBsZW1lbnRhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZG9tSW1wbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXROZXh0U2libGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjZG9jdW1lbnQiOwotCX0KLQotCS8vIGltcGxlbWVudGF0aW9uIG9mIE5vZGUgaW50ZXJmYWNlCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRE9DVU1FTlRfTk9ERTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEEgRG9jdW1lbnQgb2JqZWN0IGlzIHRoZSByb290IG5vZGUuIFNvIHRoaXMgaGF2ZSBubyBzaWJsaW5ncy4KLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRQcmV2aW91c1NpYmxpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdhcyBjcmVhdGVkIGluIFZpc3VhbEFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRDaGlsZCA9PSBkb2N1bWVudEVsZW1lbnQpIHsKLQkJCWRvY3VtZW50RWxlbWVudCA9IG51bGw7Ci0JCX0gZWxzZSBpZiAob2xkQ2hpbGQgPT0gZG9jdHlwZSkgewotCQkJZG9jdHlwZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnJlbW92ZUNoaWxkKG9sZENoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwKLQkJCQkiI2RvY3VtZW50IGlzIGFsd2F5cyBudWxsIikgewotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50QXNYTUwoU3RyaW5nIHB1YmxpY0lELCBVUkwgbG9jYXRpb24sIFByaW50V3JpdGVyIHB3LAotCQkJYm9vbGVhbiBpbmRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXByaW50QXNYTUwocHVibGljSUQsIGxvY2F0aW9uLCBwdywgaW5kZW50LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludCBEb2N1bWVudCBhcyBYTUwKLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljCi0JICogICAgICAgICAgICBJRAotCSAqIEBwYXJhbSBEVEQncwotCSAqICAgICAgICAgICAgbG9jYXRpb24KLQkgKiBAcGFyYW0gcHcKLQkgKiAgICAgICAgICAgIHN0cmVhbSB0byB3cml0ZSB0aGlzIGRvY3VtZW50LgotCSAqIEBwYXJhbSBpbmRlbnQKLQkgKiAgICAgICAgICAgIGluZGVudCBpZiB0cnVlLiBPdGhlcndpc2UsIG5vdCBpbmRlbnQuCi0JICogQHBhcmFtIGVuYwotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50QXNYTUwoU3RyaW5nIHB1YmxpY0lELCBVUkwgbG9jYXRpb24sIFByaW50V3JpdGVyIHB3LAotCQkJYm9vbGVhbiBpbmRlbnQsIFN0cmluZyBlbmMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChlbmMgPT0gbnVsbCkgewotCQkJcHcucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iKTsKLQkJfSBlbHNlIHsKLQkJCXB3LnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIgKyBlbmMgKyAiXCI/PiIpOwotCQl9Ci0JCWlmIChwdWJsaWNJRCAhPSBudWxsKSB7Ci0JCQlwdy5wcmludCgiPCFET0NUWVBFICIgKyBkb2N1bWVudEVsZW1lbnQuZ2V0VGFnTmFtZSgpICsgIiBQVUJMSUMgXCIiCi0JCQkJCSsgcHVibGljSUQgKyAnIicpOwotCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQlwdy5wcmludGxuKCIgXCIiICsgbG9jYXRpb24gKyAiXCI+Iik7Ci0JCQl9IGVsc2UgewotCQkJCXB3LnByaW50bG4oJz4nKTsKLQkJCX0KLQkJfQotCQkoKFNHTUxFbGVtZW50KSBkb2N1bWVudEVsZW1lbnQpLnByaW50QXNYTUwocHcsIDAsIGluZGVudCk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcuZmx1c2goKTsKLQkJLy8gY2hhckVudGl0aWVzNFhtbCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRBc1hNTChQcmludFdyaXRlciBwdywgYm9vbGVhbiBpbmRlbnQsIFN0cmluZyBlbmMpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwcmludEFzWE1MKG51bGwsIG51bGwsIHB3LCBpbmRlbnQsIGVuYyk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgRG9jdW1lbnQgYXMgU0dNTC4gc3RhcnR0YWcncyBzdHJpbmcgaW4gdGhpcyBkb2N1bWVudCBhcmUgZnJvbSB0aGUKLQkgKiBvcmlnaW5hbCBkb2N1bWVudCAoc2VlIHtAbGluayBTR01MRWxlbWVudCN0b1N0cmluZygpfS4gRXZlbiBpZgotCSAqIGF0dHJpYnV0ZXMgaW4gZWxlbWVudHMgYXJlIG1vZGlmaWVkLCBzdGFydHRhZydzIHN0cmluZyBkb2VzIG5vdCBjaGFuZ2UuCi0JICogCi0JICogQHBhcmFtIERURCdzCi0JICogICAgICAgICAgICBsb2NhdGlvbgotCSAqIEBwYXJhbSBwdwotCSAqICAgICAgICAgICAgc3RyZWFtIHRvIHdyaXRlIHRoaXMgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRBc1NHTUwoUHJpbnRXcml0ZXIgcHcsIGJvb2xlYW4gaW5kZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQlwdy5wcmludGxuKGRvY3R5cGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKGRvY3VtZW50RWxlbWVudCAhPSBudWxsKQotCQkJKChTR01MRWxlbWVudCkgZG9jdW1lbnRFbGVtZW50KS5wcmludEFzU0dNTChwdywgMCwgaW5kZW50KTsKLQkJcHcucHJpbnRsbigpOwotCQlwdy5mbHVzaCgpOwotCX0KLQotCS8qKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIEhhc2h0YWJsZSBjaGFyRW50aXRpZXM0WG1sOwotCi0JU3RyaW5nIGdldEVudGl0eU9yaWdpbjRYbWwoU3RyaW5nIGVudGl0eSkgewotCQlyZXR1cm4gKFN0cmluZykgY2hhckVudGl0aWVzNFhtbC5nZXQoZW50aXR5KTsKLQl9Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBTR01MRG9jVHlwZURlZiBkdGQ7Ci0KLQlwdWJsaWMgU0dNTERvY1R5cGVEZWYgZ2V0RFREKCkgewotCQlyZXR1cm4gZHRkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERURChTR01MRG9jVHlwZURlZiBkdGQpIHsKLQkJdGhpcy5kdGQgPSBkdGQ7Ci0JfQotCi0JU3RyaW5nIGdldEVudGl0eU9yaWdpbihDaGFyYWN0ZXIgQ2gpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGNoYXJOdW1FbnRpdGllcy5nZXQoQ2gpOwotCX0KLQotCS8qKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIEhhc2h0YWJsZTxDaGFyYWN0ZXIsIFN0cmluZz4gY2hhck51bUVudGl0aWVzID0gbmV3IEhhc2h0YWJsZTxDaGFyYWN0ZXIsIFN0cmluZz4oKTsKLQotCXZvaWQgcHV0Q2hhck51bUVudGl0eShDaGFyYWN0ZXIgQywgU3RyaW5nIGVudCkgewotCQljaGFyTnVtRW50aXRpZXMucHV0KEMsIGVudCk7Ci0JfQotCi0JU3RyaW5nIGdldENoYXJOdW1FbnRpdHkoQ2hhcmFjdGVyIEMpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGNoYXJOdW1FbnRpdGllcy5nZXQoQyk7Ci0JfQotCi0JLy8gRE9NIExldmVsIDIKLQotCXB1YmxpYyBOb2RlIGltcG9ydE5vZGUoTm9kZSBpbXBvcnRlZE5vZGUsIGJvb2xlYW4gZGVlcCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCU5vZGUgcmV0OwotCQlzd2l0Y2ggKGltcG9ydGVkTm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0JCQlyZXQgPSBjcmVhdGVFbGVtZW50KGltcG9ydGVkTm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gaW1wb3J0ZWROb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJQXR0ciBpbXBvcnRlZEF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCWlmIChpbXBvcnRlZEF0dHIuZ2V0U3BlY2lmaWVkKCkpIHsKLQkJCQkJQXR0ciBhdHRyID0gY3JlYXRlQXR0cmlidXRlKGltcG9ydGVkQXR0ci5nZXROb2RlTmFtZSgpKTsKLQkJCQkJYXR0ci5zZXRWYWx1ZShpbXBvcnRlZEF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQkJCSgoRWxlbWVudCkgcmV0KS5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREU6Ci0JCQlyZXQgPSBjcmVhdGVBdHRyaWJ1dGUoaW1wb3J0ZWROb2RlLmdldE5vZGVOYW1lKCkpOwotCQkJKChBdHRyKSByZXQpLnNldFZhbHVlKGltcG9ydGVkTm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBOb2RlLlRFWFRfTk9ERToKLQkJCXJldCA9IGNyZWF0ZVRleHROb2RlKGltcG9ydGVkTm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERToKLQkJCXJldCA9IGNyZWF0ZUNEQVRBU2VjdGlvbihpbXBvcnRlZE5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTm9kZS5DT01NRU5UX05PREU6Ci0JCQlyZXQgPSBjcmVhdGVDb21tZW50KGltcG9ydGVkTm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIGltcG9ydGVkTm9kZTsKLQkJCXJldCA9IGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihwaS5nZXRUYXJnZXQoKSwgcGkuZ2V0RGF0YSgpKTsKLQkJCWJyZWFrOwotCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOgotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsCi0JCQkJCSJFTlRJVFlfUkVGRVJFTkNFOiAiICsgaW1wb3J0ZWROb2RlKSB7Ci0JCQl9OwotCQljYXNlIE5vZGUuRU5USVRZX05PREU6Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIkVOVElUWTogIgotCQkJCQkrIGltcG9ydGVkTm9kZSkgewotCQkJfTsKLQkJY2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIkRPQ1VNRU5UOiAiCi0JCQkJCSsgaW1wb3J0ZWROb2RlKSB7Ci0JCQl9OwotCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsCi0JCQkJCSJET0NVTUVOVF9UWVBFOiAiICsgaW1wb3J0ZWROb2RlKSB7Ci0JCQl9OwotCQljYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERToKLQkJCXJldCA9IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKLQkJCWJyZWFrOwotCQljYXNlIE5vZGUuTk9UQVRJT05fTk9ERToKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTk9UQVRJT046ICIKLQkJCQkJKyBpbXBvcnRlZE5vZGUpIHsKLQkJCX07Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwKLQkJCQkJIlVua25vd24gbm9kZSB0eXBlOiAiICsgaW1wb3J0ZWROb2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCX07Ci0JCX0KLQkJaWYgKGRlZXApIHsKLQkJCWZvciAoTm9kZSBpbXBvcnRlZENoaWxkID0gaW1wb3J0ZWROb2RlLmdldEZpcnN0Q2hpbGQoKTsgaW1wb3J0ZWRDaGlsZCAhPSBudWxsOyBpbXBvcnRlZENoaWxkID0gaW1wb3J0ZWRDaGlsZAotCQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCXJldC5hcHBlbmRDaGlsZChpbXBvcnROb2RlKGltcG9ydGVkQ2hpbGQsIHRydWUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLQkgKiAgICAgICAgICAgIGFsd2F5cyBpZ25vcmVkLgotCSAqIEByZXR1cm4gc2FtZSBhcyA8Y29kZT5jcmVhdGVFbGVtZW50KHF1YWxpZmllZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnROUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkKLQkJCXRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlRWxlbWVudChxdWFsaWZpZWROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0JICogICAgICAgICAgICBhbHdheXMgaWdub3JlZC4KLQkgKiBAcmV0dXJuIHNhbWUgYXMgPGNvZGU+Y3JlYXRlQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lKQotCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWVzcGFjZVVSSQotCSAqICAgICAgICAgICAgYWx3YXlzIGlnbm9yZWQuCi0JICogQHJldHVybiBzYW1lIGFzIDxjb2RlPmdldEVsZW1lbnRzQnlUYWdOYW1lKGxvY2FsTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQlyZXR1cm4gZ2V0RWxlbWVudHNCeVRhZ05hbWUobG9jYWxOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5FbGVtZW50PC9jb2RlPiB3aG9zZSA8Y29kZT5JRDwvY29kZT4gaXMgZ2l2ZW4gYnkKLQkgKiA8Y29kZT5lbGVtZW50SWQ8L2NvZGU+LiBJZiBtb3JlIHRoYW4gb25lIGVsZW1lbnQgaGFzIHRoaXMKLQkgKiA8Y29kZT5JRDwvY29kZT4gVGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGRlcHRoLWZpcnN0IGFuZCBwcmUtb3JkZXIKLQkgKiB0cmF2ZXJzYWwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEJ5SWQoU3RyaW5nIGVsZW1lbnRJRCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudEJ5SWQoZG9jdW1lbnRFbGVtZW50LCBlbGVtZW50SUQpOwotCX0KLQotCXByaXZhdGUgRWxlbWVudCBnZXRFbGVtZW50QnlJZChFbGVtZW50IGVsLCBTdHJpbmcgZWxlbWVudElEKSB7Ci0JCWlmIChlbC5nZXRBdHRyaWJ1dGUoImlkIikuZXF1YWxzKGVsZW1lbnRJRCkpIHsKLQkJCXJldHVybiBlbDsKLQkJfSBlbHNlIHsKLQkJCWZvciAoTm9kZSBjaGlsZCA9IGVsLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZAotCQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQkJRWxlbWVudCByZXQgPSBnZXRFbGVtZW50QnlJZCgoRWxlbWVudCkgY2hpbGQsIGVsZW1lbnRJRCk7Ci0JCQkJCWlmIChyZXQgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIHJldDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRE9NIExldmVsIDMKLQkgKi8KLQotCXB1YmxpYyBOb2RlIGFkb3B0Tm9kZShOb2RlIHNvdXJjZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREb2N1bWVudFVSSSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRE9NQ29uZmlndXJhdGlvbiBnZXREb21Db25maWcoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEVuY29kaW5nKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFN0cmljdEVycm9yQ2hlY2tpbmcoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0WG1sU3RhbmRhbG9uZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRYbWxWZXJzaW9uKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vcm1hbGl6ZURvY3VtZW50KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgTm9kZSByZW5hbWVOb2RlKE5vZGUgbiwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpCi0JCQl0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFVSSShTdHJpbmcgZG9jdW1lbnRVUkkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RyaWN0RXJyb3JDaGVja2luZyhib29sZWFuIHN0cmljdEVycm9yQ2hlY2tpbmcpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0WG1sU3RhbmRhbG9uZShib29sZWFuIHhtbFN0YW5kYWxvbmUpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRYbWxWZXJzaW9uKFN0cmluZyB4bWxWZXJzaW9uKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxEb2N1bWVudEZyYWdtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MRG9jdW1lbnRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTA2ODM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxEb2N1bWVudEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWNsYXNzIFNHTUxEb2N1bWVudEZyYWdtZW50IGV4dGVuZHMgU0dNTFBhcmVudE5vZGUgaW1wbGVtZW50cyBEb2N1bWVudEZyYWdtZW50IHsKLQl2b2lkIGNoZWNrKE5vZGUgbmV3Q2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzd2l0Y2ggKG5ld0NoaWxkLmdldE5vZGVUeXBlKCkpIHsKLQkJY2FzZSBFTEVNRU5UX05PREU6Ci0JCWNhc2UgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgotCQljYXNlIENPTU1FTlRfTk9ERToKLQkJY2FzZSBURVhUX05PREU6Ci0JCWNhc2UgQ0RBVEFfU0VDVElPTl9OT0RFOgotCQljYXNlIEVOVElUWV9SRUZFUkVOQ0VfTk9ERToKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBuZXdDaGlsZAotCQkJCQkrICIgY2Fubm90IGJlIGEgY2hpbGQgb2YgIiArIHRoaXMpIHsKLQkJCX07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiNkb2N1bWVudC1mcmFnbWVudCI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyBub2RlVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19EQVRBX0FMTE9XRURfRVJSLCB0aGlzCi0JCQkJKyAiIGNhbm5vdCBoYXZlIGFueSBkYXRhLiIpIHsKLQkJfTsKLQl9Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOwotCX0KLQotCVNHTUxEb2N1bWVudEZyYWdtZW50KERvY3VtZW50IGRvYykgewotCQlzdXBlcihkb2MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCJEb2N1bWVudEZyYWdtZW50WyIpOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQKLQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJc2IuYXBwZW5kKGNoaWxkLnRvU3RyaW5nKCkpOwotCQkJaWYgKGNoaWxkLmdldE5leHRTaWJsaW5nKCkgIT0gbnVsbCkgewotCQkJCXNiLmFwcGVuZCgnLCcpOwotCQkJfQotCQl9Ci0JCXNiLmFwcGVuZCgnXScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1NGMxNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuSVByaW50WE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuSVNHTUxFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVHlwZUluZm87Ci0KLS8qKgotICogRWxlbWVudCBjbGFzcyBvZiBTR01MLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTR01MRWxlbWVudCBleHRlbmRzIFNHTUxQYXJlbnROb2RlIGltcGxlbWVudHMgSVNHTUxFbGVtZW50IHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODA4ODgxNTc2MDcyMzcyODM3OEw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyB0YWdOYW1lOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBTR01MQXR0cmlidXRlIGF0dHJpYnV0ZXNbXSA9IG5ldyBTR01MQXR0cmlidXRlWzhdOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBpbnQgYXR0ck51bSA9IDA7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGVsZW1lbnQncyBuYW1lCi0JICogQHBhcmFtIGRvYwotCSAqICAgICAgICAgICAgb3duZXIgZG9jdW1lbnQgb2YgdGhpcyBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBTR01MRWxlbWVudChTdHJpbmcgbmFtZSwgRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKGRvYyk7Ci0JCXRoaXMudGFnTmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGFuIHNwZWNpZmllZCBub2RlIGlzIGFwcHJvcHJpYXRlIGFzIGEgY2hpbGQuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIGNoaWxkIG5vZGUgdG8gYWRkCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiA8Y29kZT4gbm9kZSA8L2NvZGU+IGlzIG5vdCBhcHByb3ByaWF0ZSBhcyBhIGNoaWxkLgotCSAqLwotCXZvaWQgY2hlY2soTm9kZSBub2RlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLAotCQkJCQkidHJ5aW5nIHRvIGluc2VydCBudWxsIikgewotCQkJfTsKLQkJfSBlbHNlIGlmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKSAhPSBvd25lckRvY3VtZW50KSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5XUk9OR19ET0NVTUVOVF9FUlIsIG5vZGUKLQkJCQkJKyAiIGNyZWF0ZWQgZnJvbSAiICsgbm9kZS5nZXRPd25lckRvY3VtZW50KCkgKyAiLiAiICsgdGhpcwotCQkJCQkrICIgY3JlYXRlZCBmcm9tICIgKyBvd25lckRvY3VtZW50KSB7Ci0JCQl9OwotCQl9Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCWNhc2UgRUxFTUVOVF9OT0RFOgotCQljYXNlIFRFWFRfTk9ERToKLQkJY2FzZSBDT01NRU5UX05PREU6Ci0JCWNhc2UgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgotCQljYXNlIENEQVRBX1NFQ1RJT05fTk9ERToKLQkJY2FzZSBFTlRJVFlfUkVGRVJFTkNFX05PREU6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgbm9kZQotCQkJCQkrICIgaXMgbm90IGFsbG93ZWQgYXMgYSBjaGlsZCBvZiAiICsgdGhpcykgewotCQkJfTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBhdHRyTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCVNHTUxBdHRyaWJ1dGUgYXR0ciA9IGF0dHJpYnV0ZXNbaV07Ci0JCQlpZiAoYXR0ci5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsKLQkJCQlyZXR1cm4gYXR0ci5nZXROb2RlVmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7Ci0JfQotCi0JcHVibGljIEF0dHIgZ2V0QXR0cmlidXRlTm9kZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gYXR0ck51bSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlTR01MQXR0cmlidXRlIHJldCA9IGF0dHJpYnV0ZXNbaV07Ci0JCQlpZiAocmV0LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgewotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZEF0dHJCdWYoKSB7Ci0JCVNHTUxBdHRyaWJ1dGUgbmV3QnVmW10gPSBuZXcgU0dNTEF0dHJpYnV0ZVthdHRyTnVtICogMl07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXR0cmlidXRlcywgMCwgbmV3QnVmLCAwLCBhdHRyTnVtKTsKLQkJYXR0cmlidXRlcyA9IG5ld0J1ZjsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5lZCBpbnN0YW5jZSBhbHdheXMgaWdub3JlcyA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+Ci0JICovCi0JcHVibGljIE5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IE5hbWVkTm9kZU1hcCgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIHJldCA9IG5ldyBTdHJpbmdCdWZmZXIoJ1snKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJOdW0gLSAxOyBpKyspIHsKLQkJCQkJcmV0LmFwcGVuZChhdHRyaWJ1dGVzW2ldICsgIiwgIik7Ci0JCQkJfQotCQkJCWlmIChhdHRyTnVtID4gMCkgewotCQkJCQlyZXQuYXBwZW5kKGF0dHJpYnV0ZXNbYXR0ck51bSAtIDFdKTsKLQkJCQl9Ci0JCQkJcmV0LmFwcGVuZCgnXScpOwotCQkJCXJldHVybiByZXQudG9TdHJpbmcoKTsKLQkJCX0KLQotCQkJcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBOb2RlIGdldE5hbWVkSXRlbU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHsKLQkJCQlyZXR1cm4gZ2V0TmFtZWRJdGVtKGxvY2FsTmFtZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBOb2RlIHNldE5hbWVkSXRlbShOb2RlIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQkJaWYgKGFyZyBpbnN0YW5jZW9mIFNHTUxBdHRyaWJ1dGUpIHsKLQkJCQkJZm9yIChpbnQgaSA9IGF0dHJOdW0gLSAxOyBpID49IDA7IGktLSkgewotCQkJCQkJU0dNTEF0dHJpYnV0ZSByZXQgPSBhdHRyaWJ1dGVzW2ldOwotCQkJCQkJaWYgKHJldC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCQkJCWFyZy5nZXROb2RlTmFtZSgpKSkgewotCQkJCQkJCWF0dHJpYnV0ZXNbaV0gPSAoU0dNTEF0dHJpYnV0ZSkgYXJnOwotCQkJCQkJCWF0dHJpYnV0ZXNbaV0uc2V0T3duZXJFbGVtZW50KFNHTUxFbGVtZW50LnRoaXMpOwotCQkJCQkJCXJldHVybiByZXQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGF0dHJOdW0gPT0gYXR0cmlidXRlcy5sZW5ndGgpIHsKLQkJCQkJCWV4cGFuZEF0dHJCdWYoKTsKLQkJCQkJfQotCQkJCQlhdHRyaWJ1dGVzW2F0dHJOdW0rK10gPSAoU0dNTEF0dHJpYnV0ZSkgYXJnOwotCQkJCQkoKFNHTUxBdHRyaWJ1dGUpIGFyZykuc2V0T3duZXJFbGVtZW50KFNHTUxFbGVtZW50LnRoaXMpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKAotCQkJCQkJCURPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsCi0JCQkJCQkJIm9ubHkgQXR0ciBpbnN0YW5jZSBjYW4gYmUgc2V0OiAiICsgYXJnKSB7Ci0JCQkJCX07Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW1OUyhOb2RlIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQkJcmV0dXJuIHNldE5hbWVkSXRlbShhcmcpOwotCQkJfQotCi0JCQlwdWJsaWMgTm9kZSByZW1vdmVOYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQkJCWZvciAoaW50IGkgPSBhdHRyTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJU0dNTEF0dHJpYnV0ZSBhdHRyID0gYXR0cmlidXRlc1tpXTsKLQkJCQkJaWYgKGF0dHIuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7Ci0JCQkJCQlhdHRyaWJ1dGVzW2ldID0gbnVsbDsKLQkJCQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwotCQkJCQkJZm9yIChpKys7IGkgPCBhdHRyTnVtOyBpKyspIHsKLQkJCQkJCQlhdHRyaWJ1dGVzW2kgLSAxXSA9IGF0dHJpYnV0ZXNbaV07Ci0JCQkJCQl9Ci0JCQkJCQlhdHRyTnVtLS07Ci0JCQkJCQlyZXR1cm4gYXR0cjsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIE5vZGUgcmVtb3ZlTmFtZWRJdGVtTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkKLQkJCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQkJcmV0dXJuIHJlbW92ZU5hbWVkSXRlbShsb2NhbE5hbWUpOwotCQkJfQotCi0JCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJCWlmICgwIDw9IGluZGV4ICYmIGluZGV4IDwgYXR0ck51bSkgewotCQkJCQlyZXR1cm4gYXR0cmlidXRlc1tpbmRleF07Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCQlyZXR1cm4gYXR0ck51bTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZmluYWwgYm9vbGVhbiBhbGwgPSBuYW1lLmVxdWFscygiKiIpOwotCQlmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZSA9IG5hbWU7Ci0JCXJldHVybiBuZXcgTm9kZUxpc3QoKSB7Ci0JCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCQlpbnQgcmV0ID0gMDsKLQkJCQlOb2RlIHRtcDEsIHRtcDI7Ci0JCQkJdG1wMSA9IFNHTUxFbGVtZW50LnRoaXMuZmlyc3RDaGlsZDsKLQkJCQlvdXRlcjogd2hpbGUgKHRtcDEgIT0gbnVsbCkgewotCQkJCQlpZiAodG1wMSBpbnN0YW5jZW9mIEVsZW1lbnQKLQkJCQkJCQkmJiAoYWxsIHx8IHRhcmdldE5hbWUuZXF1YWxzSWdub3JlQ2FzZSh0bXAxCi0JCQkJCQkJCQkuZ2V0Tm9kZU5hbWUoKSkpCi0JCQkJCQkJJiYgdG1wMSAhPSBTR01MRWxlbWVudC50aGlzKSB7Ci0JCQkJCQlyZXQrKzsKLQkJCQkJfQotCQkJCQlpZiAoKHRtcDIgPSB0bXAxLmdldEZpcnN0Q2hpbGQoKSkgPT0gbnVsbCkgewotCQkJCQkJaWYgKHRtcDEgPT0gU0dNTEVsZW1lbnQudGhpcykgewotCQkJCQkJCWJyZWFrIG91dGVyOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl0bXAyID0gdG1wMS5nZXROZXh0U2libGluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXdoaWxlICh0bXAyID09IG51bGwgJiYgdG1wMSAhPSBudWxsKSB7Ci0JCQkJCQl0bXAxID0gdG1wMiA9IHRtcDEuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKHRtcDEgIT0gU0dNTEVsZW1lbnQudGhpcykgewotCQkJCQkJCXRtcDIgPSB0bXAxLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWJyZWFrIG91dGVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXRtcDEgPSB0bXAyOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCi0JCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJCU5vZGUgdG1wMSwgdG1wMjsKLQkJCQl0bXAxID0gU0dNTEVsZW1lbnQudGhpcy5maXJzdENoaWxkOwotCQkJCW91dGVyOiB3aGlsZSAodG1wMSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0bXAxIGluc3RhbmNlb2YgRWxlbWVudAotCQkJCQkJCSYmIChhbGwgfHwgdGFyZ2V0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKHRtcDEKLQkJCQkJCQkJCS5nZXROb2RlTmFtZSgpKSkKLQkJCQkJCQkmJiB0bXAxICE9IFNHTUxFbGVtZW50LnRoaXMpIHsKLQkJCQkJCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkJCQkJcmV0dXJuIHRtcDE7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWluZGV4LS07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCh0bXAyID0gdG1wMS5nZXRGaXJzdENoaWxkKCkpID09IG51bGwpIHsKLQkJCQkJCWlmICh0bXAxID09IFNHTUxFbGVtZW50LnRoaXMpIHsKLQkJCQkJCQlicmVhayBvdXRlcjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdG1wMiA9IHRtcDEuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl3aGlsZSAodG1wMiA9PSBudWxsICYmIHRtcDEgIT0gbnVsbCkgewotCQkJCQkJdG1wMSA9IHRtcDIgPSB0bXAxLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmICh0bXAxICE9IFNHTUxFbGVtZW50LnRoaXMpIHsKLQkJCQkJCQl0bXAyID0gdG1wMS5nZXROZXh0U2libGluZygpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlicmVhayBvdXRlcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl0bXAxID0gdG1wMjsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gdGFnTmFtZTsKLQl9Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBFTEVNRU5UX05PREU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLQkJcmV0dXJuIHRhZ05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IGF0dHJOdW0gLSAxOyBpID49IDA7IGktLSkgewotCQkJU0dNTEF0dHJpYnV0ZSBhdHRyID0gYXR0cmlidXRlc1tpXTsKLQkJCWlmIChhdHRyLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgewotCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBnZXREZWZhdWx0VmFsdWUobmFtZSk7Ci0JCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0Tm9kZVZhbHVlKGRlZmF1bHRWYWx1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYXR0cmlidXRlc1tpXSA9IG51bGw7Ci0JCQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwotCQkJCQlmb3IgKGkrKzsgaSA8IGF0dHJOdW07IGkrKykgewotCQkJCQkJYXR0cmlidXRlc1tpIC0gMV0gPSBhdHRyaWJ1dGVzW2ldOwotCQkJCQl9Ci0JCQkJCWF0dHJOdW0tLTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKFN0cmluZyBhdHRyTmFtZSkgewotCQlFbGVtZW50RGVmaW5pdGlvbiBlZGVmOwotCQlTR01MRG9jVHlwZURlZiBkdGQgPSAoKFNHTUxEb2N1bWVudCkgb3duZXJEb2N1bWVudCkuZ2V0RFREKCk7Ci0JCWlmIChkdGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQllZGVmID0gZHRkLmdldEVsZW1lbnREZWZpbml0aW9uKHRhZ05hbWUpOwotCQlpZiAoZWRlZiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUF0dHJpYnV0ZURlZmluaXRpb24gYWRlZiA9IGVkZWYuZ2V0QXR0cmlidXRlRGVmKGF0dHJOYW1lKTsKLQkJcmV0dXJuIGFkZWYgIT0gbnVsbCA/IGFkZWYuZ2V0RGVmYXVsdFZhbHVlKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBBdHRyIHJlbW92ZUF0dHJpYnV0ZU5vZGUoQXR0ciBvbGRBdHRyKSB7Ci0JCWZvciAoaW50IGkgPSBhdHRyTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChhdHRyaWJ1dGVzW2ldID09IG9sZEF0dHIpIHsKLQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gZ2V0RGVmYXVsdFZhbHVlKG9sZEF0dHIuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVNHTUxBdHRyaWJ1dGUgYXR0ciA9IChTR01MQXR0cmlidXRlKSBvd25lckRvY3VtZW50Ci0JCQkJCQkJLmNyZWF0ZUF0dHJpYnV0ZShvbGRBdHRyLmdldE5vZGVOYW1lKCkpOwotCQkJCQlhdHRyLnNldFZhbHVlKGRlZmF1bHRWYWx1ZSk7Ci0JCQkJCWF0dHJpYnV0ZXNbaV0gPSBhdHRyOwotCQkJCQlhdHRyLnNldE93bmVyRWxlbWVudCh0aGlzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhdHRyaWJ1dGVzW2ldID0gbnVsbDsKLQkJCQkJZm9yIChpKys7IGkgPCBhdHRyTnVtOyBpKyspIHsKLQkJCQkJCWF0dHJpYnV0ZXNbaSAtIDFdID0gYXR0cmlidXRlc1tpXTsKLQkJCQkJfQotCQkJCQlhdHRyTnVtLS07Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCSgoU0dNTEF0dHJpYnV0ZSkgb2xkQXR0cikuc2V0T3duZXJFbGVtZW50KHRoaXMpOwotCQlyZXR1cm4gb2xkQXR0cjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCVNHTUxBdHRyaWJ1dGUgYXR0cjsKLQkJZm9yIChpbnQgaSA9IGF0dHJOdW0gLSAxOyBpID49IDA7IGktLSkgewotCQkJYXR0ciA9IGF0dHJpYnV0ZXNbaV07Ci0JCQlpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgewotCQkJCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlhdHRyID0gKFNHTUxBdHRyaWJ1dGUpIG93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsKLQkJYXR0ci5zZXRPd25lckVsZW1lbnQodGhpcyk7Ci0JCWlmIChhdHRyaWJ1dGVzLmxlbmd0aCA9PSBhdHRyTnVtKSB7Ci0JCQlleHBhbmRBdHRyQnVmKCk7Ci0JCX0KLQkJYXR0cmlidXRlc1thdHRyTnVtKytdID0gYXR0cjsKLQl9Ci0KLQlwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlKEF0dHIgbmV3QXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghKG5ld0F0dHIgaW5zdGFuY2VvZiBTR01MQXR0cmlidXRlKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uV1JPTkdfRE9DVU1FTlRfRVJSLCBuZXdBdHRyCi0JCQkJCSsgImlzIG5vdCBTR01MQXR0cmlidXRlIikgewotCQkJfTsKLQkJfQotCQlmb3IgKGludCBpID0gYXR0ck51bSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlTR01MQXR0cmlidXRlIGF0dHIgPSBhdHRyaWJ1dGVzW2ldOwotCQkJaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmV3QXR0ci5nZXROYW1lKCkpKSB7Ci0JCQkJYXR0ci5zZXRPd25lckVsZW1lbnQobnVsbCk7Ci0JCQkJYXR0cmlidXRlc1tpXSA9IChTR01MQXR0cmlidXRlKSBuZXdBdHRyOwotCQkJCWF0dHJpYnV0ZXNbaV0uc2V0T3duZXJFbGVtZW50KHRoaXMpOwotCQkJCXJldHVybiBhdHRyOwotCQkJfQotCQl9Ci0JCWlmIChhdHRyaWJ1dGVzLmxlbmd0aCA9PSBhdHRyTnVtKSB7Ci0JCQlleHBhbmRBdHRyQnVmKCk7Ci0JCX0KLQkJYXR0cmlidXRlc1thdHRyTnVtXSA9IChTR01MQXR0cmlidXRlKSBuZXdBdHRyOwotCQlhdHRyaWJ1dGVzW2F0dHJOdW0rK10uc2V0T3duZXJFbGVtZW50KHRoaXMpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwKLQkJCQkiY2FuJ3Qgc2V0IHZhbHVlIGluICIgKyB0aGlzKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogR2V0IHN0YXJ0IHRhZyBzdHJpbmcuIElmIGF0dHJpYnV0ZSB2YWx1ZSBpbmNsdWRlcyBhIGNoYXJhY3RlciB0aGF0IGNhbiBiZQotCSAqIHJldmVydGVkLCByZXBsYWNlcyBpdCB0byBvcmlnaW5hbCBjaGFyYWN0ZXIgZW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gc3RyaW5nIG9mIHN0YXJ0IHRhZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgcmV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlyZXQuYXBwZW5kKCc8Jyk7Ci0JCXJldC5hcHBlbmQodGFnTmFtZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ck51bTsgaSsrKQotCQkJcmV0LmFwcGVuZChhdHRyaWJ1dGVzW2ldLnRvU3RyaW5nKCkpOwotCQlyZXQuYXBwZW5kKCc+Jyk7Ci0JCXJldHVybiBuZXcgU3RyaW5nKHJldCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRBc1hNTChQcmludFdyaXRlciBwdywgaW50IGluZGVudExldmVsLCBib29sZWFuIGluZGVudCkgewotCQlpZiAoaW5kZW50Ci0JCQkJJiYgKHByZXZpb3VzU2libGluZyA9PSBudWxsIHx8IHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFCi0JCQkJCQkmJiBwcmV2aW91c1NpYmxpbmcuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50TGV2ZWw7IGkrKykKLQkJCQlwdy5wcmludCgnICcpOwotCQl9Ci0JCXB3LnByaW50KCc8JyArIGdldFRhZ05hbWUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ck51bTsgaSsrKSB7Ci0JCQlwdy5wcmludChhdHRyaWJ1dGVzW2ldLnRvWE1MU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChoYXNDaGlsZE5vZGVzKCkpIHsKLQkJCXB3LnByaW50KCc+Jyk7Ci0JCQlmb3IgKE5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQKLQkJCQkJLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpZiAoaW5kZW50ICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUKLQkJCQkJCSYmIGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpIHsKLQkJCQkJcHcucHJpbnRsbigpOwotCQkJCX0KLQkJCQkoKElQcmludFhNTCkgY2hpbGQpLnByaW50QXNYTUwocHcsIGluZGVudExldmVsICsgMSwgaW5kZW50KTsKLQkJCX0KLQkJCWlmIChpbmRlbnQKLQkJCQkJJiYgKGdldExhc3RDaGlsZCgpID09IG51bGwgfHwgZ2V0TGFzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERQotCQkJCQkJCSYmIGdldExhc3RDaGlsZCgpLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpKSB7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJCWZvciAoaW50IGkgPSBpbmRlbnRMZXZlbDsgaSA+IDA7IGktLSkKLQkJCQkJcHcucHJpbnQoJyAnKTsKLQkJCX0KLQkJCXB3LnByaW50KCI8LyIgKyBnZXRUYWdOYW1lKCkgKyAnPicpOwotCQl9IGVsc2UgewotCQkJcHcucHJpbnQoIi8+Iik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludEFzU0dNTChQcmludFdyaXRlciBwdywgaW50IGluZGVudExldmVsLCBib29sZWFuIGluZGVudCkgewotCQlpZiAoaW5kZW50Ci0JCQkJJiYgKHByZXZpb3VzU2libGluZyA9PSBudWxsIHx8IHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFCi0JCQkJCQkmJiBwcmV2aW91c1NpYmxpbmcuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSkpIHsKLQkJCWZvciAoaW50IGkgPSBpbmRlbnRMZXZlbDsgaSA+IDA7IGktLSkKLQkJCQlwdy5wcmludCgnICcpOwotCQl9Ci0JCXB3LnByaW50KHRvU3RyaW5nKCkpOwotCQlib29sZWFuIHBhcmVudDsKLQkJaWYgKHBhcmVudCA9IGhhc0NoaWxkTm9kZXMoKSkgewotCQkJZm9yIChOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkCi0JCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJaWYgKGluZGVudCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFCi0JCQkJCQkmJiBjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKSB7Ci0JCQkJCXB3LnByaW50bG4oKTsKLQkJCQl9Ci0JCQkJKChJUHJpbnRYTUwpIGNoaWxkKS5wcmludEFzU0dNTChwdywgaW5kZW50TGV2ZWwgKyAxLCBpbmRlbnQpOwotCQkJfQotCQl9Ci0JCVNHTUxEb2NUeXBlRGVmIGR0ZCA9ICgoU0dNTERvY3VtZW50KSBnZXRPd25lckRvY3VtZW50KCkpLmdldERURCgpOwotCQlFbGVtZW50RGVmaW5pdGlvbiBlZCA9IG51bGw7Ci0JCWlmIChkdGQgIT0gbnVsbCkgewotCQkJZWQgPSBkdGQuZ2V0RWxlbWVudERlZmluaXRpb24odGFnTmFtZSk7Ci0JCX0KLQkJaWYgKHBhcmVudCB8fCBlZCA9PSBudWxsIHx8IGVkLmdldENvbnRlbnRNb2RlbCgpICE9IFNHTUxQYXJzZXIuZW1wdHkpIHsKLQkJCWlmIChpbmRlbnQKLQkJCQkJJiYgKGdldExhc3RDaGlsZCgpID09IG51bGwgfHwgZ2V0TGFzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERQotCQkJCQkJCSYmIGdldExhc3RDaGlsZCgpLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpKSB7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJCWZvciAoaW50IGkgPSBpbmRlbnRMZXZlbDsgaSA+IDA7IGktLSkKLQkJCQkJcHcucHJpbnQoJyAnKTsKLQkJCX0KLQkJCXB3LnByaW50KCI8LyIgKyBnZXRUYWdOYW1lKCkgKyAnPicpOwotCQl9Ci0JfQotCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlTR01MRWxlbWVudCByZXQgPSAoU0dNTEVsZW1lbnQpIHN1cGVyLmNsb25lTm9kZShkZWVwKTsKLQkJU0dNTEF0dHJpYnV0ZSBjbG9uZUF0dHJpYnV0ZXNbXSA9IG5ldyBTR01MQXR0cmlidXRlW2F0dHJpYnV0ZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IGF0dHJOdW0gLSAxOyBpID49IDA7IGktLSkgewotCQkJY2xvbmVBdHRyaWJ1dGVzW2ldID0gKFNHTUxBdHRyaWJ1dGUpIGF0dHJpYnV0ZXNbaV0uY2xvbmVOb2RlKGZhbHNlKTsKLQkJCWNsb25lQXR0cmlidXRlc1tpXS5zZXRPd25lckVsZW1lbnQocmV0KTsKLQkJfQotCQlyZXQuYXR0cmlidXRlcyA9IGNsb25lQXR0cmlidXRlczsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0JICogICAgICAgICAgICBhbHdheXMgaWdub3JlZAotCSAqIEByZXR1cm4gc2FtZSBhcyA8Y29kZT5nZXRBdHRyaWJ1dGUobG9jYWxOYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShsb2NhbE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgYW4gYXR0cmlidXRlLiBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGlzIG1ldGhvZCBpcyBzYW1lIGFzCi0JICogPGNvZGU+c2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUsIHZhbHVlKTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0JICogICAgICAgICAgICBhbHdheXMgaWdub3JlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lLAotCQkJU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKHF1YWxpZmllZE5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuIGF0dHJpYnV0ZS4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgdGhpcyBtZXRob2QgaXMgc2FtZSBhcwotCSAqIDxjb2RlPnJlbW92ZUF0dHJpYnV0ZShsb2NhbE5hbWUpPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLQkgKiAgICAgICAgICAgIGFsd2F5cyBpZ25vcmVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkKLQkJCXRocm93cyBET01FeGNlcHRpb24gewotCQlyZW1vdmVBdHRyaWJ1dGUobG9jYWxOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0JICogICAgICAgICAgICBhbHdheXMgaWdub3JlZAotCSAqIEByZXR1cm4gc2FtZSBhcyA8Y29kZT5nZXRBdHRyaWJ1dGVOb2RlKGxvY2FsTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIEF0dHIgZ2V0QXR0cmlidXRlTm9kZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5vZGUobG9jYWxOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNhbWUgYXMgPGNvZGU+c2V0QXR0cmlidXRlTm9kZShuZXdBdHRyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlTlMoQXR0ciBuZXdBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHNldEF0dHJpYnV0ZU5vZGUobmV3QXR0cik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWVzcGFjZVVSSQotCSAqICAgICAgICAgICAgYWx3YXlzIGlnbm9yZWQKLQkgKiBAcmV0dXJuIHNhbWUgYXMgPGNvZGU+Z2V0RWxlbWVudHNCeVRhZ05hbWUobG9jYWxOYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50c0J5VGFnTmFtZShsb2NhbE5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gYXR0ck51bSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlTR01MQXR0cmlidXRlIGF0dHIgPSBhdHRyaWJ1dGVzW2ldOwotCQkJaWYgKGF0dHIuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZShuYW1lKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLQkgKiAgICAgICAgICAgIGlnbm9yZWQKLQkgKiBAcmV0dXJuIHNhbWUgYXMgPGNvZGU+aGFzQXR0cmlidXRlTlMobG9jYWxOYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0JCXJldHVybiBoYXNBdHRyaWJ1dGUobG9jYWxOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gYXR0ck51bSA+IDA7Ci0JfQotCi0JLyoqCi0JICogRE9NIExldmVsIDMKLQkgKi8KLQotCXB1YmxpYyBUeXBlSW5mbyBnZXRTY2hlbWFUeXBlSW5mbygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0lkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLAotCQkJYm9vbGVhbiBpc0lkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOb2RlKEF0dHIgaWRBdHRyLCBib29sZWFuIGlzSWQpCi0JCQl0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTEVudGl0eURlY2xhcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MRW50aXR5RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlhYTczNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MRW50aXR5RGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwubW9kZWxncm91cC5JTW9kZWxHcm91cDsKLQotY2xhc3MgU0dNTEVudGl0eURlY2xhcmF0aW9uIHsKLQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nID0gbnVsbDsKLQotCXByaXZhdGUgSU1vZGVsR3JvdXAgcmVwbGFjZW1lbnRTdWJ0cmVlID0gbnVsbDsKLQotCXByaXZhdGUgQXR0cmlidXRlRGVmaW5pdGlvbiBhdHRyaWJ1dGVEZWZpbml0aW9uc1tdID0gbnVsbDsKLQotCXByaXZhdGUgU0dNTERvY1R5cGVEZWYgZHRkOwotCi0JU0dNTEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgZW50aXR5U3RyaW5nLAotCQkJU0dNTERvY1R5cGVEZWYgZHRkKSB7Ci0JCXRoaXMubmFtZSA9IGVudGl0eU5hbWU7Ci0JCXRoaXMucmVwbGFjZW1lbnRTdHJpbmcgPSBlbnRpdHlTdHJpbmc7Ci0JCXRoaXMuZHRkID0gZHRkOwotCX0KLQotCUF0dHJpYnV0ZURlZmluaXRpb25bXSBnZXRBdHRyaWJ1dGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZURlZmluaXRpb25zOwotCX0KLQotCVJlYWRlciBnZXRSZXBsYWNlbWVudFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgU3RyaW5nUmVhZGVyKHJlcGxhY2VtZW50U3RyaW5nKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSB7Ci0JCXJldHVybiByZXBsYWNlbWVudFN0cmluZzsKLQl9Ci0KLQlJTW9kZWxHcm91cCBnZXRSZXBsYWNlbWVudFN1YnRyZWUoKSB7Ci0JCXJldHVybiByZXBsYWNlbWVudFN1YnRyZWU7Ci0JfQotCi0Jdm9pZCBzZXRBdHRyaWJ1dGVEZWZpbml0aW9ucyhBdHRyaWJ1dGVEZWZpbml0aW9uIGFkc1tdKSB7Ci0JCWF0dHJpYnV0ZURlZmluaXRpb25zID0gYWRzOwotCX0KLQotCXZvaWQgc2V0UmVwbGFjZW1lbnRTdHJpbmcoU3RyaW5nIGFyZykgewotCQlyZXBsYWNlbWVudFN0cmluZyA9IGFyZzsKLQl9Ci0KLQl2b2lkIHNldFJlcGxhY2VtZW50U3VidHJlZShJTW9kZWxHcm91cCBhcmcpIHsKLQkJcmVwbGFjZW1lbnRTdWJ0cmVlID0gYXJnOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuYW1lICsgJz0nICsgcmVwbGFjZW1lbnRTdHJpbmc7Ci0JfQotCi0JU3RyaW5nIGdldEVudGl0eU5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXByaXZhdGUgaW50IGNoYXJFbnRpdHkgPSAtMTsKLQotCWludCBnZXRSZXBsYWNlbWVudENoYXIoKSB7Ci0JCXJldHVybiBjaGFyRW50aXR5OwotCX0KLQotCXZvaWQgc2V0UmVwbGFjZW1lbnRDaGFyKGludCBjaCkgewotCQljaGFyRW50aXR5ID0gY2g7Ci0JfQotCi0JU0dNTERvY1R5cGVEZWYgZ2V0RFREKCkgewotCQlyZXR1cm4gZHRkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxFbnRpdHlSZWZlcmVuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxFbnRpdHlSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3NmFkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MRW50aXR5UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbDsKLQotY2xhc3MgU0dNTEVudGl0eVJlZmVyZW5jZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgU0dNTEVudGl0eURlY2xhcmF0aW9uIGVkOwotCi0JU0dNTEVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSwgU0dNTEVudGl0eURlY2xhcmF0aW9uIGVkKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZWQgPSBlZDsKLQl9Ci0KLQlTR01MRW50aXR5RGVjbGFyYXRpb24gZ2V0RW50aXR5RGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiBlZDsKLQl9Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTE5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOWQ4ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuSVNHTUxOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBvZiBvcmcudzNjLmRvbS5Ob2RlIGltcGxlbWVudGF0aW9uLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgbW9zdAotICogbWV0aG9kcyBleGNlcHQgZm9yIGEgZmV3IHdoaWNoIGRlcGVuZHMgb24gY29uY3JldGUgaXRzIGNsYXNzZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTR01MTm9kZSBpbXBsZW1lbnRzIElTR01MTm9kZSB7Ci0JU0dNTE5vZGUgcHJldmlvdXNTaWJsaW5nLCBuZXh0U2libGluZywgcGFyZW50OwotCi0JRG9jdW1lbnQgb3duZXJEb2N1bWVudDsKLQotCVNHTUxOb2RlKERvY3VtZW50IGRvYykgewotCQlvd25lckRvY3VtZW50ID0gZG9jOwotCX0KLQotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJdHJ5IHsKLQkJCVNHTUxOb2RlIHJldCA9IChTR01MTm9kZSkgY2xvbmUoKTsKLQkJCXJldC5wYXJlbnQgPSByZXQubmV4dFNpYmxpbmcgPSByZXQucHJldmlvdXNTaWJsaW5nID0gbnVsbDsKLQkJCXJldHVybiByZXQ7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uIEVsZW1lbnQgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE5vZGVMaXN0IG51bGxOb2RlTGlzdCA9IG5ldyBOb2RlTGlzdCgpIHsKLQkJcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX07Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIG51bGxOb2RlTGlzdDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldE5leHRTaWJsaW5nKCkgewotCQlyZXR1cm4gdGhpcy5uZXh0U2libGluZzsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLQkJcmV0dXJuIG93bmVyRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXRQcmV2aW91c1NpYmxpbmcoKSB7Ci0JCXJldHVybiBwcmV2aW91c1NpYmxpbmc7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBOb2RlIGFwcGVuZENoaWxkKE5vZGUgbm9kZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgdGhpcwotCQkJCSsgIiBjYW5ub3QgaGF2ZSBjaGlsZHJlbi4iKSB7Ci0JCX07Ci0JfQotCi0JcHVibGljIE5vZGUgaW5zZXJ0QmVmb3JlKE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5ISUVSQVJDSFlfUkVRVUVTVF9FUlIsIHRoaXMKLQkJCQkrICIgY2Fubm90IGhhdmUgY2hpbGRyZW4uIikgewotCQl9OwotCX0KLQotCXB1YmxpYyBOb2RlIHJlbW92ZUNoaWxkKE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5ISUVSQVJDSFlfUkVRVUVTVF9FUlIsIHRoaXMKLQkJCQkrICIgY2Fubm90IGhhdmUgY2hpbGRyZW4uIikgewotCQl9OwotCX0KLQotCXB1YmxpYyBOb2RlIHJlcGxhY2VDaGlsZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCB0aGlzCi0JCQkJKyAiIGNhbm5vdCBoYXZlIGNoaWxkcmVuLiIpIHsKLQkJfTsKLQl9Ci0KLQkvLyBET00gTGV2ZWwgMgotCi0JcHVibGljIHZvaWQgbm9ybWFsaXplKCkgewotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYWx3YXlzIGZhbHNlIGJlY2F1c2UgdGhpcyBpcyBub3QgWE1MIGltcGxlbWVudGF0aW9uIGJ1dCBTR01MLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhbHdheXMgbnVsbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGFsd2F5cyBudWxsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhbHdheXMgbnVsbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZChTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBET00gTGV2ZWwgMwotCSAqLwotCi0JcHVibGljIHNob3J0IGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKE5vZGUgb3RoZXIpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSSSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0Q29udGVudCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoU3RyaW5nIGtleSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRXF1YWxOb2RlKE5vZGUgYXJnKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2FtZU5vZGUoTm9kZSBvdGhlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGxvb2t1cE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBsb29rdXBQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRDb250ZW50KFN0cmluZyB0ZXh0Q29udGVudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBPYmplY3Qgc2V0VXNlckRhdGEoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEsIFVzZXJEYXRhSGFuZGxlciBoYW5kbGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MUEkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWUyNDM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuSVByaW50WE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuSVNHTUxEb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KLS8qKgotICogT3JpZ2luYWxseSA8Y29kZT5vcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb248L2NvZGU+IGlzIGRlZmluZWQgZm9yCi0gKiBYTUwuIFN0cnVjdHVyZSBvZiBYTUwncyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gaXMgJmx0Oz88Y29kZT50YXJnZXQgZGF0YQotICogPC9jb2RlPgotICogPyZndDsuIEJ1dCBzdHJ1Y3R1cmUgb2YgU0dNTCdzIFBJIGlzICZsdDs/PGNvZGU+ZGF0YTwvY29kZT4gJmd0OyBTbywgdGhpcwotICogY2xhc3MgaGFzIG5vIDxjb2RlPnRhcmdldDwvY29kZT4uIEV2ZXJ5dGhpbmcgaXMgPGNvZGU+ZGF0YTwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIFNHTUxQSSBleHRlbmRzIFNHTUxOb2RlIGltcGxlbWVudHMgUHJvY2Vzc2luZ0luc3RydWN0aW9uLAotCQlJUHJpbnRYTUwgewotCXZvaWQgY2hlY2soTm9kZSBub2RlKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwKLQkJCQkiUHJvY2Vzc2luZ0luc3RydWN0aW9uIGNhbm5vdCBoYXZlIGFueSBjaGlsZHJlbi4iKSB7Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTm9kZUxpc3QgbnVsbE5vZGVMaXN0ID0gbmV3IE5vZGVMaXN0KCkgewotCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgewotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgewotCQl0aGlzLmRhdGEgPSBub2RlVmFsdWU7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCXJldHVybiBudWxsTm9kZUxpc3Q7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0LCBkYXRhOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gaW5zdGFuY2Ugd2hvc2UgdGFyZ2V0IHZhbHVlIGlzIG51bGwuCi0JICovCi0JcHVibGljIFNHTUxQSShTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSwgSVNHTUxEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIoZG9jKTsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNHTUwncyBQSSBoYXMgbm8gdGFnZXQuIFNvIHJldHVybnMgZGF0YSBpbnN0ZWFkIG9mIHRhcmdldC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFsd2F5cyBzYW1lIGFzIHtAbGluayAjZ2V0RGF0YSgpIGdldERhdGEoKX0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgewotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBkYXRhKSB7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogRm9yIGRlYnVnLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiPD8iICsgZGF0YSArICc+JzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludEFzWE1MKFByaW50V3JpdGVyIHB3LCBpbnQgaW5kZW50TGV2ZWwsIGJvb2xlYW4gaW5kZW50KSB7Ci0JCXB3LnByaW50KCI8PyIgKyBkYXRhICsgIj8+Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRBc1NHTUwoUHJpbnRXcml0ZXIgcHcsIGludCBpbmRlbnRMZXZlbCwgYm9vbGVhbiBpbmRlbnQpIHsKLQkJcHcucHJpbnQoIjw/IiArIGRhdGEgKyAnPicpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxQYXJlbnROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9TR01MUGFyZW50Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzRjZjkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxQYXJlbnROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmltcGw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqIEJhc2UgY2xhc3Mgb2Ygb3JnLnczYy5kb20uTm9kZSBpbXBsZW1lbnRhdGlvbi4gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIG1vc3QKLSAqIG1ldGhvZHMgZXhjZXB0IGZvciBhIGZldyB3aGljaCBkZXBlbmRzIG9uIGNvbmNyZXRlIGl0cyBjbGFzc2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU0dNTFBhcmVudE5vZGUgZXh0ZW5kcyBTR01MTm9kZSB7Ci0JU0dNTE5vZGUgZmlyc3RDaGlsZCwgbGFzdENoaWxkOwotCi0JU0dNTFBhcmVudE5vZGUoRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKGRvYyk7Ci0JfQotCi0JYWJzdHJhY3Qgdm9pZCBjaGVjayhOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlTR01MUGFyZW50Tm9kZSByZXQgPSBudWxsOwotCQlpZiAoZGVlcCAmJiBmaXJzdENoaWxkICE9IG51bGwpIHsKLQkJCXJldCA9IGNsb25lTm9kZURlZXAoKTsKLQkJCWlmIChyZXQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJcmV0ID0gKFNHTUxQYXJlbnROb2RlKSBjbG9uZSgpOwotCQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXQubGFzdENoaWxkID0gcmV0LmZpcnN0Q2hpbGQgPSBudWxsOwotCQl9Ci0JCXJldC5wYXJlbnQgPSByZXQubmV4dFNpYmxpbmcgPSByZXQucHJldmlvdXNTaWJsaW5nID0gbnVsbDsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcml2YXRlIFNHTUxQYXJlbnROb2RlIGNsb25lTm9kZURlZXAoKSB7Ci0JCXRyeSB7Ci0JCQlTR01MUGFyZW50Tm9kZSByZXQgPSAoU0dNTFBhcmVudE5vZGUpIGNsb25lKCk7Ci0JCQlyZXQucHJldmlvdXNTaWJsaW5nID0gcmV0Lm5leHRTaWJsaW5nID0gcmV0LnBhcmVudCA9IHJldC5maXJzdENoaWxkID0gcmV0Lmxhc3RDaGlsZCA9IG51bGw7Ci0JCQlpZiAodGhpcy5maXJzdENoaWxkID09IG51bGwpCi0JCQkJcmV0dXJuIHJldDsKLQkJCVNHTUxOb2RlIGNoaWxkID0gcmV0LmZpcnN0Q2hpbGQgPSAoU0dNTE5vZGUpIHRoaXMuZmlyc3RDaGlsZAotCQkJCQkuY2xvbmVOb2RlKHRydWUpOwotCQkJY2hpbGQucGFyZW50ID0gcmV0OwotCQkJZm9yIChTR01MTm9kZSBzb3VyY2UgPSB0aGlzLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmc7IHNvdXJjZSAhPSBudWxsOyBzb3VyY2UgPSBzb3VyY2UubmV4dFNpYmxpbmcpIHsKLQkJCQljaGlsZC5uZXh0U2libGluZyA9IChTR01MTm9kZSkgc291cmNlLmNsb25lTm9kZSh0cnVlKTsKLQkJCQljaGlsZC5uZXh0U2libGluZy5wcmV2aW91c1NpYmxpbmcgPSBjaGlsZDsKLQkJCQljaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nOwotCQkJCWNoaWxkLnBhcmVudCA9IHJldDsKLQkJCX0KLQkJCXJldC5sYXN0Q2hpbGQgPSBjaGlsZDsKLQkJCXJldHVybiByZXQ7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gbmV3IE5vZGVMaXN0KCkgewotCQkJcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCQlTR01MTm9kZSByZXQgPSBmaXJzdENoaWxkOwotCQkJCXdoaWxlIChpbmRleCA+IDAgJiYgcmV0ICE9IG51bGwpIHsKLQkJCQkJcmV0ID0gcmV0Lm5leHRTaWJsaW5nOwotCQkJCQlpbmRleC0tOwotCQkJCX0KLQkJCQlyZXR1cm4gaW5kZXggPT0gMCA/IHJldCA6IG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJCWludCByZXQgPSAwOwotCQkJCWZvciAoU0dNTE5vZGUgY2hpbGQgPSBmaXJzdENoaWxkOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7Ci0JCQkJCXJldCsrOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmZpcnN0Q2hpbGQ7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkgewotCQlyZXR1cm4gdGhpcy5sYXN0Q2hpbGQ7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0UHJldmlvdXNTaWJsaW5nKCkgewotCQlyZXR1cm4gcHJldmlvdXNTaWJsaW5nOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkTm9kZXMoKSB7Ci0JCXJldHVybiBmaXJzdENoaWxkICE9IG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBub2RlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBTR01MRG9jdW1lbnRGcmFnbWVudAotCQkJCSYmIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpID09IHRoaXMuZ2V0T3duZXJEb2N1bWVudCgpKSB7Ci0JCQlTR01MRG9jdW1lbnRGcmFnbWVudCBmcmFnbWVudCA9IChTR01MRG9jdW1lbnRGcmFnbWVudCkgbm9kZTsKLQkJCWZvciAoU0dNTE5vZGUgY2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7Ci0JCQkJY2hpbGQucGFyZW50ID0gdGhpczsKLQkJCX0KLQkJCWlmIChmaXJzdENoaWxkID09IG51bGwpIHsKLQkJCQl0aGlzLmZpcnN0Q2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkOwotCQkJCXRoaXMubGFzdENoaWxkID0gZnJhZ21lbnQubGFzdENoaWxkOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmxhc3RDaGlsZC5uZXh0U2libGluZyA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7Ci0JCQkJZnJhZ21lbnQuZmlyc3RDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSB0aGlzLmxhc3RDaGlsZDsKLQkJCQl0aGlzLmxhc3RDaGlsZCA9IGZyYWdtZW50Lmxhc3RDaGlsZDsKLQkJCX0KLQkJCXJldHVybiBub2RlOwotCQl9Ci0JCWNoZWNrKG5vZGUpOwotCQlTR01MTm9kZSBzZ21sTm9kZSA9IChTR01MTm9kZSkgbm9kZTsKLQkJaWYgKHNnbWxOb2RlLnBhcmVudCAhPSBudWxsKSB7Ci0JCQlzZ21sTm9kZS5wYXJlbnQucmVtb3ZlQ2hpbGQoc2dtbE5vZGUpOwotCQl9Ci0JCXNnbWxOb2RlLnBhcmVudCA9IHRoaXM7Ci0JCWlmIChmaXJzdENoaWxkID09IG51bGwpIHsKLQkJCXRoaXMuZmlyc3RDaGlsZCA9IHRoaXMubGFzdENoaWxkID0gc2dtbE5vZGU7Ci0JCQlyZXR1cm4gbm9kZTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubGFzdENoaWxkLm5leHRTaWJsaW5nID0gc2dtbE5vZGU7Ci0JCQlzZ21sTm9kZS5wcmV2aW91c1NpYmxpbmcgPSB0aGlzLmxhc3RDaGlsZDsKLQkJCXRoaXMubGFzdENoaWxkID0gc2dtbE5vZGU7Ci0JCQlyZXR1cm4gbm9kZTsKLQkJfQotCX0KLQotCXB1YmxpYyBOb2RlIGluc2VydEJlZm9yZShOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZkNoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZkNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBhcHBlbmRDaGlsZChuZXdDaGlsZCk7Ci0JCX0KLQkJU0dNTE5vZGUgc2dtbFJlZkNoaWxkID0gKFNHTUxOb2RlKSByZWZDaGlsZDsKLQkJaWYgKHNnbWxSZWZDaGlsZC5wYXJlbnQgIT0gdGhpcykgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX0ZPVU5EX0VSUiwgIlRoZXJlIGlzbid0ICIKLQkJCQkJKyByZWZDaGlsZCArICIgYXMgYSBjaGlsZHJlbiIpIHsKLQkJCX07Ci0JCX0KLQkJaWYgKG5ld0NoaWxkIGluc3RhbmNlb2YgU0dNTERvY3VtZW50RnJhZ21lbnQKLQkJCQkmJiBuZXdDaGlsZC5nZXRPd25lckRvY3VtZW50KCkgPT0gdGhpcy5nZXRPd25lckRvY3VtZW50KCkpIHsKLQkJCVNHTUxEb2N1bWVudEZyYWdtZW50IGZyYWdtZW50ID0gKFNHTUxEb2N1bWVudEZyYWdtZW50KSBuZXdDaGlsZDsKLQkJCWZvciAoU0dNTE5vZGUgY2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7Ci0JCQkJY2hpbGQucGFyZW50ID0gdGhpczsKLQkJCX0KLQkJCWlmIChmaXJzdENoaWxkID09IHJlZkNoaWxkKSB7Ci0JCQkJdGhpcy5maXJzdENoaWxkLnByZXZpb3VzU2libGluZyA9IGZyYWdtZW50Lmxhc3RDaGlsZDsKLQkJCQlmcmFnbWVudC5sYXN0Q2hpbGQubmV4dFNpYmxpbmcgPSB0aGlzLmZpcnN0Q2hpbGQ7Ci0JCQkJdGhpcy5maXJzdENoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKLQkJCX0gZWxzZSB7Ci0JCQkJZnJhZ21lbnQuZmlyc3RDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSBzZ21sUmVmQ2hpbGQucHJldmlvdXNTaWJsaW5nOwotCQkJCWZyYWdtZW50Lmxhc3RDaGlsZC5uZXh0U2libGluZyA9IHNnbWxSZWZDaGlsZDsKLQkJCQlzZ21sUmVmQ2hpbGQucHJldmlvdXNTaWJsaW5nLm5leHRTaWJsaW5nID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKLQkJCQlzZ21sUmVmQ2hpbGQucHJldmlvdXNTaWJsaW5nID0gZnJhZ21lbnQubGFzdENoaWxkOwotCQkJfQotCQkJcmV0dXJuIG5ld0NoaWxkOwotCQl9Ci0JCWNoZWNrKG5ld0NoaWxkKTsKLQkJU0dNTE5vZGUgc2dtbE5ld0NoaWxkID0gKFNHTUxOb2RlKSBuZXdDaGlsZDsKLQkJaWYgKHNnbWxOZXdDaGlsZC5wYXJlbnQgIT0gbnVsbCkgewotCQkJc2dtbE5ld0NoaWxkLnBhcmVudC5yZW1vdmVDaGlsZChzZ21sTmV3Q2hpbGQpOwotCQl9Ci0KLQkJaWYgKHRoaXMuZmlyc3RDaGlsZCA9PSByZWZDaGlsZCkgewotCQkJdGhpcy5maXJzdENoaWxkLnByZXZpb3VzU2libGluZyA9IHNnbWxOZXdDaGlsZDsKLQkJCXNnbWxOZXdDaGlsZC5uZXh0U2libGluZyA9IHRoaXMuZmlyc3RDaGlsZDsKLQkJCXNnbWxOZXdDaGlsZC5wYXJlbnQgPSB0aGlzOwotCQkJdGhpcy5maXJzdENoaWxkID0gc2dtbE5ld0NoaWxkOwotCQl9IGVsc2UgewotCQkJc2dtbE5ld0NoaWxkLnByZXZpb3VzU2libGluZyA9IHNnbWxSZWZDaGlsZC5wcmV2aW91c1NpYmxpbmc7Ci0JCQlzZ21sTmV3Q2hpbGQubmV4dFNpYmxpbmcgPSBzZ21sUmVmQ2hpbGQ7Ci0JCQlzZ21sUmVmQ2hpbGQucHJldmlvdXNTaWJsaW5nLm5leHRTaWJsaW5nID0gc2dtbE5ld0NoaWxkOwotCQkJc2dtbFJlZkNoaWxkLnByZXZpb3VzU2libGluZyA9IHNnbWxOZXdDaGlsZDsKLQkJCXNnbWxOZXdDaGlsZC5wYXJlbnQgPSB0aGlzOwotCQl9Ci0JCXJldHVybiBuZXdDaGlsZDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSByZW1vdmVDaGlsZChOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJU0dNTE5vZGUgc2dtbE9sZENoaWxkOwotCQlpZiAoZmlyc3RDaGlsZCA9PSBudWxsIHx8ICEob2xkQ2hpbGQgaW5zdGFuY2VvZiBTR01MTm9kZSkKLQkJCQl8fCAoc2dtbE9sZENoaWxkID0gKFNHTUxOb2RlKSBvbGRDaGlsZCkucGFyZW50ICE9IHRoaXMpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsICJUaGVyZSBpc24ndCAiCi0JCQkJCSsgb2xkQ2hpbGQgKyAiIGFzIGEgY2hpbGRyZW4iKSB7Ci0JCQl9OwotCQl9Ci0JCWlmICh0aGlzLmZpcnN0Q2hpbGQgPT0gb2xkQ2hpbGQpIHsKLQkJCWlmICh0aGlzLmZpcnN0Q2hpbGQgPT0gdGhpcy5sYXN0Q2hpbGQpIHsKLQkJCQl0aGlzLmZpcnN0Q2hpbGQgPSB0aGlzLmxhc3RDaGlsZCA9IG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuZmlyc3RDaGlsZCA9IHNnbWxPbGRDaGlsZC5uZXh0U2libGluZzsKLQkJCQl0aGlzLmZpcnN0Q2hpbGQucHJldmlvdXNTaWJsaW5nID0gbnVsbDsKLQkJCX0KLQkJfSBlbHNlIGlmICh0aGlzLmxhc3RDaGlsZCA9PSBvbGRDaGlsZCkgewotCQkJdGhpcy5sYXN0Q2hpbGQgPSBzZ21sT2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nOwotCQkJdGhpcy5sYXN0Q2hpbGQubmV4dFNpYmxpbmcgPSBudWxsOwotCQl9IGVsc2UgewotCQkJc2dtbE9sZENoaWxkLm5leHRTaWJsaW5nLnByZXZpb3VzU2libGluZyA9IHNnbWxPbGRDaGlsZC5wcmV2aW91c1NpYmxpbmc7Ci0JCQlzZ21sT2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nLm5leHRTaWJsaW5nID0gc2dtbE9sZENoaWxkLm5leHRTaWJsaW5nOwotCQl9Ci0JCXNnbWxPbGRDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSBzZ21sT2xkQ2hpbGQubmV4dFNpYmxpbmcgPSBudWxsOwotCQlzZ21sT2xkQ2hpbGQucGFyZW50ID0gbnVsbDsKLQkJcmV0dXJuIG9sZENoaWxkOwotCX0KLQotCXB1YmxpYyBOb2RlIHJlcGxhY2VDaGlsZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJY2hlY2sobmV3Q2hpbGQpOwotCQlTR01MTm9kZSBzZ21sTmV3Q2hpbGQgPSAoU0dNTE5vZGUpIG5ld0NoaWxkOwotCQlTR01MTm9kZSBzZ21sT2xkQ2hpbGQgPSAoU0dNTE5vZGUpIG9sZENoaWxkOwotCQlpZiAoc2dtbE9sZENoaWxkLnBhcmVudCAhPSB0aGlzKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLCB0aGlzCi0JCQkJCSsgImRvZXNuJ3QgaGF2ZSAiICsgbmV3Q2hpbGQgKyAiIGFzIGEgY2hpbGQiKSB7Ci0JCQl9OwotCQl9Ci0KLQkJaWYgKHRoaXMuZmlyc3RDaGlsZCA9PSBvbGRDaGlsZCkgewotCQkJaWYgKHRoaXMuZmlyc3RDaGlsZCAhPSB0aGlzLmxhc3RDaGlsZCkgewotCQkJCXNnbWxOZXdDaGlsZC5uZXh0U2libGluZyA9IHRoaXMuZmlyc3RDaGlsZC5uZXh0U2libGluZzsKLQkJCQl0aGlzLmZpcnN0Q2hpbGQubmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nID0gc2dtbE5ld0NoaWxkOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmxhc3RDaGlsZCA9IHNnbWxOZXdDaGlsZDsKLQkJCX0KLQkJCXRoaXMuZmlyc3RDaGlsZCA9IHNnbWxOZXdDaGlsZDsKLQkJCXNnbWxPbGRDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSBzZ21sT2xkQ2hpbGQubmV4dFNpYmxpbmcgPSBudWxsOwotCQkJc2dtbE9sZENoaWxkLnBhcmVudCA9IG51bGw7Ci0JCQlzZ21sTmV3Q2hpbGQucGFyZW50ID0gdGhpczsKLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJfQotCQlpZiAodGhpcy5sYXN0Q2hpbGQgPT0gb2xkQ2hpbGQpIHsKLQkJCXRoaXMubGFzdENoaWxkLnByZXZpb3VzU2libGluZy5uZXh0U2libGluZyA9IHNnbWxOZXdDaGlsZDsKLQkJCXNnbWxOZXdDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSB0aGlzLmxhc3RDaGlsZC5wcmV2aW91c1NpYmxpbmc7Ci0JCQl0aGlzLmxhc3RDaGlsZCA9IHNnbWxOZXdDaGlsZDsKLQkJCXNnbWxPbGRDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSBudWxsOwotCQkJc2dtbE9sZENoaWxkLnBhcmVudCA9IG51bGw7Ci0JCQlzZ21sTmV3Q2hpbGQucGFyZW50ID0gdGhpczsKLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJfQotCQlzZ21sTmV3Q2hpbGQucHJldmlvdXNTaWJsaW5nID0gc2dtbE9sZENoaWxkLnByZXZpb3VzU2libGluZzsKLQkJc2dtbE5ld0NoaWxkLm5leHRTaWJsaW5nID0gc2dtbE9sZENoaWxkLm5leHRTaWJsaW5nOwotCQlzZ21sT2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nLm5leHRTaWJsaW5nID0gc2dtbE5ld0NoaWxkOwotCQlzZ21sT2xkQ2hpbGQubmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nID0gc2dtbE5ld0NoaWxkOwotCQlzZ21sT2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nID0gc2dtbE9sZENoaWxkLm5leHRTaWJsaW5nID0gbnVsbDsKLQkJc2dtbE9sZENoaWxkLnBhcmVudCA9IG51bGw7Ci0JCXNnbWxOZXdDaGlsZC5wYXJlbnQgPSB0aGlzOwotCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JfQotCi0JLy8gRE9NIExldmVsIDIKLQotCXB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpIHsKLQkJZm9yIChTR01MTm9kZSBuID0gdGhpcy5maXJzdENoaWxkOyBuICE9IG51bGw7KSB7Ci0JCQlpZiAobi5nZXROb2RlVHlwZSgpID09IFRFWFRfTk9ERSkgewotCQkJCWlmIChuLm5leHRTaWJsaW5nICE9IG51bGwKLQkJCQkJCSYmIG4ubmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBURVhUX05PREUpIHsKLQkJCQkJKChUZXh0KSBuKS5hcHBlbmREYXRhKCgoVGV4dCkgbi5uZXh0U2libGluZykuZ2V0RGF0YSgpKTsKLQkJCQkJcmVtb3ZlQ2hpbGQobi5uZXh0U2libGluZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbiA9IG4ubmV4dFNpYmxpbmc7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQluLm5vcm1hbGl6ZSgpOwotCQkJCW4gPSBuLm5leHRTaWJsaW5nOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTFBhcnNlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWViNTMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JRXJyb3JMb2dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JUGFyc2VyRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLklTR01MQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuSVNHTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5lcnJvcmhhbmRsZXIuQXR0cmlidXRlVmFsdWVFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5lcnJvcmhhbmRsZXIuRGVmYXVsdEVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLmVycm9yaGFuZGxlci5JVG9rZW5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5tb2RlbGdyb3VwLklNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwubW9kZWxncm91cC5BbmRNb2RlbEdyb3VwLkFuZENvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi0KLS8qKgotICogUHVyZSBTR01MIHBhcnNlci4gQmFzZSBjbGFzcyBvZiBhIHBhcnNlciB3aGljaCBwYXJzZXMgYSBTR01MIGRlcml2ZWQgbWFya3VwCi0gKiBsYW5ndWFnZS4gTGFuZ3VhZ2UtZGVwZW5kZW50IGN1c3RvbWl6YXRpb24gaGF2ZSB0byBiZSBwcm92aWRlZCBieSBhIHN1YmNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU0dNTFBhcnNlciBpbXBsZW1lbnRzIElTR01MQ29uc3RhbnRzLCBJU0dNTFBhcnNlciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNYSFRNTCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHlFbGVtZW50ID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc0VuZFdpdGhTbGFzaCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudFRhZ05hbWUgPSAiIjsKLQotCXByaXZhdGUgRE9NSW1wbGVtZW50YXRpb24gZG9tSW1wbDsKLQotCXByaXZhdGUgc3RhdGljIENsYXNzIGNyZWF0ZURvY3VtZW50TWV0aG9kUGFyYW1UeXBlc1tdID0geyBTdHJpbmcuY2xhc3MsCi0JCQlTdHJpbmcuY2xhc3MsIERvY3VtZW50VHlwZS5jbGFzcyB9OwotCi0JLyoqCi0JICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiBmYWlsZWQuCi0JICovCi0JcHVibGljIERPTUltcGxlbWVudGF0aW9uIHNldERPTUltcGxlbWVudGF0aW9uKERPTUltcGxlbWVudGF0aW9uIGRvbUltcGwpIHsKLQkJQ2xhc3MgZG9tSW1wbGVJbnRlcmZhY2UgPSBET01JbXBsZW1lbnRhdGlvbi5jbGFzczsKLQkJdHJ5IHsKLQkJCWphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBjcmVhdGVEb2N1bWVudE1ldGhvZCA9IGRvbUltcGxlSW50ZXJmYWNlCi0JCQkJCS5nZXRNZXRob2QoImNyZWF0ZURvY3VtZW50IiwgY3JlYXRlRG9jdW1lbnRNZXRob2RQYXJhbVR5cGVzKTsKLQkJCWlmIChjcmVhdGVEb2N1bWVudE1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5kb21JbXBsID0gZG9tSW1wbDsKLQkJCQlkb2MgPSBudWxsOwotCQkJCXJldHVybiBkb21JbXBsOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gQSBET01JbXBsZW1lbnRhdGlvbiBpbnN0YWNlIHRoaXMgcGFyc2VyIHVzZXJzLgotCSAqLwotCXB1YmxpYyBET01JbXBsZW1lbnRhdGlvbiBnZXRET01JbXBsZW1lbnRhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZG9tSW1wbDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIHRoaXMgaW5zdGFuY2UgYW5kIHtAbGluayBEZWZhdWx0RXJyb3JIYW5kbGVyfWluc3RhbmNlIGlzCi0JICogYWRkZWQuCi0JICovCi0JcHVibGljIFNHTUxQYXJzZXIoKSB7Ci0JCWFkZEVycm9ySGFuZGxlcihuZXcgRGVmYXVsdEVycm9ySGFuZGxlcigpKTsKLQkJYWRkVG9rZW5FcnJvckhhbmRsZXIobmV3IEF0dHJpYnV0ZVZhbHVlRXJyb3JIYW5kbGVyKCkpOwotCQlzZXRET01JbXBsZW1lbnRhdGlvbihTR01MRE9NSW1wbC5nZXRET01JbXBsZW1lbnRhdGlvbigpKTsKLQkJaWYgKGdldERPTUltcGxlbWVudGF0aW9uKCkgPT0gbnVsbCkgewotCQkJc2V0RG9jdW1lbnQobmV3IFNHTUxEb2N1bWVudCgpKTsKLQkJfQotCQlhbm9ueW1vdXNFbGVtZW50RGVmID0gbmV3IEVsZW1lbnREZWZpbml0aW9uKCJBTk9OWU1PVVMiLCBhbnkpOwotCX0KLQotCXB1YmxpYyBJRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcnNbXSA9IG5ldyBJRXJyb3JIYW5kbGVyWzhdOwotCi0JcHJpdmF0ZSBJVG9rZW5FcnJvckhhbmRsZXIgdG9rZW5FcnJvckhhbmRsZXJzW10gPSBuZXcgSVRva2VuRXJyb3JIYW5kbGVyWzhdOwotCi0JcHVibGljIGludCBlcnJvckhhbmRsZXJOdW0gPSAwOwotCi0JcHJpdmF0ZSBpbnQgdG9rZW5FcnJvckhhbmRsZXJOdW0gPSAwOwotCi0JLyoqCi0JICogU2V0cyBhbiBlcnJvciBoYW5kbGVyIHRoYXQgcmVjb3ZlcnMgZXJyb3IuCi0JICogCi0JICogQHBhcmFtIGVycm9ySGFuZGxlcgotCSAqIEBkZXByZWNhdGVkIHtAbGluayAjYWRkRXJyb3JIYW5kbGVyKG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSUVycm9ySGFuZGxlcil9Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JIYW5kbGVyKElFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyKSB7Ci0JCWFkZEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYW4gRXJyb3JIYW5kbGVyIGluc3RhbmNlLiBBbiBlcnJvckhhbmRsZXIgYWRkZWQgbGF0ZXIgaXMgaW52b2tlZAotCSAqIGVhcmxpZXIgYnkgdGhpcyBwYXJzZXIgaW5zdGFuY2UgdGhhbiBlcnJvckhhbmRsZXJzIGFkZGVkIGVhcmxpZXIuIElmIG9uZQotCSAqIGVycm9ySGFuZGxlciBoYW5kbGVzIGVycm9yIChlZy4gcmV0dXJucyA8Y29kZT4KLQkgKiB0cnVlPC9jb2RlPiksIG5vIG1vcmUKLQkgKiBlcnJvckhhbmRsZXJzIGFyZSBpbnZva2VkLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvckhhbmRsZXIKLQkgKiAgICAgICAgICAgIGVycm9ySGFuZGxlciBpbnN0YW5jZSB0byBiZSBhZGRlZCB0byB0aGlzIHBhcnNlcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVycm9ySGFuZGxlcihJRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgewotCQlpZiAoZXJyb3JIYW5kbGVyTnVtID09IGVycm9ySGFuZGxlcnMubGVuZ3RoKSB7Ci0JCQlJRXJyb3JIYW5kbGVyIG5ld0Vycm9ySGFuZGxlcnNbXSA9IG5ldyBJRXJyb3JIYW5kbGVyW2Vycm9ySGFuZGxlcnMubGVuZ3RoICogMl07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVycm9ySGFuZGxlck51bTsgaSsrKSB7Ci0JCQkJbmV3RXJyb3JIYW5kbGVyc1tpXSA9IGVycm9ySGFuZGxlcnNbaV07Ci0JCQl9Ci0JCQllcnJvckhhbmRsZXJzID0gbmV3RXJyb3JIYW5kbGVyczsKLQkJfQotCQl0aGlzLmVycm9ySGFuZGxlcnNbZXJyb3JIYW5kbGVyTnVtKytdID0gZXJyb3JIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYW4gRXJyb3JIYW5kbGVyIGluc3RhbmNlLiBBbiBlcnJvckhhbmRsZXIgYWRkZWQgbGF0ZXIgaXMgaW52b2tlZAotCSAqIGVhcmxpZXIgYnkgdGhpcyBwYXJzZXIgaW5zdGFuY2UgdGhhbiBlcnJvckhhbmRsZXJzIGFkZGVkIGVhcmxpZXIuIElmIG9uZQotCSAqIGVycm9ySGFuZGxlciBoYW5kbGVzIGVycm9yIChlZy4gcmV0dXJucyA8Y29kZT4KLQkgKiB0cnVlPC9jb2RlPiksIG5vIG1vcmUKLQkgKiBlcnJvckhhbmRsZXJzIGFyZSBpbnZva2VkLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvckhhbmRsZXIKLQkgKiAgICAgICAgICAgIGVycm9ySGFuZGxlciBpbnN0YW5jZSB0byBiZSBhZGRlZCB0byB0aGlzIHBhcnNlcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRva2VuRXJyb3JIYW5kbGVyKElUb2tlbkVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKLQkJaWYgKHRva2VuRXJyb3JIYW5kbGVyTnVtID09IHRva2VuRXJyb3JIYW5kbGVycy5sZW5ndGgpIHsKLQkJCUlUb2tlbkVycm9ySGFuZGxlciBuZXdFcnJvckhhbmRsZXJzW10gPSBuZXcgSVRva2VuRXJyb3JIYW5kbGVyW2Vycm9ySGFuZGxlcnMubGVuZ3RoICogMl07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2VuRXJyb3JIYW5kbGVyTnVtOyBpKyspIHsKLQkJCQluZXdFcnJvckhhbmRsZXJzW2ldID0gdG9rZW5FcnJvckhhbmRsZXJzW2ldOwotCQkJfQotCQkJdG9rZW5FcnJvckhhbmRsZXJzID0gbmV3RXJyb3JIYW5kbGVyczsKLQkJfQotCQl0aGlzLnRva2VuRXJyb3JIYW5kbGVyc1t0b2tlbkVycm9ySGFuZGxlck51bSsrXSA9IGVycm9ySGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIG5vZGUtbGV2ZWwgZXJyb3IgaGFuZGxlcnMgaW5jbHVkZWQgaW4gdGhpcyBwYXJzZXIKLQkgKiAKLQkgKiBAcmV0dXJuIGVycm9yIGhhbmRsZXJzCi0JICovCi0JcHVibGljIElFcnJvckhhbmRsZXJbXSBnZXRFcnJvckhhbmRsZXJzKCkgewotCQlJRXJyb3JIYW5kbGVyIHJldFtdID0gbmV3IElFcnJvckhhbmRsZXJbZXJyb3JIYW5kbGVyTnVtXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvckhhbmRsZXJOdW07IGkrKykgewotCQkJcmV0W2ldID0gZXJyb3JIYW5kbGVyc1tpXTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdG9rZW4tbGV2ZWwgZXJyb3IgaGFuZGxlcnMgaW5jbHVkZWQgaW4gdGhpcyBwYXJzZXIuCi0JICovCi0JcHVibGljIElUb2tlbkVycm9ySGFuZGxlcltdIGdldFRva2VuRXJyb3JIYW5kbGVycygpIHsKLQkJSVRva2VuRXJyb3JIYW5kbGVyIHJldFtdID0gbmV3IElUb2tlbkVycm9ySGFuZGxlcltlcnJvckhhbmRsZXJOdW1dOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2VuRXJyb3JIYW5kbGVyTnVtOyBpKyspIHsKLQkJCXJldFtpXSA9IHRva2VuRXJyb3JIYW5kbGVyc1tpXTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBub2RlLWxldmVsIGVycm9yIGhhbmRsZXIuCi0JICogCi0JICogQHBhcmFtIGVycm9ySGFuZGxlcgotCSAqICAgICAgICAgICAgZXJyb3IgaGFuZGxlciB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFcnJvckhhbmRsZXIoSUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvckhhbmRsZXJOdW07IGkrKykgewotCQkJaWYgKGVycm9ySGFuZGxlcnNbaV0gPT0gZXJyb3JIYW5kbGVyKSB7Ci0JCQkJZXJyb3JIYW5kbGVyc1tpXSA9IG51bGw7Ci0JCQkJZm9yIChpKys7IGkgPCBlcnJvckhhbmRsZXJOdW07IGkrKykgewotCQkJCQllcnJvckhhbmRsZXJzW2kgLSAxXSA9IGVycm9ySGFuZGxlcnNbaV07Ci0JCQkJfQotCQkJCWVycm9ySGFuZGxlck51bS0tOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSB0b2tlbi1sZXZlbCBlcnJvciBoYW5kbGVyLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvckhhbmRsZXIKLQkgKiAgICAgICAgICAgIGVycm9yIGhhbmRsZXIgdG8gcmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVG9rZW5FcnJvckhhbmRsZXIoSVRva2VuRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2VuRXJyb3JIYW5kbGVyTnVtOyBpKyspIHsKLQkJCWlmICh0b2tlbkVycm9ySGFuZGxlcnNbaV0gPT0gZXJyb3JIYW5kbGVyKSB7Ci0JCQkJdG9rZW5FcnJvckhhbmRsZXJzW2ldID0gbnVsbDsKLQkJCQlmb3IgKGkrKzsgaSA8IHRva2VuRXJyb3JIYW5kbGVyTnVtOyBpKyspIHsKLQkJCQkJdG9rZW5FcnJvckhhbmRsZXJzW2kgLSAxXSA9IHRva2VuRXJyb3JIYW5kbGVyc1tpXTsKLQkJCQl9Ci0JCQkJZXJyb3JIYW5kbGVyTnVtLS07Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyB2YXJpYWJsZSBpcyBmb3IgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBfREVCVUcgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBleHRyYWN0TnVtID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBleHRyYWN0Q2hhciA9IHRydWU7Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoaXMgcGFyc2VyIGV4dHJhY3RzIGJvdGggY2hhcmFjdGVyIGFuZCBudW1iZXIgZW50aXRpZXMgb3IKLQkgKiBub3QuIERlZmF1bHQgdmFsdWUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdEVudGl0eShib29sZWFuIGIpIHsKLQkJdGhpcy5leHRyYWN0Q2hhciA9IHRoaXMuZXh0cmFjdE51bSA9IGI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBpZiBpdCBwYXJzZXMgYW5kIGV4dHJhY3RzIG51bWJlciBlbnRpdGllcyBvciBub3QuIEJ5IGRlZmF1bHQsIGl0Ci0JICogcGFyc2VzIGFuZCBudW1iZXIgY2hhcmFjdGVyIGVudGl0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICBpZiB0cnVlLCBleHRyYWN0cyBudW1iZXIgZW50aXRpZXMuCi0JICovCi0JcHVibGljIHZvaWQgZXh0cmFjdE51bUVudGl0eShib29sZWFuIGIpIHsKLQkJdGhpcy5leHRyYWN0TnVtID0gYjsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgaXQgcGFyc2VzIGFuZCBleHRyYWN0cyBudW1iZXIgZW50aXRpZXMgb3Igbm90LiBCeSBkZWZhdWx0LCBpdAotCSAqIHBhcnNlcyBhbmQgZXh0cmFjdHMgbnVtYmVyIGVudGl0aWVzLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBleHRyYWN0cyBudW1iZXIgZW50aXRpZXMuIE90aGVyd2lzZSBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4dHJhY3ROdW1FbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLmV4dHJhY3ROdW07Ci0JfQotCi0JLyoqCi0JICogU2V0cyBpZiBpdCBwYXJzZXMgYW5kIGV4dHJhY3RzIGNoYXJhY3RlciBlbnRpdGllcyBvciBub3QuIEJ5IGRlZmF1bHQsIGl0Ci0JICogcGFyc2VzIGFuZCBleHRyYWN0cyBjaGFyYWN0ZXIgZW50aXRpZXMuCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIGV4dHJhY3RzIGNoYXJhY3RlciBlbnRpdGllcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleHRyYWN0Q2hhckVudGl0eShib29sZWFuIGIpIHsKLQkJdGhpcy5leHRyYWN0Q2hhciA9IGI7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGl0IHBhcnNlcyBhbmQgZXh0cmFjdHMgY2hhcmFjdGVyIGVudGl0aWVzIG9yIG5vdC4gQnkgZGVmYXVsdCwKLQkgKiBpdCBwYXJzZXMgYW5kIGV4dHJhY3RzIGNoYXJhY3RlciBlbnRpdGllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgZXh0cmFjdHMgY2hhcmFjdGVyIGVudGl0aWVzLiBPdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHRyYWN0Q2hhckVudGl0eSgpIHsKLQkJcmV0dXJuIGV4dHJhY3RDaGFyOwotCX0KLQotCXB1YmxpYyBJbnNUb2tlbml6ZXIgdG9rZW5pemVyOwotCi0JcHJpdmF0ZSBEb2N1bWVudCBkb2MgPSBudWxsOwotCi0JLyoqCi0JICogUHVibGljIGVudGl0aWVzIGFyZSBzdG9yZWQgaW4gdGhpcyB2YXJpYWJsZS4gS2V5cyBhcmUgaWQgYW5kIHZhbHVlcyBhcmUKLQkgKiBmaWxlIG5hbWUuIEJvdGggYXJlIGluc3RhbmNlcyBvZiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPi4gRm9yCi0JICogZXhhbXBsZSwgZm9yIHRoZSBrZXkgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iLCB0aGUgdmFsdWUKLQkgKiBpcyAibG9vc2UuZHRkIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBwdWJFbnRpdHlNYXAgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOwotCi0JLyoqCi0JICogR2V0cyBwdWJsaWMgZW50aXR5IG1hcC4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2h0YWJsZSBpbnN0YW5jZSB3aG9zZSBrZXlzIGFyZSBwdWJsaWMgaWQgYW5kIHZhbHVlcyBhcmUgZmlsZQotCSAqICAgICAgICAgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gZ2V0UHVibGljRW50aXR5TWFwKCkgewotCQlyZXR1cm4gcHViRW50aXR5TWFwOwotCX0KLQotCS8qKgotCSAqIFRvcCBlbGVtZW50J3MgRWxlbWVudERlZmluaXRpb24uCi0JICovCi0JcHVibGljIEVsZW1lbnREZWZpbml0aW9uIGxhc3REZWYgPSBudWxsOwotCi0Jc3RhdGljIElNb2RlbEdyb3VwIHBjZGF0YSA9IG5ldyBJTW9kZWxHcm91cCgpIHsKLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goSVNHTUxQYXJzZXIgcGFyc2VyLCBOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkgewotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgVGV4dCAmJiAhKGNoaWxkIGluc3RhbmNlb2YgQ0RBVEFTZWN0aW9uKSkgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVmZXIoYm9vbGVhbiBpbmZpbml0ZSkgewotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiI1BDREFUQSI7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChpbnQgbnVtYmVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuW10gcmVoYXNoKGludCB0b3RhbFNpemUpIHsKLQkJCWJvb2xlYW4gcmV0W10gPSBuZXcgYm9vbGVhblt0b3RhbFNpemVdOwotCQkJcmV0W3RvdGFsU2l6ZSAtIDJdID0gdHJ1ZTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9OwotCi0Jc3RhdGljIElNb2RlbEdyb3VwIGNkYXRhID0gbmV3IElNb2RlbEdyb3VwKCkgewotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChJU0dNTFBhcnNlciBwYXJzZXIsIE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDREFUQVNlY3Rpb24pIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBvcHRpb25hbCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZmVyKGJvb2xlYW4gaW5maW5pdGUpIHsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkNEQVRBIjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKGludCBudW1iZXIpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuW10gcmVoYXNoKGludCB0b3RhbFNpemUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotCXN0YXRpYyBJTW9kZWxHcm91cCBlbXB0eSA9IG5ldyBJTW9kZWxHcm91cCgpIHsKLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goSVNHTUxQYXJzZXIgcGFyc2VyLCBOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gb3B0aW9uYWwoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZmVyKGJvb2xlYW4gaW5maW5pdGUpIHsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkVNUFRZIjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKGludCBudW1iZXIpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuW10gcmVoYXNoKGludCB0b3RhbFNpemUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotCXN0YXRpYyBJTW9kZWxHcm91cCBhbnkgPSBuZXcgSU1vZGVsR3JvdXAoKSB7Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKElTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJCXBhcmVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWZlcihib29sZWFuIGluZmluaXRlKSB7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChpbnQgbnVtYmVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuW10gcmVoYXNoKGludCB0b3RhbFNpemUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBFbGVtZW50RGVmaW5pdGlvbiBhbm9ueW1vdXNFbGVtZW50RGVmOwotCi0JLyoqCi0JICogR2V0cyBhIGVsZW1lbnQgZGVmaW5pdGlvbiBmb3IgdW5kZWZpbmVkIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGVmaW5pdGlvbiBnZXRBbm9ueW1vdXNFbGVtZW50RGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGFub255bW91c0VsZW1lbnREZWY7Ci0JfQotCi0JcHVibGljIFNHTUxEb2NUeXBlRGVmIGR0ZDsKLQotCS8qKgotCSAqIEdldHMgRFREIHRoYXQgZGVmaW5lcyB0aGlzIERvY3VtZW50J3Mgc3ludGF4LgotCSAqIAotCSAqIEByZXR1cm4gRFREIHRoYXQgZGVmaW5lcyB0aGlzIERvY3VtZW50J3Mgc3ludGF4LgotCSAqLwotCXB1YmxpYyBTR01MRG9jVHlwZURlZiBnZXREVEQoKSB7Ci0JCXJldHVybiB0aGlzLmR0ZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIERURCB0aGF0IGRlZmluZXMgdGhpcyBEb2N1bWVudCdzIHN5bnRheC4KLQkgKiAKLQkgKiBAcGFyYW0gZHRkCi0JICogICAgICAgICAgICBEVEQgdGhhdCBkZWZpbmVzIHRoaXMgRG9jdW1lbnQncyBzeW50YXguCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0RFREKFNHTUxEb2NUeXBlRGVmIGR0ZCkgewotCQl0aGlzLmR0ZCA9IGR0ZDsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIFNHTUxEb2N1bWVudCkgewotCQkJKChTR01MRG9jdW1lbnQpIGRvYykuc2V0RFREKGR0ZCk7Ci0JCX0KLQotCQlpc1hIVE1MID0gKGR0ZC50b1N0cmluZygpLmluZGV4T2YoIlhIVE1MIikgPiAtMSk7Ci0KLQl9Ci0KLQlwdWJsaWMgSGFzaHRhYmxlPE5vZGUsIEFuZENvbnRleHQ+IGFuZE1hcCA9IG5ldyBIYXNodGFibGU8Tm9kZSwgQW5kQ29udGV4dD4oKTsKLQotCXB1YmxpYyBIYXNodGFibGU8Tm9kZSwgQW5kQ29udGV4dD4gZ2V0QW5kTWFwKCkgewotCQlyZXR1cm4gYW5kTWFwOwotCX0KLQotCXB1YmxpYyBIYXNodGFibGU8Tm9kZSwgSW50ZWdlcj4gc2VxTWFwID0gbmV3IEhhc2h0YWJsZTxOb2RlLCBJbnRlZ2VyPigpOwotCi0JcHVibGljIEhhc2h0YWJsZTxOb2RlLCBJbnRlZ2VyPiBnZXRTZXFNYXAoKSB7Ci0JCXJldHVybiBzZXFNYXA7Ci0JfQotCi0JcHVibGljIEhhc2h0YWJsZTxOb2RlLCBOb2RlPiBwbHVzTWFwID0gbmV3IEhhc2h0YWJsZTxOb2RlLCBOb2RlPigpOwotCi0JcHVibGljIEhhc2h0YWJsZTxOb2RlLCBOb2RlPiBnZXRQbHVzTWFwKCkgewotCQlyZXR1cm4gcGx1c01hcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckNvbnRleHRNYXAoTm9kZSBwYXJlbnQpIHsKLQkJYW5kTWFwLnJlbW92ZShwYXJlbnQpOwotCQlzZXFNYXAucmVtb3ZlKHBhcmVudCk7Ci0JCXBsdXNNYXAucmVtb3ZlKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBdHRyIGF0dHJpYnV0ZShFbGVtZW50RGVmaW5pdGlvbiBlZCwgQXR0cmlidXRlTGlzdEltcGwgYXR0cmxpc3QpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlBdHRyIHJldCA9IG51bGw7Ci0JCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gTkFNRV9DSEFSKSB7Ci0JCQlpZiAoaGFuZGxlRXJyb3IoSVBhcnNlckVycm9yLlRBR19OQU1FLCB0b2tlbml6ZXIuc3ZhbCkpIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlKGVkLCBhdHRybGlzdCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgYXR0TmFtZSA9IGNoYW5nZUF0dHJOYW1lQ2FzZSh0b2tlbml6ZXIuc3ZhbCk7Ci0JCQlBdHRyaWJ1dGVEZWZpbml0aW9uIGFkID0gZWQgIT0gbnVsbCA/IGVkLmdldEF0dHJpYnV0ZURlZihhdHROYW1lKQotCQkJCQk6IG51bGw7Ci0JCQlTdHJpbmcgYXR0VmFsdWUgPSBhdHROYW1lOwotCQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSBFUSkgewotCQkJCWF0dFZhbHVlID0gdG9rZW5pemVyLnJlYWRBdHRyaWJ1dGVWYWx1ZShhZCwgZWQpOwotCQkJCXJldCA9IGRvYy5jcmVhdGVBdHRyaWJ1dGUoYXR0TmFtZSk7Ci0JCQkJcmV0LnNldFZhbHVlKGF0dFZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQkJcmV0ID0gZG9jLmNyZWF0ZUF0dHJpYnV0ZShhdHROYW1lKTsKLQkJCX0KLQkJCWlmIChhZCA9PSBudWxsKSB7Ci0JCQkJaWYgKGF0dHJsaXN0ICE9IG51bGwpIHsKLQkJCQkJYXR0cmxpc3QuYWRkQXR0cmlidXRlKGF0dE5hbWUsICJDREFUQSIsIGF0dFZhbHVlKTsKLQkJCQl9Ci0JCQkJaWYgKGVkICE9IG51bGwgJiYgZWQgIT0gYW5vbnltb3VzRWxlbWVudERlZikgewotCQkJCQlpZiAoaGFuZGxlRXJyb3IoSVBhcnNlckVycm9yLklMTEVHQUxfQVRUUklCVVRFLCByZXQpKSB7Ci0JCQkJCQlyZXQgPSBhdHRyaWJ1dGUoZWQsIGF0dHJsaXN0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVycm9yKElQYXJzZXJFcnJvci5JTExFR0FMX0FUVFJJQlVURSwgIklsbGVnYWwgYXR0cmlidXRlICciCi0JCQkJCQkJCSsgYXR0TmFtZSArICInIGZvciAiICsgZWQuZ2V0TmFtZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoYXR0cmxpc3QgIT0gbnVsbCkgewotCQkJCWF0dHJsaXN0LmFkZEF0dHJpYnV0ZShhdHROYW1lLCBhZC5nZXREZWNsYXJlZFR5cGVTdHIoKSwKLQkJCQkJCWF0dFZhbHVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIFJlY29yZHMgYW4gZXJyb3IuIERvZXMgbm90aGluZyBieSBkZWZhdWx0LiBJZiBpdCBoYXMgRXJyb3JMb2dMaXN0ZW5lcgotCSAqIGluc3RhbmNlcywgY2FsbHMgdGhlaXIge0BsaW5rIElFcnJvckxvZ0xpc3RlbmVyI2Vycm9yTG9nKGludCxTdHJpbmcpfQotCSAqIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29kZQotCSAqICAgICAgICAgICAgZXJyb3IgY29kZS4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBtZXNzYWdlIG9mIHRoZSBlcnJvci4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBlcnJvcihpbnQgY29kZSwgU3RyaW5nIG1zZykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGVycm9yTG9nTGlzdGVuZXJOdW07IGkrKykgewotCQkJaWYgKHRva2VuaXplciAhPSBudWxsKSB7Ci0JCQkJZXJyb3JMb2dMaXN0ZW5lcnNbaV0uZXJyb3JMb2coY29kZSwgdG9rZW5pemVyLmdldEN1cnJlbnRMaW5lKCkKLQkJCQkJCSsgIjogIiArIG1zZyk7Ci0JCQl9IGVsc2UgewotCQkJCWVycm9yTG9nTGlzdGVuZXJzW2ldLmVycm9yTG9nKGNvZGUsIG1zZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUVycm9yTG9nTGlzdGVuZXIgZXJyb3JMb2dMaXN0ZW5lcnNbXSA9IG5ldyBJRXJyb3JMb2dMaXN0ZW5lcls4XTsKLQotCXB1YmxpYyBpbnQgZXJyb3JMb2dMaXN0ZW5lck51bSA9IDA7Ci0KLQkvKioKLQkgKiBBZGRzIGFuIGVycm9yIGxvZyBsaXN0ZXJuZXIuIExpc3RlbmVyIGlzIGludm9rZWQgd2hlbiBlcnJvciBpcyBvY2N1cmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVycm9yTG9nTGlzdGVuZXIoSUVycm9yTG9nTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVycm9yTG9nTGlzdGVuZXJOdW0gPT0gZXJyb3JMb2dMaXN0ZW5lcnMubGVuZ3RoKSB7Ci0JCQlJRXJyb3JMb2dMaXN0ZW5lciBuZXdMaXN0ZW5lcnNbXSA9IG5ldyBJRXJyb3JMb2dMaXN0ZW5lcltlcnJvckxvZ0xpc3RlbmVyTnVtICogMl07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVycm9yTG9nTGlzdGVuZXJOdW07IGkrKykgewotCQkJCW5ld0xpc3RlbmVyc1tpXSA9IGVycm9yTG9nTGlzdGVuZXJzW2ldOwotCQkJfQotCQkJZXJyb3JMb2dMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCX0KLQkJZXJyb3JMb2dMaXN0ZW5lcnNbZXJyb3JMb2dMaXN0ZW5lck51bSsrXSA9IGxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW4gZXJyb3IgbG9nIGxpc3RlbmVyLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZXIKLQkgKiAgICAgICAgICAgIGVycm9yIGxvZyBsaXN0ZW5lciB0byByZW1vdmUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRXJyb3JMb2dMaXN0ZW5lcihJRXJyb3JMb2dMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGVycm9yTG9nTGlzdGVuZXJOdW07IGkrKykgewotCQkJaWYgKGVycm9yTG9nTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7Ci0JCQkJZXJyb3JMb2dMaXN0ZW5lcnNbaV0gPSBudWxsOwotCQkJCWZvciAoaSsrOyBpIDwgZXJyb3JMb2dMaXN0ZW5lck51bTsgaSsrKSB7Ci0JCQkJCWVycm9yTG9nTGlzdGVuZXJzW2kgLSAxXSA9IGVycm9yTG9nTGlzdGVuZXJzW2ldOwotCQkJCX0KLQkJCQllcnJvckxvZ0xpc3RlbmVyTnVtLS07Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBFbmRUYWcgZXRhZygpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0YWdOYW1lOwotCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpID09IE5BTUVfQ0hBUikgewotCQkJdGFnTmFtZSA9IGNoYW5nZVRhZ0Nhc2UodG9rZW5pemVyLnN2YWwpOwotCQkJd2hpbGUgKHRva2VuaXplci5uZXh0VG9rZW4oKSAhPSBUQUdDICYmIHRva2VuaXplci50dHlwZSAhPSBFT0YpIHsKLQkJCX0KLQkJCTsKLQotCQkJRW5kVGFnIGV0ID0gbmV3IEVuZFRhZyh0YWdOYW1lKTsKLQkJCWN1cnJlbnROb2RlID0gZXQ7Ci0JCQlpZiAoZG9jSGFuZGxlciAhPSBudWxsICYmICFlSGFuZGxlTG9naWNhbCkgewotCQkJCWRvY0hhbmRsZXIuZW5kRWxlbWVudCh0YWdOYW1lKTsKLQkJCX0KLQkJCUVsZW1lbnREZWZpbml0aW9uIGVkID0gZHRkLmdldEVsZW1lbnREZWZpbml0aW9uKHRhZ05hbWUpOwotCi0JCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCWxhc3RFbGVtZW50TnVtYmVyID0gZWQubnVtYmVyOwotCQkJCXJldHVybiBldDsKLQkJCX0gZWxzZSBpZiAoa2VlcFVua25vd25zKSB7Ci0JCQkJbGFzdEVsZW1lbnREZWYgPSBhbm9ueW1vdXNFbGVtZW50RGVmOwotCQkJCWxhc3RFbGVtZW50TnVtYmVyID0gcGNkYXRhTnVtYmVyICsgMTsKLQkJCQlyZXR1cm4gZXQ7Ci0JCQl9IGVsc2UgaWYgKGhhbmRsZUVycm9yKElQYXJzZXJFcnJvci5VTktOT1dOX0VMRU1FTlQsIGV0KSkgewotCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uc2dtbC5pbXBsLklTR01MUGFyc2VyI2dldERvY3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JLyoqCi0JICogcHVzaCBiYWNrIGJ1ZmZlciBzaXplCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRl9TSVogPSAyNTY7Ci0KLQlwdWJsaWMgaW50IGJ1ZkNvdW50ID0gMDsKLQotCXB1YmxpYyBOb2RlIGJ1ZltdID0gbmV3IE5vZGVbQlVGX1NJWl07Ci0KLQkvKioKLQkgKiBHZXRzIGEgTm9kZSBvciB7QGxpbmsgRW5kVGFnfWZyb20gYSBjdXJyZW50bHkgcmVhZGluZyBzdHJlYW0gYXMgYSByZXN1bHQKLQkgKiBvZiB0b2tlbml6aW5nLgotCSAqIAotCSAqIEByZXR1cm4ge0BsaW5rIG9yZy53M2MuZG9tLk5vZGUgTm9kZX1vciB7QGxpbmsgRW5kVGFnfQotCSAqIEBleGNlcHRpb24gUGFyc2VFeGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogQHNlZSAjcHVzaEJhY2tOb2RlKG9yZy53M2MuZG9tLk5vZGUpCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChidWZDb3VudCA9PSAwKSB7Ci0JCQlyZXR1cm4gbm9kZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGJ1ZlstLWJ1ZkNvdW50XTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFB1c2hlcyBiYWNrIGEgbm9kZSB0byB0aGlzIHBhcnNlci4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgbm9kZSB0byBiZSBwdXNoZWQgYmFjay4KLQkgKiBAc2VlICNnZXROb2RlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXNoQmFja05vZGUoTm9kZSBub2RlKSB7Ci0JCWJ1ZltidWZDb3VudCsrXSA9IG5vZGU7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJbGFzdEVsZW1lbnREZWYgPSBkdGQuZ2V0RWxlbWVudERlZmluaXRpb24obm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCWxhc3RFbGVtZW50TnVtYmVyID0gbGFzdEVsZW1lbnREZWYubnVtYmVyOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHJlc291cmNlIHJlYWRlciBmb3IgdGhpcyBwYXJzZXIuIEJ5IGRlZmF1bHQsIHRoaXMgY2xhc3MgaGFzIG5vCi0JICogcmVzb3VyY2UuIFNvIGlmIHNvbWUgcmVzb3VyY2UgaXMgcmVxdWlyZWQsIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIGEKLQkgKiBzdWJjbGFzcy4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgYWx3YXlzIHRocm93bi4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVhZGVyIGdldFJlc291cmNlKFN0cmluZyByZXNvdXJjZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiY2Fubm90IGZpbmQgIiArIHJlc291cmNlTmFtZSk7Ci0JfQotCi0JcHVibGljIE5vZGUgbm9kZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCU5vZGUgcmV0OwotCi0JCS8vIFRPRE8gZW11bGF0ZSA8dGFnIC8+IGJ5IHVzaW5nIEVuZFRhZwotCQlpZiAoaXNFbmRXaXRoU2xhc2ggJiYgIWlzRW1wdHlFbGVtZW50KSB7Ci0JCQkvLyBpZihpc1hIVE1MICYmIGlzRW5kV2l0aFNsYXNoKXsKLQkJCWlzRW5kV2l0aFNsYXNoID0gZmFsc2U7Ci0KLQkJCUVuZFRhZyBldCA9IG5ldyBFbmRUYWcoY3VycmVudFRhZ05hbWUpOwotCQkJY3VycmVudE5vZGUgPSBldDsKLQkJCWlmIChkb2NIYW5kbGVyICE9IG51bGwgJiYgIWVIYW5kbGVMb2dpY2FsKSB7Ci0JCQkJZG9jSGFuZGxlci5lbmRFbGVtZW50KGN1cnJlbnRUYWdOYW1lKTsKLQkJCX0KLQkJCUVsZW1lbnREZWZpbml0aW9uIGVkID0gZHRkLmdldEVsZW1lbnREZWZpbml0aW9uKGN1cnJlbnRUYWdOYW1lKTsKLQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJbGFzdEVsZW1lbnROdW1iZXIgPSBlZC5udW1iZXI7Ci0JCQkJcmV0dXJuIGV0OwotCQkJfSBlbHNlIGlmIChrZWVwVW5rbm93bnMpIHsKLQkJCQlsYXN0RWxlbWVudERlZiA9IGFub255bW91c0VsZW1lbnREZWY7Ci0JCQkJbGFzdEVsZW1lbnROdW1iZXIgPSBwY2RhdGFOdW1iZXIgKyAxOwotCQkJCXJldHVybiBldDsKLQkJCX0gZWxzZSBpZiAoaGFuZGxlRXJyb3IoSVBhcnNlckVycm9yLlVOS05PV05fRUxFTUVOVCwgZXQpKSB7Ci0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlzd2l0Y2ggKHRva2VuaXplci5uZXh0VG9rZW4oKSkgewotCQljYXNlIFNUQUdPOgotCQkJcmV0ID0gc3RhZygpOwotCQkJaWYgKHJldCA9PSBudWxsKSB7IC8vIFVua25vd24gRWxlbWVudC4gU2tpcCBpdC4KLQkJCQlyZXQgPSBnZXROb2RlKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBFVEFHTzoKLQkJCXJldCA9IGV0YWcoKTsKLQkJCWlmIChyZXQgPT0gbnVsbCkgeyAvLyBVbmtub3duIEVsZW1lbnQuIFNraXAgaXQuCi0JCQkJcmV0ID0gbm9kZSgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgV0hJVEVTUEFDRToKLQkJCWN1cnJlbnROb2RlID0gcmV0ID0gZG9jLmNyZWF0ZVRleHROb2RlKHRva2VuaXplci5zdmFsKTsKLQkJCWlmIChyZXQgaW5zdGFuY2VvZiBTR01MVGV4dCkgewotCQkJCSgoU0dNTFRleHQpIHJldCkuc2V0SXNXaGl0ZXNwYWNlSW5FbGVtZW50Q29udGVudCh0cnVlKTsKLQkJCX0KLQkJCWlmIChkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCQlpZiAoc2F4Y2ggIT0gbnVsbCkgewotCQkJCQlkb2NIYW5kbGVyLmNoYXJhY3RlcnMoc2F4Y2gsIGJlZ2luLCBsZW4pOwotCQkJCQlzYXhjaCA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUENEQVRBOgotCQkJY3VycmVudE5vZGUgPSByZXQgPSBkb2MuY3JlYXRlVGV4dE5vZGUodG9rZW5pemVyLnN2YWwpOwotCQkJaWYgKGRvY0hhbmRsZXIgIT0gbnVsbCkgewotCQkJCWlmIChzYXhjaCAhPSBudWxsKSB7Ci0JCQkJCWRvY0hhbmRsZXIuY2hhcmFjdGVycyhzYXhjaCwgYmVnaW4sIGxlbik7Ci0JCQkJCXNheGNoID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBDT01NRU5UOgotCQkJY3VycmVudE5vZGUgPSByZXQgPSBkb2MuY3JlYXRlQ29tbWVudCh0b2tlbml6ZXIuc3ZhbCk7Ci0JCQlpZiAobGV4SGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJbGV4SGFuZGxlci5jb21tZW50KHNheGNoLCBiZWdpbiwgbGVuKTsKLQkJCQlzYXhjaCA9IG51bGw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQSToKLQkJCWN1cnJlbnROb2RlID0gcmV0ID0gZG9jLmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihudWxsLAotCQkJCQl0b2tlbml6ZXIuc3ZhbCk7Ci0JCQlpZiAoZG9jSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJZG9jSGFuZGxlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24obnVsbCwgdG9rZW5pemVyLnN2YWwpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRU9GOgotCQkJcmV0ID0gbnVsbDsKLQkJCWJyZWFrOwotCQljYXNlIE1ETzoKLQkJCWVycm9yKElQYXJzZXJFcnJvci5JTExFR0FMX0RPQ1RZUEUsCi0JCQkJCSJJbGxlZ2FsIERlY2xhcmF0aW9uLiBEaXNjYXJkaW5nIHRvIG5leHQgJz4nIik7Ci0JCQlpZiAodG9rZW5pemVyLm5leHRUb2tlbigpICE9ICc+JykgewotCQkJCS8vIGNvbnN1bWUgJz4nCi0JCQkJdG9rZW5pemVyLmNvbnN1bWVVbnRpbCgnPicpOwotCQkJCXRva2VuaXplci5zd2l0Y2hUbyhERUZBVUxUKTsKLQkJCX0KLQkJCXJldHVybiBub2RlKCk7Ci0JCWRlZmF1bHQ6Ci0JCQllcnJvcihJUGFyc2VyRXJyb3IuTUlTQ19FUlIsCi0JCQkJCSJJbnRlcm5hbCBQYXJzZXIgRXJyb3I6IGNoYXJhY3RlciBlbmNvZGluZyBtYXkgYmUgd3JvbmcuIik7Ci0JCQlyZXR1cm4gbm9kZSgpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHVwIHN5bnRheCBpbmZvcm1hdGlvbiBkZXNjcmliZWQgYnkgRFRELgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJRAotCSAqICAgICAgICAgICAgRFREJ3MgcHVibGljIGlkIHRoYXQgc3BlY2lmaWVzIHdoaWNoIHRvIHNldCB1cC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXR1cERURChTdHJpbmcgcHVibGljSUQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlwdWJsaWNJRCA9IG1ha2VVbmlxdWUocHVibGljSUQpOwotCQlTR01MRG9jVHlwZURlZiByZXQgPSBTR01MRG9jVHlwZURlZi5nZXRQdWJsaWMocHVibGljSUQpOwotCQlpZiAocmV0ICE9IG51bGwpIHsKLQkJCXNldERURChyZXQpOwotCQkJbGFzdERlZiA9IHJldC5nZXRFbGVtZW50RGVmaW5pdGlvbihnZXREZWZhdWx0VG9wRWxlbWVudCgpKTsKLQkJfSBlbHNlIHsKLQkJCXN5bmNocm9uaXplZCAocHVibGljSUQpIHsKLQkJCQlyZXQgPSBTR01MRG9jVHlwZURlZi5nZXRQdWJsaWMocHVibGljSUQpOwotCQkJCWlmIChyZXQgPT0gbnVsbCkgewotCQkJCQlyZXQgPSBTR01MRG9jVHlwZURlZi5jcmVhdGVQdWJsaWMocHVibGljSUQsIHRoaXMpOwotCQkJCQlzZXREVEQocmV0KTsKLQkJCQkJUmVhZGVyIGRyID0gZ2V0UmVzb3VyY2UoKFN0cmluZykgcHViRW50aXR5TWFwLmdldChwdWJsaWNJRCkpOwotCQkJCQlEVERUb2tlbml6ZXIgdG9rID0gbmV3IERURFRva2VuaXplcihkcik7Ci0JCQkJCW5ldyBEVERQYXJzZXIodG9rLCByZXQpLnJlYWREVEQoKTsKLQkJCQkJZHIuY2xvc2UoKTsKLQkJCQkJU0dNTERvY1R5cGVEZWYucHV0UHVibGljKHB1YmxpY0lELCByZXQpOwotCQkJCQlyZXQucmVoYXNoKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0RFREKHJldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxhc3REZWYgPSBkdGQuZ2V0RWxlbWVudERlZmluaXRpb24oZ2V0RGVmYXVsdFRvcEVsZW1lbnQoKSk7Ci0JCXBjZGF0YU51bWJlciA9IGR0ZC5nZXRFbGVtZW50Q291bnQoKTsKLQkJZm9yIChpbnQgaSA9IGRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWFuY2VzdGVyRWxlbWVudERlZnNbaV0gPSBkdGQKLQkJCQkJLmdldEVsZW1lbnREZWZpbml0aW9uKGFuY2VzdGVyRWxlbWVudERlZnNbaV0uZ2V0TmFtZSgpKTsKLQkJCWlmIChhbmNlc3RlckVsZW1lbnREZWZzW2ldID09IG51bGwpIHsKLQkJCQllcnJvcihJUGFyc2VyRXJyb3IuVU5LTk9XTl9FTEVNRU5ULCBhbmNlc3RlcnNbaV0uZ2V0Tm9kZU5hbWUoKQotCQkJCQkJKyAiIGlzIG5vdCBkZWZpbmVkIGluICIgKyBwdWJsaWNJRCk7Ci0JCQkJYW5jZXN0ZXJFbGVtZW50RGVmc1tpXSA9IGFub255bW91c0VsZW1lbnREZWY7Ci0JCQl9Ci0JCX0KLQkJYW5vbnltb3VzRWxlbWVudERlZi5yZWhhc2gocGNkYXRhTnVtYmVyICsgMik7Ci0JCWFub255bW91c0VsZW1lbnREZWYubnVtYmVyID0gcGNkYXRhTnVtYmVyICsgMTsKLQl9Ci0KLQlwdWJsaWMgaW50IHBjZGF0YU51bWJlcjsKLQotCS8qKgotCSAqIFBhcnNlcyBTR01MIGEgZG9jdW1lbnQgYW5kIHJldHVybiBpdHMgdG9wIGVsZW1lbnQuIFNHTUwgZG9jdW1lbnRzIGFyZQotCSAqIGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzLiAxLiBTR01MIGRlY2xhcmF0aW9uLiAyLiBEY3VtZW50IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiAzLiBTR01MIGluc3RhbmNlcy4gSWYgYSBkb2N1bWVudCBtaXNzZXMgMS4gYW5kIDIuLCB0aGlzIHBhcnNlciB0cnkgdG8KLQkgKiByZWFkIHRoZSBkZWZhdWx0IGRlY2xhcmF0aW9uIHNwZWNpZmllZCBieQotCSAqIHtAbGluayAjc2V0RGVmYXVsdERURChqYXZhLmxhbmcuU3RyaW5nKX0uCi0JICogCi0JICogQHBhcmFtIHJlYWRlcgotCSAqICAgICAgICAgICAgcGFyc2UgdG8gcmVhZC4KLQkgKiBAcmV0dXJuIGRvY3VtZW50LgotCSAqIEBleGNlcHRpb24gUGFzZXJFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB1bnJlY292ZXJhYmxlIHN5bnRheCBvciB0b2tlbiBlcnJvciBvY2N1cmVkLCB0aHJvd2VkCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBOb2RlIHBhcnNlKFJlYWRlciByZWFkZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCi0JCQlTQVhFeGNlcHRpb24gewotCQlpZiAoZG9tSW1wbCA9PSBudWxsICYmIGRvYyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIk5vIGZhY3RvcnkgaW5zdGFuY2UuIik7Ci0JCX0KLQkJaW5pdCgpOwotCi0JCXRoaXMudG9rZW5pemVyID0gbmV3IEluc1Rva2VuaXplcihyZWFkZXIsIHRoaXMpOwotCQlpZiAoZG9jSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlkb2NIYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcih0aGlzLnRva2VuaXplcik7Ci0JCQlkb2NIYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKTsKLQkJfQotCQlzZXREVEQoU0dNTERvY1R5cGVEZWYuY3JlYXRlQW5vbnltb3VzKHRoaXMpKTsKLQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSByZWFkRG9jVHlwZSgpOwotCQlpZiAoZG9jVHlwZSA9PSBudWxsKSB7Ci0JCQllcnJvcihJUGFyc2VyRXJyb3IuRE9DVFlQRV9NSVNTRUQsICI8IURPQ1RZUEUgLi4uPiBpcyBtaXNzaW5nLiAgVHJ5IHRvIHVzZSBcIiIKLQkJCQkJKyBkZWZhdWx0RFREICsgIlwiIGFzIGRvY3VtZW50IHR5cGUiKTsKLQkJCXNldHVwRFREKGRlZmF1bHREVEQpOwotCQl9Ci0JCXRva2VuaXplci5leHRyYWN0TnVtRW50aXR5KGV4dHJhY3ROdW0pOwotCQl0b2tlbml6ZXIuZXh0cmFjdENoYXJFbnRpdHkoZXh0cmFjdENoYXIpOwotCQl0b2tlbml6ZXIuc2V0UHJlc2VydmVXaGl0ZXNwYWNlKHByZXNlcnZlV2hpdGVzcGFjZSk7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJZG9jID0gY3JlYXRlRG9jdW1lbnQoZG9jVHlwZSk7Ci0JCQlpZiAoZG9jIGluc3RhbmNlb2YgU0dNTERvY3VtZW50Ci0JCQkJCSYmICgoU0dNTERvY3VtZW50KSBkb2MpLmdldERURCgpID09IG51bGwpIHsKLQkJCQkoKFNHTUxEb2N1bWVudCkgZG9jKS5zZXREVEQodGhpcy5kdGQpOwotCQkJfQotCQkJd2hpbGUgKCFjb21tZW50c0JlZm9yZURvY3R5cGUuaXNFbXB0eSgpKSB7Ci0JCQkJQ0FUQiBjYXRiID0gKENBVEIpIGNvbW1lbnRzQmVmb3JlRG9jdHlwZS5sYXN0RWxlbWVudCgpOwotCQkJCU5vZGUgbm9kZSA9IGNhdGIuY29tbWVudCA/IChOb2RlKSBkb2MuY3JlYXRlQ29tbWVudChjYXRiLnN0cikKLQkJCQkJCTogZG9jLmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihudWxsLCBjYXRiLnN0cik7Ci0JCQkJZG9jLmluc2VydEJlZm9yZShub2RlLCBkb2MuZ2V0Rmlyc3RDaGlsZCgpKTsKLQkJCQljb21tZW50c0JlZm9yZURvY3R5cGUucmVtb3ZlRWxlbWVudChjYXRiKTsKLQkJCX0KLQkJfQotCi0JCS8vIC8vMDQxMDI2IGhhbmRsZSBjb21tZW50cyBhZnRlciBkb2N0eXBlCi0JCS8vIGNvbW1lbnRfbG9vcDogd2hpbGUgKHRydWUpIHsKLQkJLy8gc3dpdGNoICh0b2tlbml6ZXIubmV4dFRva2VuKCkpIHsKLQkJLy8gY2FzZSBDT01NRU5UOgotCQkvLyBkb2MuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUNvbW1lbnQodG9rZW5pemVyLnN2YWwpKTsKLQkJLy8gaWYgKGxleEhhbmRsZXIgIT0gbnVsbCkgewotCQkvLyBsZXhIYW5kbGVyLmNvbW1lbnQoc2F4Y2gsIGJlZ2luLCBsZW4pOwotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIFBJOgotCQkvLyBkb2MuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUNvbW1lbnQodG9rZW5pemVyLnN2YWwpKTsKLQkJLy8gaWYgKGRvY0hhbmRsZXIgIT0gbnVsbCkgewotCQkvLyBkb2NIYW5kbGVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbihudWxsLCB0b2tlbml6ZXIuc3ZhbCk7Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTURPOgotCQkvLyBicmVhayBjb21tZW50X2xvb3A7Ci0JCS8vIGRlZmF1bHQ6Ci0JCS8vIHRva2VuaXplci5wdXNoQmFjaygpOwotCQkvLyBicmVhayBjb21tZW50X2xvb3A7Ci0JCS8vIH0KLQkJLy8gfQotCi0JCS8vIGR1bW15Ci0JCWNvbnRleHQgPSBkb2MuY3JlYXRlRWxlbWVudCgiZHVtbXkwIik7Ci0JCXNlcUFycmF5ID0gbmV3IElNb2RlbEdyb3VwW2R0ZC5tYXhTZXFMZW5ndGhdOwotCQlOb2RlIHJldCA9IHJlYWRJbnN0YW5jZXMoKTsKLQkJaWYgKGRvY0hhbmRsZXIgIT0gbnVsbCkKLQkJCWRvY0hhbmRsZXIuZW5kRG9jdW1lbnQoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsR3JvdXAgc2VxQXJyYXlbXTsKLQotCXB1YmxpYyBJTW9kZWxHcm91cFtdIGdldFNlcUFycmF5KCkgewotCQlyZXR1cm4gdGhpcy5zZXFBcnJheTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoRG9jdW1lbnRUeXBlIGRvY1R5cGUpIHsKLQkJRG9jdW1lbnQgcmV0ID0gZG9tSW1wbC5jcmVhdGVEb2N1bWVudCgiZHVtbXkxIiwgImR1bW15MSIsCi0JCQkJZG9jVHlwZSk7Ci0JCWlmIChyZXQuZ2V0RG9jdW1lbnRFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJcmV0LnJlbW92ZUNoaWxkKHJldC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZXh0IGVsZW1lbnQuCi0JICovCi0JcHVibGljIEVsZW1lbnQgY29udGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXRzIGEgY3VycmVudCBjb250ZXh0IGVsZW1lbnQuCi0JICogCi0JICogQHJldHVybiBjb250ZXh0IGVsZW1lbnQKLQkgKiBAc2VlICNzZXRDb250ZXh0KG9yZy53M2MuZG9tLkVsZW1lbnQpCi0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBmb3J3YXJkUGF0aFtdID0gbmV3IEVsZW1lbnRbQlVGX1NJWl07Ci0KLQlwdWJsaWMgRWxlbWVudERlZmluaXRpb24gYW5jZXN0ZXJFbGVtZW50RGVmc1tdID0gbmV3IEVsZW1lbnREZWZpbml0aW9uW0JVRl9TSVpdOwotCi0JcHVibGljIEVsZW1lbnQgYW5jZXN0ZXJzW10gPSBuZXcgRWxlbWVudFtCVUZfU0laXTsKLQotCXB1YmxpYyBpbnQgZGVwdGggPSAwOwotCi0JcHVibGljIEF0dHJpYnV0ZUxpc3RJbXBsIG51bGxBdHRyaWJ1dGVMaXN0ID0gY3JlYXRlQXR0cmlidXRlTGlzdCgpOwotCi0JcHJpdmF0ZSB2b2lkIHNldENvbnRleHRGb3J3YXJkKEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCUVsZW1lbnREZWZpbml0aW9uIGVkOwotCQlpZiAoZUhhbmRsZUxvZ2ljYWwgJiYgZG9jSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlmb3IgKE5vZGUgZG93biA9IGNvbnRleHQuZ2V0TGFzdENoaWxkKCk7IGRvd24gaW5zdGFuY2VvZiBFbGVtZW50OyBkb3duID0gZG93bgotCQkJCQkuZ2V0TGFzdENoaWxkKCkpIHsKLQkJCQlpZiAoZG93biA9PSBlbGVtZW50KSB7Ci0JCQkJCWFuY2VzdGVyc1tkZXB0aF0gPSBlbGVtZW50OwotCQkJCQlhbmNlc3RlckVsZW1lbnREZWZzW2RlcHRoXSA9IGxhc3RFbGVtZW50RGVmOwotCQkJCQlkZXB0aCsrOwotCQkJCQlkb2NIYW5kbGVyLnN0YXJ0RWxlbWVudChlbGVtZW50LmdldE5vZGVOYW1lKCksIGF0dHJsaXN0KTsKLQkJCQkJYXR0cmxpc3QgPSBudWxsOwotCQkJCQl0aGlzLmNvbnRleHQgPSBlbGVtZW50OwotCQkJCQlyZXR1cm47Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYW5jZXN0ZXJzW2RlcHRoXSA9IChFbGVtZW50KSBkb3duOwotCQkJCQlhbmNlc3RlckVsZW1lbnREZWZzW2RlcHRoXSA9IGVkID0gZHRkCi0JCQkJCQkJLmdldEVsZW1lbnREZWZpbml0aW9uKGRvd24uZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCWlmIChlZCA9PSBudWxsKSB7Ci0JCQkJCQlhbmNlc3RlckVsZW1lbnREZWZzW2RlcHRoXSA9IGFub255bW91c0VsZW1lbnREZWY7Ci0JCQkJCX0KLQkJCQkJZG9jSGFuZGxlci5zdGFydEVsZW1lbnQoZG93bi5nZXROb2RlTmFtZSgpLAotCQkJCQkJCW51bGxBdHRyaWJ1dGVMaXN0KTsKLQkJCQkJZGVwdGgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKE5vZGUgZG93biA9IGNvbnRleHQuZ2V0TGFzdENoaWxkKCk7IGRvd24gaW5zdGFuY2VvZiBFbGVtZW50OyBkb3duID0gZG93bgotCQkJCQkuZ2V0TGFzdENoaWxkKCkpIHsKLQkJCQlpZiAoZG93biA9PSBlbGVtZW50KSB7Ci0JCQkJCWFuY2VzdGVyc1tkZXB0aF0gPSBlbGVtZW50OwotCQkJCQlhbmNlc3RlckVsZW1lbnREZWZzW2RlcHRoXSA9IGxhc3RFbGVtZW50RGVmOwotCQkJCQlkZXB0aCsrOwotCQkJCQlhdHRybGlzdCA9IG51bGw7Ci0JCQkJCXRoaXMuY29udGV4dCA9IGVsZW1lbnQ7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgewotCQkJCQlhbmNlc3RlcnNbZGVwdGhdID0gKEVsZW1lbnQpIGRvd247Ci0JCQkJCWFuY2VzdGVyRWxlbWVudERlZnNbZGVwdGhdID0gZWQgPSBkdGQKLQkJCQkJCQkuZ2V0RWxlbWVudERlZmluaXRpb24oZG93bi5nZXROb2RlTmFtZSgpKTsKLQkJCQkJaWYgKGVkID09IG51bGwpIHsKLQkJCQkJCWFuY2VzdGVyRWxlbWVudERlZnNbZGVwdGhdID0gYW5vbnltb3VzRWxlbWVudERlZjsKLQkJCQkJfQotCQkJCX0KLQkJCQlkZXB0aCsrOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBQYXJzZXIgRXJyb3IuIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENvbnRleHRCYWNrd2FyZChpbnQgbmV3RGVwdGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAoZUhhbmRsZUxvZ2ljYWwgJiYgZG9jSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gZGVwdGggLSAxOyBpID49IG5ld0RlcHRoOyBpLS0pIHsKLQkJCQlkb2NIYW5kbGVyLmVuZEVsZW1lbnQoYW5jZXN0ZXJzW2ldLmdldE5vZGVOYW1lKCkpOwotCQkJfQotCQl9Ci0JCWRlcHRoID0gbmV3RGVwdGg7Ci0JCXRoaXMuY29udGV4dCA9IGFuY2VzdGVyc1tuZXdEZXB0aCAtIDFdOwotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogU2V0cyBjdXJyZW50IGNvbnRleHQgZWxlbWVudCBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBuZXcgY29udGV4dC4KLQkgKiBAc2VlICNnZXRDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRDb250ZXh0KEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSBkZXB0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlFbGVtZW50IHVwID0gYW5jZXN0ZXJzW2ldOwotCQkJaWYgKHVwID09IGVsZW1lbnQpIHsKLQkJCQlpZiAoZUhhbmRsZUxvZ2ljYWwgJiYgZG9jSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGogPSBkZXB0aCAtIDE7IGogPiBpOyBqLS0pIHsKLQkJCQkJCWRvY0hhbmRsZXIuZW5kRWxlbWVudChhbmNlc3RlcnNbal0uZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZGVwdGggPSBpICsgMTsKLQkJCQl0aGlzLmNvbnRleHQgPSBlbGVtZW50OwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWludCBmb3J3YXJkUGF0aExlbiA9IDA7Ci0JCQlmb3IgKE5vZGUgZG93biA9IHVwLmdldExhc3RDaGlsZCgpOyBkb3duIGluc3RhbmNlb2YgRWxlbWVudDsgZG93biA9IGRvd24KLQkJCQkJLmdldExhc3RDaGlsZCgpKSB7Ci0JCQkJaWYgKGRvd24gPT0gZWxlbWVudCkgewotCQkJCQlpZiAoZUhhbmRsZUxvZ2ljYWwgJiYgZG9jSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKGludCBqID0gZGVwdGggLSAxOyBqID4gaTsgai0tKSB7Ci0JCQkJCQkJZG9jSGFuZGxlci5lbmRFbGVtZW50KGFuY2VzdGVyc1tqXS5nZXROb2RlTmFtZSgpKTsKLQkJCQkJCX0KLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZm9yd2FyZFBhdGhMZW47IGorKykgewotCQkJCQkJCWRvY0hhbmRsZXIuc3RhcnRFbGVtZW50KGZvcndhcmRQYXRoW2pdCi0JCQkJCQkJCQkuZ2V0Tm9kZU5hbWUoKSwgbnVsbEF0dHJpYnV0ZUxpc3QpOwotCQkJCQkJCWFuY2VzdGVyc1tpICsgaiArIDFdID0gZm9yd2FyZFBhdGhbal07Ci0JCQkJCQkJYW5jZXN0ZXJFbGVtZW50RGVmc1tpICsgaiArIDFdID0gZHRkCi0JCQkJCQkJCQkuZ2V0RWxlbWVudERlZmluaXRpb24oZm9yd2FyZFBhdGhbal0KLQkJCQkJCQkJCQkJLmdldE5vZGVOYW1lKCkpOwotCQkJCQkJCWlmIChhbmNlc3RlckVsZW1lbnREZWZzW2kgKyBqICsgMV0gPT0gbnVsbCkgewotCQkJCQkJCQlhbmNlc3RlckVsZW1lbnREZWZzW2kgKyBqICsgMV0gPSBhbm9ueW1vdXNFbGVtZW50RGVmOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWRvY0hhbmRsZXIuc3RhcnRFbGVtZW50KGRvd24uZ2V0Tm9kZU5hbWUoKSwgYXR0cmxpc3QpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmb3J3YXJkUGF0aExlbjsgaisrKSB7Ci0JCQkJCQkJYW5jZXN0ZXJzW2kgKyBqICsgMV0gPSBmb3J3YXJkUGF0aFtqXTsKLQkJCQkJCQlhbmNlc3RlckVsZW1lbnREZWZzW2kgKyBqICsgMV0gPSBkdGQKLQkJCQkJCQkJCS5nZXRFbGVtZW50RGVmaW5pdGlvbihmb3J3YXJkUGF0aFtqXQotCQkJCQkJCQkJCQkuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCQkJaWYgKGFuY2VzdGVyRWxlbWVudERlZnNbaSArIGogKyAxXSA9PSBudWxsKSB7Ci0JCQkJCQkJCWFuY2VzdGVyRWxlbWVudERlZnNbaSArIGogKyAxXSA9IGFub255bW91c0VsZW1lbnREZWY7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWRlcHRoID0gaSArIGZvcndhcmRQYXRoTGVuICsgMTsKLQkJCQkJYW5jZXN0ZXJzW2RlcHRoXSA9IGVsZW1lbnQ7Ci0JCQkJCWFuY2VzdGVyRWxlbWVudERlZnNbZGVwdGhdID0gbGFzdEVsZW1lbnREZWY7Ci0JCQkJCWRlcHRoKys7Ci0JCQkJCWF0dHJsaXN0ID0gbnVsbDsKLQkJCQkJdGhpcy5jb250ZXh0ID0gZWxlbWVudDsKLQkJCQkJcmV0dXJuOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvcndhcmRQYXRoW2ZvcndhcmRQYXRoTGVuKytdID0gKEVsZW1lbnQpIGRvd247Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGNyZWF0ZXMgYmFja3dhcmQgY29udGV4dC4KLQkJaW50IG5ld0RlcHRoID0gMDsKLQkJZm9yIChOb2RlIHVwID0gZWxlbWVudDsgdXAgaW5zdGFuY2VvZiBFbGVtZW50OyB1cCA9IHVwLmdldFBhcmVudE5vZGUoKSkgewotCQkJbmV3RGVwdGgrKzsKLQkJfQotCQlFbGVtZW50IG5ld0FuY2VzdGVyc1tdID0gbmV3IEVsZW1lbnRbbmV3RGVwdGhdOwotCQlpbnQgaSA9IDE7Ci0JCWZvciAoTm9kZSB1cCA9IGVsZW1lbnQ7IHVwIGluc3RhbmNlb2YgRWxlbWVudDsgdXAgPSB1cC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCW5ld0FuY2VzdGVyc1tuZXdEZXB0aCAtIGldID0gKEVsZW1lbnQpIHVwOwotCQkJaSsrOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuZXdEZXB0aDsgaSsrKSB7Ci0JCQlpZiAoYW5jZXN0ZXJzW2ldICE9IG5ld0FuY2VzdGVyc1tpXSkgewotCQkJCWlmIChlSGFuZGxlTG9naWNhbCAmJiBkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaiA9IGRlcHRoIC0gMTsgaiA+PSBpOyBqLS0pIHsKLQkJCQkJCWRvY0hhbmRsZXIuZW5kRWxlbWVudChhbmNlc3RlcnNbal0uZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCX0KLQkJCQkJZm9yIChpbnQgaiA9IGk7IGogPCBuZXdEZXB0aCAtIDE7IGorKykgewotCQkJCQkJZG9jSGFuZGxlci5zdGFydEVsZW1lbnQobmV3QW5jZXN0ZXJzW2pdLmdldE5vZGVOYW1lKCksCi0JCQkJCQkJCW51bGxBdHRyaWJ1dGVMaXN0KTsKLQkJCQkJfQotCQkJCQlkb2NIYW5kbGVyLnN0YXJ0RWxlbWVudChlbGVtZW50LmdldE5vZGVOYW1lKCksIGF0dHJsaXN0KTsKLQkJCQl9Ci0JCQkJd2hpbGUgKGkgPCBuZXdEZXB0aCAtIDEpIHsKLQkJCQkJYW5jZXN0ZXJzW2ldID0gbmV3QW5jZXN0ZXJzW2ldOwotCQkJCQlhbmNlc3RlckVsZW1lbnREZWZzW2ldID0gZHRkCi0JCQkJCQkJLmdldEVsZW1lbnREZWZpbml0aW9uKG5ld0FuY2VzdGVyc1tpXS5nZXROb2RlTmFtZSgpKTsKLQkJCQl9Ci0JCQkJYW5jZXN0ZXJzW25ld0RlcHRoIC0gMV0gPSBlbGVtZW50OwotCQkJCWFuY2VzdGVyRWxlbWVudERlZnNbbmV3RGVwdGggLSAxXSA9IGxhc3RFbGVtZW50RGVmOwotCQkJCWRlcHRoID0gbmV3RGVwdGg7Ci0JCQkJYXR0cmxpc3QgPSBudWxsOwotCQkJCXRoaXMuY29udGV4dCA9IGVsZW1lbnQ7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFZlY3RvcjxFbGVtZW50PiBub2Rlc1dpdGhFbmR0YWcgPSBuZXcgVmVjdG9yPEVsZW1lbnQ+KCk7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgYSBzcGVjaWZpZWQgZWxlbWVudCBoYXMgaXRzIGVuZCB0YWcgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBlbGVtZW50IHRvIGJlIGNoZWNrZWQuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5lbGVtZW50PC9jb2RlPiBoYXMgaXRzIGVuZCB0YWcuCi0JICogICAgICAgICBPdGhlcndpc2UsIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0VuZFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG5vZGVzV2l0aEVuZHRhZy5jb250YWlucyhlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHRoYXQgYSBzcGVjaWZpZWQgZWxlbWVudCBoYXMgaXRzIGVuZCB0YWcuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzRW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlub2Rlc1dpdGhFbmR0YWcuYWRkRWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VG9wRWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlFbGVtZW50IHByZXYgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCWRvYy5yZXBsYWNlQ2hpbGQoZWxlbWVudCwgcHJldik7Ci0JCX0gZWxzZSB7Ci0JCQlkb2MuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCX0KLQkJY29udGV4dCA9IGVsZW1lbnQ7Ci0JCWlmIChkb2NIYW5kbGVyICE9IG51bGwgJiYgZUhhbmRsZUxvZ2ljYWwpIHsKLQkJCUF0dHJpYnV0ZUxpc3RJbXBsIGFsID0gYXR0cmxpc3QgIT0gbnVsbCA/IGF0dHJsaXN0Ci0JCQkJCTogbnVsbEF0dHJpYnV0ZUxpc3Q7Ci0JCQlkb2NIYW5kbGVyLnN0YXJ0RWxlbWVudChlbGVtZW50LmdldE5vZGVOYW1lKCksIGFsKTsKLQkJCWF0dHJsaXN0ID0gbnVsbDsKLQkJfQotCQlhbmNlc3RlckVsZW1lbnREZWZzWzBdID0gbGFzdERlZjsKLQkJYW5jZXN0ZXJzWzBdID0gZWxlbWVudDsKLQkJZGVwdGgrKzsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxFbmRUYWc+IG1pc3NlZEVuZHRhZ3MgPSBuZXcgVmVjdG9yPEVuZFRhZz4oKTsKLQotCXByaXZhdGUgTm9kZSByZWFkSW5zdGFuY2VzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLQkJCVNBWEV4Y2VwdGlvbiB7Ci0JCU5vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBkb2M7Ci0JCXdoaWxlIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUKLQkJCQl8fCBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHsKLQkJCWlmIChrZWVwQ29tbWVudCkKLQkJCQlkb2MuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCQlub2RlID0gZ2V0Tm9kZSgpOwotCQl9Ci0KLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJY2FzZSBFTkRUQUc6Ci0KLQkJCWlmICghaGFuZGxlRXJyb3IoSVBhcnNlckVycm9yLkZMT0FUSU5HX0VORFRBRywgbm9kZSkpIHsKLQkJCQlpZiAoZUhhbmRsZUxvZ2ljYWwgJiYgZG9jSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCWRvY0hhbmRsZXIuaWdub3JhYmxlV2hpdGVzcGFjZShzYXhjaCwgYmVnaW4sIGxlbik7Ci0JCQkJfQotCQkJCWVycm9yKElQYXJzZXJFcnJvci5GTE9BVElOR19FTkRUQUcsICJJbGxlZ2FsIGVuZCB0YWc6ICIgKyBub2RlCi0JCQkJCQkrICIuICBJZ25vcmUgaXQuIik7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVhZEluc3RhbmNlcygpOwotCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgotCQkJaWYgKGxhc3REZWYuaW5zdGFuY2Uobm9kZSkpIHsKLQkJCQlzZXRUb3BFbGVtZW50KChFbGVtZW50KSBub2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQXR0cmlidXRlTGlzdEltcGwgYXR0cmxpc3R0bXAgPSBhdHRybGlzdDsKLQkJCQlhdHRybGlzdCA9IG51bGw7Ci0JCQkJc2V0VG9wRWxlbWVudChkb2MuY3JlYXRlRWxlbWVudChjaGFuZ2VEZWZhdWx0VGFnQ2FzZShsYXN0RGVmCi0JCQkJCQkuZ2V0TmFtZSgpKSkpOwotCQkJCWF0dHJsaXN0ID0gYXR0cmxpc3R0bXA7Ci0JCQkJYWRkQXV0b0dlbmVyYXRlZChjb250ZXh0KTsKLQkJCQlpZiAobGFzdERlZi5nZXRDb250ZW50TW9kZWwoKS5tYXRjaCh0aGlzLCBjb250ZXh0LCBub2RlKSkgewotCQkJCQlpZiAoIWxhc3REZWYuc3RhcnRUYWdPbWl0dGFibGUoKSkgewotCQkJCQkJZXJyb3IoSVBhcnNlckVycm9yLklMTEVHQUxfVE9QX0VMRU1FTlQsIG5vZGUKLQkJCQkJCQkJKyAiIGNhbid0IGJlIGEgdG9wIGVsZW1lbnQuIik7Ci0JCQkJCX0KLQkJCQkJc2V0Q29udGV4dEZvcndhcmQoKEVsZW1lbnQpIG5vZGUpOwotCQkJCX0gZWxzZSBpZiAoIWhhbmRsZUVycm9yKElQYXJzZXJFcnJvci5JTExFR0FMX0NISUxELCBub2RlKSkgewotCQkJCQlhZGRFcnJvck5vZGUoY29udGV4dCk7Ci0JCQkJCWVycm9yKElQYXJzZXJFcnJvci5JTExFR0FMX0NISUxELCBub2RlCi0JCQkJCQkJKyAiIGlzIG5vdCBhbGxvd2VkIGFzIGEgY2hpbGQgb2YgIiArIGNvbnRleHQpOwotCQkJCQljb250ZXh0LmFwcGVuZENoaWxkKG5vZGUpOwotCQkJCQlzZXRDb250ZXh0Rm9yd2FyZCgoRWxlbWVudCkgbm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJcG9zdEVsZW1lbnQoKEVsZW1lbnQpIG5vZGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTm9kZS5URVhUX05PREU6Ci0JCQlpZiAocHJlc2VydmVXaGl0ZXNwYWNlICYmIHdoaXRlc3BhY2VUZXh0KChUZXh0KSBub2RlKSkgewotCQkJCXJldHVybiByZWFkSW5zdGFuY2VzKCk7Ci0JCQl9Ci0JCQllcnJvcihJUGFyc2VyRXJyb3IuSUxMRUdBTF9UT1BfRUxFTUVOVCwgIiN0ZXh0IGNhbid0IGJlIGEgdG9wIGVsZW1lbnQiKTsKLQkJCXNldFRvcEVsZW1lbnQoZG9jLmNyZWF0ZUVsZW1lbnQoY2hhbmdlRGVmYXVsdFRhZ0Nhc2UobGFzdERlZgotCQkJCQkuZ2V0TmFtZSgpKSkpOwotCQkJYWRkQXV0b0dlbmVyYXRlZChjb250ZXh0KTsKLQkJCWNvbnRleHQuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbih0b2tlbml6ZXIuZ2V0Q3VycmVudExpbmUoKQotCQkJCQkrICI6IEludGVybmFsIFBhcnNlciBFcnJvciAiICsgbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHJlYWRJbnN0YW5jZXMyKCk7Ci0JfQotCi0JcHJpdmF0ZSBOb2RlIHJlYWRJbnN0YW5jZXMyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLQkJCVNBWEV4Y2VwdGlvbiB7Ci0JCUVsZW1lbnREZWZpbml0aW9uIGVkOwotCQlOb2RlIG5vZGU7Ci0JCW91dGVyOiBmb3IgKG5vZGUgPSBnZXROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGdldE5vZGUoKSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKG5vZGUuZ2V0Tm9kZVR5cGUoKSsiIDogIitub2RlKTsKLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKG5vZGUudG9TdHJpbmcoKSk7Ci0KLQkJCW5vZGVfc2VsOiBzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERToKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0JCQkJaWYgKGtlZXBDb21tZW50KQotCQkJCQljb250ZXh0LmFwcGVuZENoaWxkKG5vZGUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFTkRUQUc6Ci0KLQkJCQltaXNzZWRFbmR0YWdzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0JCQkJaWYgKF9ERUJVRwotCQkJCQkJJiYgbm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCQkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgiREVCVUdfRU5EVEFHIikpKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiREVCVUc6ICIgKyBub2RlKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IGRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJaWYgKGFuY2VzdGVyRWxlbWVudERlZnNbaV0ubnVtYmVyID09IGxhc3RFbGVtZW50TnVtYmVyCi0JCQkJCQkJJiYgKGxhc3RFbGVtZW50TnVtYmVyICE9IHBjZGF0YU51bWJlciArIDEgfHwgYW5jZXN0ZXJzW2ldCi0JCQkJCQkJCQkuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQkJCQkJCQlub2RlLmdldE5vZGVOYW1lKCkpKSkgewotCi0JCQkJCQlpZiAoIW1pc3NlZEVuZHRhZ3MuaXNFbXB0eSgpKSB7Ci0KLQkJCQkJCQlleHRyYUVyckluZm8gPSBtaXNzZWRFbmR0YWdzOwotCQkJCQkJCWlmIChoYW5kbGVFcnJvcihJUGFyc2VyRXJyb3IuU1VEREVOX0VORFRBRywgbm9kZSkpIHsKLQkJCQkJCQkJZXh0cmFFcnJJbmZvID0gbnVsbDsKLQkJCQkJCQkJYnJlYWsgbm9kZV9zZWw7Ci0JCQkJCQkJfQotCQkJCQkJCWV4dHJhRXJySW5mbyA9IG51bGw7Ci0JCQkJCQkJZXJyb3IoSVBhcnNlckVycm9yLlNVRERFTl9FTkRUQUcsIG1pc3NlZEVuZHRhZ3MKLQkJCQkJCQkJCSsgIiBoYXZlIGJlZW4gZm9yY2VkIHRvIGJlIGluc2VydGVkIGJ5ICIKLQkJCQkJCQkJCSsgbm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCQkvKgotCQkJCQkJICogaWYgKGFuY2VzdGVyRWxlbWVudERlZnNbZGVwdGggLSAxXS5udW1iZXIgPT0KLQkJCQkJCSAqIGxhc3RFbGVtZW50TnVtYmVyKSB7Ci0JCQkJCQkgKiBub2Rlc1dpdGhFbmR0YWcuYWRkRWxlbWVudChjb250ZXh0KTsgfQotCQkJCQkJICovCi0JCQkJCQkoKEVuZFRhZykgbm9kZSkuc2V0RWxlbWVudChhbmNlc3RlcnNbaV0pOwotCQkJCQkJbm9kZXNXaXRoRW5kdGFnLmFkZEVsZW1lbnQoYW5jZXN0ZXJzW2ldKTsKLQkJCQkJCWlmIChpID4gMCkgewotCQkJCQkJCXNldENvbnRleHRCYWNrd2FyZChpKTsKLQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlicmVhayBvdXRlcjsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrIG5vZGVfc2VsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKCFhbmNlc3RlckVsZW1lbnREZWZzW2ldLmVuZFRhZ09taXR0YWJsZSgpKSB7Ci0JCQkJCQkJbWlzc2VkRW5kdGFncy5pbnNlcnRFbGVtZW50QXQobmV3IEVuZFRhZygKLQkJCQkJCQkJCWFuY2VzdGVyc1tpXS5nZXROb2RlTmFtZSgpKSwgMCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0KLQkJCQlpZiAoIWhhbmRsZUVycm9yKElQYXJzZXJFcnJvci5GTE9BVElOR19FTkRUQUcsIG5vZGUpKSB7Ci0JCQkJCWlmIChlSGFuZGxlTG9naWNhbCAmJiBkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCWRvY0hhbmRsZXIuaWdub3JhYmxlV2hpdGVzcGFjZShzYXhjaCwgYmVnaW4sIGxlbik7Ci0JCQkJCX0KLQkJCQkJZXJyb3IoSVBhcnNlckVycm9yLkZMT0FUSU5HX0VORFRBRywgIklsbGVnYWwgZW5kIHRhZzogIiArIG5vZGUKLQkJCQkJCQkrICIuICBJZ25vcmUgaXQiKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgotCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJCUVsZW1lbnQgZXhQYXJlbnQgPSBudWxsOwotCQkJCWlmIChfREVCVUcKLQkJCQkJCSYmIGVsZW1lbnQuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCQkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgiREVCVUdfU1RBUlRUQUciKSkpIHsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogIiArIGVsZW1lbnQpOwotCQkJCX0KLQotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZWxlbWVudCIpOwotCi0JCQkJZm9yIChpbnQgaSA9IGRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJZWQgPSBhbmNlc3RlckVsZW1lbnREZWZzW2ldOwotCQkJCQlpZiAoIWVkLmVuZFRhZ09taXR0YWJsZSgpICYmIGV4UGFyZW50ID09IG51bGwpIHsKLQkJCQkJCWV4UGFyZW50ID0gYW5jZXN0ZXJzW2ldOwotCQkJCQl9Ci0KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGVkLnRvU3RyaW5nKCkpOwotCi0JCQkJCWlmIChlZC5leGNsdXNpb24obGFzdEVsZW1lbnROdW1iZXIpKSB7Ci0JCQkJCQlpZiAoZXhQYXJlbnQgIT0gbnVsbCkgewotCQkJCQkJCWlmICghaGFuZGxlRXJyb3IoSVBhcnNlckVycm9yLklMTEVHQUxfQ0hJTEQsIG5vZGUpKSB7Ci0JCQkJCQkJCWFkZEVycm9yTm9kZShjb250ZXh0KTsKLQkJCQkJCQkJZXJyb3IoSVBhcnNlckVycm9yLklMTEVHQUxfQ0hJTEQsIG5vZGUKLQkJCQkJCQkJCQkrICIgaXMgYW4gZXhjZXB0aW9uIHVuZXIgIgotCQkJCQkJCQkJCSsgYW5jZXN0ZXJzW2ldKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoY29udGV4dCAhPSBub2RlICYmIGVIYW5kbGVMb2dpY2FsCi0JCQkJCQkJCQkJJiYgZG9jSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCQkJCQlkb2NIYW5kbGVyLnN0YXJ0RWxlbWVudChub2RlLmdldE5vZGVOYW1lKCksCi0JCQkJCQkJCQkJCWF0dHJsaXN0KTsKLQkJCQkJCQkJfQotCQkJCQkJCQlwb3N0RWxlbWVudChlbGVtZW50KTsKLQkJCQkJCQkJYnJlYWsgbm9kZV9zZWw7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChhbmNlc3RlcnNbaSAtIDFdICE9IG51bGwpIHsKLQkJCQkJCQlzZXRDb250ZXh0QmFja3dhcmQoaSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZWxlbmVudDogbWlkIik7Ci0KLQkJCQkJaWYgKGVkLmluY2x1c2lvbihsYXN0RWxlbWVudE51bWJlcikpIHsKLQkJCQkJCWNvbnRleHQuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCQkJCQlzZXRDb250ZXh0Rm9yd2FyZChlbGVtZW50KTsKLQkJCQkJCXBvc3RFbGVtZW50KGVsZW1lbnQpOwotCQkJCQkJYnJlYWsgbm9kZV9zZWw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWQgPSBhbmNlc3RlckVsZW1lbnREZWZzW2RlcHRoIC0gMV07Ci0JCQkJSU1vZGVsR3JvdXAgY29udGVudE1vZGVsID0gZWQuZ2V0Q29udGVudE1vZGVsKCk7Ci0KLQkJCQkvLyBUT0RPIGNvcnJlY3QgdGhpcwotCQkJCWlmIChjb250ZW50TW9kZWwubWF0Y2gobGFzdEVsZW1lbnROdW1iZXIpCi0JCQkJCQkmJiBjb250ZW50TW9kZWwubWF0Y2godGhpcywgY29udGV4dCwgbm9kZSkpIHsKLQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGVsOiBmb3ciKTsKLQotCQkJCQlzZXRDb250ZXh0Rm9yd2FyZChlbGVtZW50KTsKLQkJCQl9IGVsc2UgaWYgKGVkLmVuZFRhZ09taXR0YWJsZSgpKSB7Ci0KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb2RlbDogb21pdCIpOwotCi0JCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaSA9IGRlcHRoIC0gMjsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJCWVkID0gYW5jZXN0ZXJFbGVtZW50RGVmc1tpXTsKLQkJCQkJCWNvbnRlbnRNb2RlbCA9IGVkLmdldENvbnRlbnRNb2RlbCgpOwotCQkJCQkJaWYgKGNvbnRlbnRNb2RlbC5tYXRjaChsYXN0RWxlbWVudE51bWJlcikKLQkJCQkJCQkJJiYgKGZvdW5kID0gY29udGVudE1vZGVsLm1hdGNoKHRoaXMsCi0JCQkJCQkJCQkJYW5jZXN0ZXJzW2ldLCBub2RlKSkKLQkJCQkJCQkJfHwgIWVkLmVuZFRhZ09taXR0YWJsZSgpKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGVsOiBvbWl0MiAiK2ZvdW5kKTsKLQotCQkJCQlpZiAoZm91bmQpIHsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibW9kZWw6IG9rIik7Ci0JCQkJCQlzZXRDb250ZXh0KGVsZW1lbnQpOwotCQkJCQl9IGVsc2UgaWYgKCFoYW5kbGVFcnJvcihJUGFyc2VyRXJyb3IuSUxMRUdBTF9DSElMRCwgbm9kZSkpIHsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibW9kZWw6IGNoaWxkIik7Ci0KLQkJCQkJCWNvbnRleHQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0JCQkJCQlhZGRFcnJvck5vZGUoY29udGV4dCk7Ci0JCQkJCQllcnJvcihJUGFyc2VyRXJyb3IuSUxMRUdBTF9DSElMRCwgbm9kZQotCQkJCQkJCQkrICIgaXMgbm90IGFsbG93ZWQgYXMgYSBjaGlsZCBvZiAiICsgY29udGV4dCk7Ci0KLQkJCQkJCXNldENvbnRleHRGb3J3YXJkKGVsZW1lbnQpOwotCQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCQkJCS8vIHVubGVzcyB0aGUgZXJyb3IgaGFuZGxlcnMgaWdub3JlIHRoZSBub2RlCi0KLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibW9kZWw6IHBvc3QiKTsKLQotCQkJCQkJcG9zdEVsZW1lbnQoZWxlbWVudCk7Ci0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb2RlbDogb21pdDMiKTsKLQotCQkJCX0gZWxzZSBpZiAoIWhhbmRsZUVycm9yKElQYXJzZXJFcnJvci5JTExFR0FMX0NISUxELCBub2RlKSkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGVsOiBlcnJvciIpOwotCQkJCQkvLyBUT0RPID8/PwotCQkJCQljb250ZXh0LmFwcGVuZENoaWxkKGVsZW1lbnQpOwotCQkJCQlhZGRFcnJvck5vZGUoY29udGV4dCk7Ci0JCQkJCWVycm9yKElQYXJzZXJFcnJvci5JTExFR0FMX0NISUxELCBub2RlCi0JCQkJCQkJKyAiIGlzIG5vdCBhbGxvd2VkIGFzIGEgY2hpbGQgb2YgIiArIGNvbnRleHQpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4obm9kZS5nZXROb2RlTmFtZSgpK2NvbnRleHQpOwotCQkJCQlzZXRDb250ZXh0Rm9yd2FyZChlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGVsOiBlbmQiKTsKLQotCQkJCWlmIChjb250ZXh0ICE9IG5vZGUgJiYgZUhhbmRsZUxvZ2ljYWwgJiYgZG9jSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCWRvY0hhbmRsZXIuc3RhcnRFbGVtZW50KG5vZGUuZ2V0Tm9kZU5hbWUoKSwgYXR0cmxpc3QpOwotCQkJCX0KLQkJCQlwb3N0RWxlbWVudChlbGVtZW50KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5URVhUX05PREU6Ci0JCQkJaWYgKHByZXNlcnZlV2hpdGVzcGFjZSAmJiB3aGl0ZXNwYWNlVGV4dCgoVGV4dCkgbm9kZSkpIHsKLQkJCQkJZ2V0Q29udGV4dCgpLmFwcGVuZENoaWxkKG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWQgPSBhbmNlc3RlckVsZW1lbnREZWZzW2RlcHRoIC0gMV07Ci0JCQkJY29udGVudE1vZGVsID0gZWQuZ2V0Q29udGVudE1vZGVsKCk7Ci0JCQkJaWYgKGNvbnRlbnRNb2RlbC5tYXRjaChwY2RhdGFOdW1iZXIpCi0JCQkJCQkmJiBjb250ZW50TW9kZWwubWF0Y2godGhpcywgY29udGV4dCwgbm9kZSkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIGlmIChlZC5lbmRUYWdPbWl0dGFibGUoKSkgewotCQkJCQlmb3IgKGludCBpID0gZGVwdGggLSAyOyBpID49IDA7IGktLSkgewotCQkJCQkJZWQgPSBhbmNlc3RlckVsZW1lbnREZWZzW2ldOwotCQkJCQkJY29udGVudE1vZGVsID0gZWQuZ2V0Q29udGVudE1vZGVsKCk7Ci0JCQkJCQlpZiAoY29udGVudE1vZGVsLm1hdGNoKHBjZGF0YU51bWJlcikKLQkJCQkJCQkJJiYgY29udGVudE1vZGVsLm1hdGNoKHRoaXMsIGFuY2VzdGVyc1tpXSwgbm9kZSkpIHsKLQkJCQkJCQlicmVhayBub2RlX3NlbDsKLQkJCQkJCX0gZWxzZSBpZiAoIWVkLmVuZFRhZ09taXR0YWJsZSgpKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGhhbmRsZUVycm9yKElQYXJzZXJFcnJvci5JTExFR0FMX0NISUxELCBub2RlKSkKLQkJCQkJYnJlYWsgbm9kZV9zZWw7Ci0JCQkJYWRkRXJyb3JOb2RlKGNvbnRleHQpOwotCQkJCWVycm9yKElQYXJzZXJFcnJvci5JTExFR0FMX0NISUxELCAiI3RleHQoIiArIG5vZGUKLQkJCQkJCSsgIikgaXMgbm90IGFsbG93ZWQgYXMgYSBjaGlsZCBvZiAiICsgY29udGV4dCk7Ci0JCQkJY29udGV4dC5hcHBlbmRDaGlsZChub2RlKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKHRva2VuaXplci5nZXRDdXJyZW50TGluZSgpCi0JCQkJCQkrICI6IEludGVybmFsIHBhcnNlciBlcnJvciAiICsgbm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNHTUxQYXJzZXI6IGEiKTsKLQotCQlpZiAoZG9jSGFuZGxlciAhPSBudWxsICYmIGVIYW5kbGVMb2dpY2FsKSB7Ci0JCQlFbGVtZW50IHRvcCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCWlmIChnZXRDb250ZXh0KCkgIT0gdG9wKSB7Ci0JCQkJc2V0Q29udGV4dCh0b3ApOwotCQkJfQotCQkJaWYgKHRvcCAhPSBudWxsKQotCQkJCWRvY0hhbmRsZXIuZW5kRWxlbWVudCh0b3AuZ2V0Tm9kZU5hbWUoKSk7Ci0JCX0KLQkJaWYgKChub2RlID0gZ2V0Tm9kZSgpKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbnRleHQgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQlpZiAoZG9jSGFuZGxlciAhPSBudWxsICYmIGVIYW5kbGVMb2dpY2FsKSB7Ci0JCQkJZG9jSGFuZGxlci5zdGFydEVsZW1lbnQodGhpcy5jb250ZXh0LmdldE5vZGVOYW1lKCksCi0JCQkJCQludWxsQXR0cmlidXRlTGlzdCk7Ci0JCQl9Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNHTUxQYXJzZXI6IHB1c2hiYWNrIik7Ci0KLQkJCXB1c2hCYWNrTm9kZShub2RlKTsKLQkJCXJlYWRJbnN0YW5jZXMyKCk7Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTR01MUGFyc2VyOiBlbmQiKTsKLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gd2hpdGVzcGFjZVRleHQoVGV4dCB0ZXh0KSB7Ci0JCWlmICh0ZXh0IGluc3RhbmNlb2YgU0dNTFRleHQpIHsKLQkJCXJldHVybiAoKFNHTUxUZXh0KSB0ZXh0KS5nZXRJc1doaXRlc3BhY2VJbkVsZW1lbnRDb250ZW50KCk7Ci0JCX0KLQkJY2hhciBzdHJbXSA9IHRleHQuZ2V0RGF0YSgpLnRvQ2hhckFycmF5KCk7Ci0JCWZvciAoaW50IGkgPSBzdHIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHJbaV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9zdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJSU1vZGVsR3JvdXAgbWcgPSBsYXN0RWxlbWVudERlZi5nZXRDb250ZW50TW9kZWwoKTsKLQotCQlpZiAobWcgPT0gY2RhdGEpIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXROb2RlTmFtZSgpOwotCQkJTm9kZSBjZGF0YSA9IHJlYWRDREFUQSh0YWdOYW1lKTsKLQkJCWN1cnJlbnROb2RlID0gbmV3IEVuZFRhZyh0YWdOYW1lKTsKLQkJCSgoRW5kVGFnKSBjdXJyZW50Tm9kZSkuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJCW5vZGVzV2l0aEVuZHRhZy5hZGRFbGVtZW50KGVsZW1lbnQpOwotCQkJaWYgKGRvY0hhbmRsZXIgIT0gbnVsbCAmJiAhZUhhbmRsZUxvZ2ljYWwpIHsKLQkJCQlkb2NIYW5kbGVyLmVuZEVsZW1lbnQodGFnTmFtZSk7Ci0JCQl9Ci0JCQllbGVtZW50LmFwcGVuZENoaWxkKGNkYXRhKTsKLQkJCWlmIChjb250ZXh0ID09IGVsZW1lbnQpCi0JCQkJc2V0Q29udGV4dEJhY2t3YXJkKGRlcHRoIC0gMSk7Ci0KLQkJfSBlbHNlIGlmIChtZyA9PSBlbXB0eSAmJiBsYXN0RWxlbWVudERlZi5lbmRUYWdPbWl0dGFibGUoKSkgeyAvLyBtdXN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJLy8gb21pdHRlZAotCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZWxlbWVudC50b1N0cmluZygpK2xhc3RFbGVtZW50RGVmLnRvU3RyaW5nKCkpOwotCQkJaWYgKGNvbnRleHQgPT0gZWxlbWVudCkgewotCQkJCXNldENvbnRleHRCYWNrd2FyZChkZXB0aCAtIDEpOwotCQkJfSBlbHNlIGlmIChlSGFuZGxlTG9naWNhbCAmJiBkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCQlkb2NIYW5kbGVyLmVuZEVsZW1lbnQoZWxlbWVudC5nZXROb2RlTmFtZSgpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChpc1hIVE1MICYmIGlzRW5kV2l0aFNsYXNoKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZWxlbWVudC50b1N0cmluZygpK2xhc3RFbGVtZW50RGVmLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDREFUQVNlY3Rpb24gcmVhZENEQVRBKFN0cmluZyBhcmcpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlpZiAobGV4SGFuZGxlciAhPSBudWxsKSB7Ci0JCQlsZXhIYW5kbGVyLnN0YXJ0Q0RBVEEoKTsKLQkJfQotCQlTdHJpbmcgc3RyID0gdG9rZW5pemVyLnJhd1RleHQoYXJnKTsKLQkJQ0RBVEFTZWN0aW9uIHJldCA9IGRvYy5jcmVhdGVDREFUQVNlY3Rpb24oc3RyKTsKLQkJY3VycmVudE5vZGUgPSByZXQ7Ci0JCWlmIChsZXhIYW5kbGVyICE9IG51bGwpIHsKLQkJCWxleEhhbmRsZXIuZW5kQ0RBVEEoKTsKLQkJfQotCQl0b2tlbml6ZXIuZWF0Q0RBVEFFbmRUYWcoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxDQVRCPiBjb21tZW50c0JlZm9yZURvY3R5cGUgPSBuZXcgVmVjdG9yPENBVEI+KCk7Ci0KLQlwcml2YXRlIFZlY3RvciBjb21tZW50c0FmdGVyZURvY3R5cGUgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKioKLQkgKiBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcKLQkgKi8KLQljbGFzcyBDQVRCIHsKLQkJLyoqCi0JCSAqIElmIGNvbW1lbnQsIHRydWUuIE90aGVyd2lzZSwgZmFsc2UuCi0JCSAqLwotCQlib29sZWFuIGNvbW1lbnQgPSB0cnVlOwotCi0JCVN0cmluZyBzdHI7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudFR5cGUgcmVhZERvY1R5cGUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotCQkJU0FYRXhjZXB0aW9uIHsKLQkJaWYgKGxhc3REZWYgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJBbHJlYWR5IHJlYWQgRE9DVFlQRSBkZWNsYXJhdGlvbiIpOwotCQl9Ci0KLQkJY29tbWVudF9sb29wOiB3aGlsZSAodHJ1ZSkgewotCQkJc3dpdGNoICh0b2tlbml6ZXIubmV4dFRva2VuKCkpIHsKLQkJCWNhc2UgQ09NTUVOVDoKLQkJCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCQkJQ0FUQiBjYXRiID0gbmV3IENBVEIoKTsKLQkJCQkJY2F0Yi5zdHIgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCQkJY29tbWVudHNCZWZvcmVEb2N0eXBlLmFkZEVsZW1lbnQoY2F0Yik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3VycmVudE5vZGUgPSBkb2MuY3JlYXRlQ29tbWVudCh0b2tlbml6ZXIuc3ZhbCk7Ci0JCQkJCWRvYy5hcHBlbmRDaGlsZChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJCWlmIChsZXhIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJbGV4SGFuZGxlci5jb21tZW50KHNheGNoLCBiZWdpbiwgbGVuKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBJOgotCQkJCWlmIChkb2MgPT0gbnVsbCkgewotCQkJCQlDQVRCIGNhdGIgPSBuZXcgQ0FUQigpOwotCQkJCQljYXRiLmNvbW1lbnQgPSBmYWxzZTsKLQkJCQkJY2F0Yi5zdHIgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCQkJY29tbWVudHNCZWZvcmVEb2N0eXBlLmFkZEVsZW1lbnQoY2F0Yik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3VycmVudE5vZGUgPSBkb2MuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKG51bGwsCi0JCQkJCQkJdG9rZW5pemVyLnN2YWwpOwotCQkJCQlkb2MuYXBwZW5kQ2hpbGQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQlpZiAoZG9jSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCWRvY0hhbmRsZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKG51bGwsIHRva2VuaXplci5zdmFsKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1ETzoKLQkJCQlicmVhayBjb21tZW50X2xvb3A7Ci0JCQlkZWZhdWx0OgotCQkJCXRva2VuaXplci5wdXNoQmFjaygpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSAhPSBOQU1FX0NIQVIKLQkJCQkmJiAhdG9rZW5pemVyLnN2YWwuZXF1YWxzKCJET0NUWVBFIikpIHsKLQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiVW5rbm93biBkZWNsYXJhdGlvbiBhdCAiCi0JCQkJCSsgdG9rZW5pemVyLmdldEN1cnJlbnRMaW5lKCkpOwotCQl9Ci0JCS8qCi0JCSAqIE9ubHkgc3VwcG9ydHMgaW5pdGlhbGx5IHNldHRlZCBwdWJsaWMgZW50aXR5LiBGb3IgZXhhbXBsZSwgPCFET0NUWVBFCi0JCSAqIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQkJICovCi0JCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gTkFNRV9DSEFSKSB7Ci0JCQlTdHJpbmcgZG9jVHlwZU5hbWUgPSB0b2tlbml6ZXIuc3ZhbDsKLQkJCXRoaXMuZGVmYXVsdFRvcEVsZW1lbnQgPSBkb2NUeXBlTmFtZTsKLQkJCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgPT0gTkFNRV9DSEFSCi0JCQkJCSYmIHRva2VuaXplci5zdmFsLmVxdWFsc0lnbm9yZUNhc2UoIlBVQkxJQyIpKSB7Ci0JCQkJaWYgKHRva2VuaXplci5uZXh0VG9rZW4oKSA9PSAnIicpIHsKLQkJCQkJU3RyaW5nIHB1YmxpY0lEID0gdG9rZW5pemVyLmVhdFVudGlsKCciJyk7Ci0JCQkJCWlmIChlbmZvcmNlZERvY3R5cGUgIT0gbnVsbCkgewotCQkJCQkJcHVibGljSUQgPSBlbmZvcmNlZERvY3R5cGU7Ci0JCQkJCX0KLQkJCQkJaWYgKGxleEhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQkJbGV4SGFuZGxlci5zdGFydERURChkb2NUeXBlTmFtZSwgcHVibGljSUQsIG51bGwpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBlbnRpdHlGaWxlTmFtZSA9IChTdHJpbmcpIHB1YkVudGl0eU1hcC5nZXQocHVibGljSUQpOwotCQkJCQlpZiAoZW50aXR5RmlsZU5hbWUgPT0gbnVsbCkgewotCQkJCQkJaWYgKGRlZmF1bHREVEQgIT0gbnVsbCkgewotCQkJCQkJCWVycm9yKElQYXJzZXJFcnJvci5JTExFR0FMX0RPQ1RZUEUsICJJbnN0ZWFkIG9mIFwiIiArIHB1YmxpY0lECi0JCQkJCQkJCQkrICJcIiB1c2UgXCIiICsgZGVmYXVsdERURCArICJcIiBhcyBhIERURC4iKTsKLQkJCQkJCQllbnRpdHlGaWxlTmFtZSA9IChTdHJpbmcpIHB1YkVudGl0eU1hcAotCQkJCQkJCQkJLmdldChkZWZhdWx0RFREKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChlbnRpdHlGaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQkJCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKHRva2VuaXplci5nZXRDdXJyZW50TGluZSgpCi0JCQkJCQkJCQkrICI6IHRoaXMgcGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgIgotCQkJCQkJCQkJKyBwdWJsaWNJRCk7Ci0JCQkJCQl9Ci0JCQkJCQlwdWJsaWNJRCA9IGRlZmF1bHREVEQ7Ci0JCQkJCX0KLQkJCQkJc2V0dXBEVEQocHVibGljSUQpOwotCQkJCQlpZiAoZG9tSW1wbCA9PSBudWxsKSB7Ci0JCQkJCQlkb21JbXBsID0gZG9jLmdldEltcGxlbWVudGF0aW9uKCk7Ci0JCQkJCX0KLQkJCQkJRG9jdW1lbnRUeXBlIHJldCA9IG51bGw7Ci0JCQkJCWlmIChkb21JbXBsICE9IG51bGwpIHsKLQkJCQkJCWN1cnJlbnROb2RlID0gcmV0ID0gY3JlYXRlRG9jVHlwZShkb21JbXBsLCBkb2NUeXBlTmFtZSwKLQkJCQkJCQkJcHVibGljSUQpOwotCQkJCQl9Ci0JCQkJCS8vIGNvbnN1bWUgJz4nCi0JCQkJCXRva2VuaXplci5jb25zdW1lVW50aWwoJz4nKTsKLQkJCQkJdG9rZW5pemVyLnN3aXRjaFRvKERFRkFVTFQpOwotCQkJCQlsYXN0RGVmID0gZHRkLmdldEVsZW1lbnREZWZpbml0aW9uKGRvY1R5cGVOYW1lKTsKLQkJCQkJaWYgKGxhc3REZWYgPT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHRvcEVsZW1lbnROYW1lID0gZ2V0RGVmYXVsdFRvcEVsZW1lbnQoKTsKLQkJCQkJCWVycm9yKElQYXJzZXJFcnJvci5JTExFR0FMX0RPQ1RZUEUsIGRvY1R5cGVOYW1lCi0JCQkJCQkJCSsgIiBpcyBub3QgZGVmaW5lZCBhcyBhIHJvb3QgZWxlbWVudC4gIFVzZSAiCi0JCQkJCQkJCSsgdG9wRWxlbWVudE5hbWUgKyAnLicpOwotCQkJCQkJbGFzdERlZiA9IGR0ZC5nZXRFbGVtZW50RGVmaW5pdGlvbih0b3BFbGVtZW50TmFtZSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGxleEhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQkJbGV4SGFuZGxlci5lbmREVEQoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmV0OwotCQkJCX0KLQkJCX0KLQkJfQotCQl0b2tlbml6ZXIuY29uc3VtZVVudGlsKCc+Jyk7Ci0JCWVycm9yKElQYXJzZXJFcnJvci5JTExFR0FMX0RPQ1RZUEUsICJJbnZhbGlkIERPQ1RZUEUgZGVjbGFyYXRpb24uIFVzZSAiICsgZGVmYXVsdERURCk7Ci0JCXNldHVwRFREKGRlZmF1bHREVEQpOwotCQlsYXN0RGVmID0gZHRkLmdldEVsZW1lbnREZWZpbml0aW9uKGdldERlZmF1bHRUb3BFbGVtZW50KCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50VHlwZSBjcmVhdGVEb2NUeXBlKERPTUltcGxlbWVudGF0aW9uIGRvbUltcGwsCi0JCQlTdHJpbmcgZG9jVHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJRCkgewotCQkvKgotCQkgKiBGb3IgY29tcGF0aWJpbGl0eSB0byBET00gbGV2ZWwgMQotCQkgKi8KLQkJQ2xhc3MgZG9tSW1wbENsYXNzID0gZG9tSW1wbC5nZXRDbGFzcygpOwotCQlDbGFzcyBzdHJpbmdDbGFzcyA9IGRvY1R5cGVOYW1lLmdldENsYXNzKCk7Ci0JCUNsYXNzIHBhcmFtZXRlclR5cGVzW10gPSB7IHN0cmluZ0NsYXNzLCBzdHJpbmdDbGFzcywgc3RyaW5nQ2xhc3MgfTsKLQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG1ldGhvZDsKLQkJdHJ5IHsKLQkJCW1ldGhvZCA9IGRvbUltcGxDbGFzcy5nZXRNZXRob2QoImNyZWF0ZURvY3VtZW50VHlwZSIsCi0JCQkJCXBhcmFtZXRlclR5cGVzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhcmdzW10gPSB7IGRvY1R5cGVOYW1lLCBwdWJsaWNJRCwgIiIgfTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoRG9jdW1lbnRUeXBlKSBtZXRob2QuaW52b2tlKGRvbUltcGwsIChPYmplY3RbXSlhcmdzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8qCi0JCSAqIEZvciBET00gbGV2ZWwgMiB0cnkgeyByZXR1cm4gZG9tSW1wbC5jcmVhdGVEb2N1bWVudFR5cGUoZG9jVHlwZU5hbWUsCi0JCSAqIHB1YmxpY0lELCAiIik7IH0gY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7IHJldHVybiBudWxsOyB9Ci0JCSAqLwotCX0KLQotCXByaXZhdGUgTm9kZSBub2Rlc1dpdGhJbGxlZ2FsQ2hpbGRyZW5bXSA9IG5ldyBOb2RlW0JVRl9TSVpdOwotCi0JcHJpdmF0ZSBpbnQgbm9kZVdpdGhJbGxlZ2FsQ2hpbGROdW0gPSAwOwotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZE5vZGVzV2l0aElsbGVnYWxDaGlsZHJlbigpIHsKLQkJTm9kZSBuZXdOb2Rlc1tdID0gbmV3IE5vZGVbbm9kZVdpdGhJbGxlZ2FsQ2hpbGROdW0gKiAyXTsKLQkJU3lzdGVtLmFycmF5Y29weShub2Rlc1dpdGhJbGxlZ2FsQ2hpbGRyZW4sIDAsIG5ld05vZGVzLCAwLAotCQkJCW5vZGVXaXRoSWxsZWdhbENoaWxkTnVtKTsKLQkJbm9kZXNXaXRoSWxsZWdhbENoaWxkcmVuID0gbmV3Tm9kZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEVycm9yTm9kZShOb2RlIG5vZGUpIHsKLQkJZm9yIChpbnQgaSA9IG5vZGVXaXRoSWxsZWdhbENoaWxkTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChub2Rlc1dpdGhJbGxlZ2FsQ2hpbGRyZW5baV0gPT0gbm9kZSkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGVzV2l0aElsbGVnYWxDaGlsZHJlbi5sZW5ndGggPT0gbm9kZVdpdGhJbGxlZ2FsQ2hpbGROdW0pIHsKLQkJCWV4cGFuZE5vZGVzV2l0aElsbGVnYWxDaGlsZHJlbigpOwotCQl9Ci0JCW5vZGVzV2l0aElsbGVnYWxDaGlsZHJlbltub2RlV2l0aElsbGVnYWxDaGlsZE51bSsrXSA9IG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGEgc3BlY2lmaWVkIG5vZGUgaGFzIGFuIGVycm9yIG9yIG5vdC4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgbm9kZSB0byBiZSBja2Vja2VkLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+bm9kZTwvY29kZT4gaXMgYW4gZXJyb3Igbm9kZS4KLQkgKiAgICAgICAgIE90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yTm9kZShOb2RlIG5vZGUpIHsKLQkJZm9yIChpbnQgaSA9IG5vZGVXaXRoSWxsZWdhbENoaWxkTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChub2Rlc1dpdGhJbGxlZ2FsQ2hpbGRyZW5baV0gPT0gbm9kZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZWQgdGhpcyBwYXJzZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJbGFzdERlZiA9IG51bGw7Ci0JCWNvbnRleHQgPSBudWxsOwotCQlub2RlV2l0aElsbGVnYWxDaGlsZE51bSA9IDA7Ci0JCWRlcHRoID0gMDsKLQkJYW5kTWFwLmNsZWFyKCk7Ci0JCXNlcU1hcC5jbGVhcigpOwotCQlwbHVzTWFwLmNsZWFyKCk7Ci0JCWNvbW1lbnRzQmVmb3JlRG9jdHlwZS5yZW1vdmVBbGxFbGVtZW50cygpOwotCQljb21tZW50c0FmdGVyZURvY3R5cGUucmVtb3ZlQWxsRWxlbWVudHMoKTsKLQkJaWYgKGdldERPTUltcGxlbWVudGF0aW9uKCkgIT0gbnVsbCkgewotCQkJc2V0RE9NSW1wbGVtZW50YXRpb24oZ2V0RE9NSW1wbGVtZW50YXRpb24oKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKE5vZGUgY2hpbGQgPSBkb2MuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGRvYwotCQkJCQkuZ2V0Rmlyc3RDaGlsZCgpKSB7Ci0JCQkJZG9jLnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCX0KLQkJfQotCX0KLQotCWludCBnZXRDaGFyRW50aXR5KFN0cmluZyBlbnRpdHkpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sCi0JCQlTQVhFeGNlcHRpb24gewotCQlTR01MRW50aXR5UmVmZXJlbmNlIGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVyID0gZHRkLmdldEVudGl0eVJlZmVyZW5jZShlbnRpdHkpOwotCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJU0dNTEVudGl0eURlY2xhcmF0aW9uIGVkID0gZXIuZ2V0RW50aXR5RGVjbGFyYXRpb24oKTsKLQkJaW50IGNoID0gZWQuZ2V0UmVwbGFjZW1lbnRDaGFyKCk7Ci0JCWlmIChjaCAhPSAtMSkgewotCQkJcmV0dXJuIGNoOwotCQl9Ci0JCUluc1Rva2VuaXplciB0b2tlbml6ZXIyID0gbmV3IEluc1Rva2VuaXplcihlZC5nZXRSZXBsYWNlbWVudFJlYWRlcigpLAotCQkJCXRoaXMpOwotCQlpZiAodG9rZW5pemVyMi5uZXh0VG9rZW4oKSA9PSBQQ0RBVEEgJiYgdG9rZW5pemVyMi5zdmFsLmxlbmd0aCgpID09IDEpIHsKLQkJCWNoYXIgcmV0ID0gdG9rZW5pemVyMi5zdmFsLmNoYXJBdCgwKTsKLQkJCWVkLnNldFJlcGxhY2VtZW50Q2hhcihyZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiSW50ZXJuYWwgUGFyc2VyIEVycm9yOiAiICsgZW50aXR5Ci0JCQkJCSsgIiBub3QgZGVmaW5lZC4iKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgYSA8aT5Eb2N1bWVudCA8L2k+IGluc3RhbmNlIHRoYXQgd2lsbCBiZSBhIGZhY3Rvcnkgb2Ygbm9kZXMgaW4gRE9NCi0JICogdHJlZS4gVGhpcyBwYXJzZXIgY2FuIHVzZSBhbnkgaW1wbGVtZW50YXRpb24gb2YgVzNDJ3MgRE9NLiBCeSBkZWZhdWx0LAotCSAqIFBhcnNlcnMgdXNlIHtAbGluayBTR01MRG9jdW1lbnR9LiBUaGlzIG1ldGhvZCBtYWtlIHRoZSBwYXJzZXIgaW5zdGFuY2UKLQkgKiBpZ25vcmUgRE9NSW1wbGVtZW50YXRpb24gYnkgc2lkZSBlZmZlY3RzLgotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKiAgICAgICAgICAgIG5ldyBEb2N1bWVudCBpbnN0YW5jZS4KLQkgKiBAc2VlICNnZXREb2N1bWVudCgpCi0JICogQGRlcHJlY2F0ZWQgU2VlIHtAbGluayAjc2V0RE9NSW1wbGVtZW50YXRpb24oRE9NSW1wbGVtZW50YXRpb24pfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KERvY3VtZW50IGRvYykgewotCQl0aGlzLmRvYyA9IGRvYzsKLQkJZG9tSW1wbCA9IG51bGw7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUxpc3RJbXBsIGF0dHJsaXN0ID0gbnVsbDsKLQotCXB1YmxpYyBpbnQgbGFzdEVsZW1lbnROdW1iZXI7Ci0KLQlwdWJsaWMgRWxlbWVudERlZmluaXRpb24gbGFzdEVsZW1lbnREZWY7Ci0KLQlwcml2YXRlIE5vZGUgc3RhZygpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCUVsZW1lbnQgcmV0OwotCQlpc0VtcHR5RWxlbWVudCA9IHRydWU7Ci0JCWlzRW5kV2l0aFNsYXNoID0gZmFsc2U7Ci0JCWlmICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gTkFNRV9DSEFSKSB7Ci0JCQlpZiAoaGFuZGxlRXJyb3IoSVBhcnNlckVycm9yLlRBR19OQU1FLCB0b2tlbml6ZXIuc3ZhbCkpIHsKLQkJCQlyZXR1cm4gc3RhZygpOwotCQkJfQotCQkJZXJyb3IoSVBhcnNlckVycm9yLlNUQVJUVEFHX1NZTlRBWF9FUlIsCi0JCQkJCSJQZXJoYXBzIGNoYXJhY3RlciBlbmNvZGluZyBtYXkgbm90IGJlIGNvcnJlY3QuIik7Ci0JCQl3aGlsZSAodG9rZW5pemVyLm5leHRUb2tlbigpICE9IE5BTUVfQ0hBUikgewotCQkJCWlmICh0b2tlbml6ZXIudHR5cGUgPT0gRU9GIHx8IHRva2VuaXplci50dHlwZSA9PSBUQUdDKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUVsZW1lbnREZWZpbml0aW9uIGVkID0gdGhpcy5kdGQuZ2V0RWxlbWVudERlZmluaXRpb24odG9rZW5pemVyLnN2YWwpOwotCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJbGFzdEVsZW1lbnROdW1iZXIgPSBlZC5udW1iZXI7Ci0JCQlsYXN0RWxlbWVudERlZiA9IGVkOwotCQkJaXNFbXB0eUVsZW1lbnQgPSBlZC5nZXRDb250ZW50TW9kZWwoKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCSJFTVBUWSIpOwotCQl9IGVsc2UgaWYgKGtlZXBVbmtub3ducykgewotCQkJbGFzdEVsZW1lbnROdW1iZXIgPSBwY2RhdGFOdW1iZXIgKyAxOwotCQkJZWQgPSBsYXN0RWxlbWVudERlZiA9IGFub255bW91c0VsZW1lbnREZWY7Ci0JCX0KLQkJY3VycmVudE5vZGUgPSByZXQgPSBkb2MuY3JlYXRlRWxlbWVudChjaGFuZ2VUYWdDYXNlKHRva2VuaXplci5zdmFsKSk7Ci0JCS8qCi0JCSAqIGJvb2xlYW4gc3ludGF4RXJyb3IgPSBmYWxzZTsKLQkJICovCi0JCUF0dHIgYXR0ciA9IG51bGw7Ci0JCWlmIChkb2NIYW5kbGVyICE9IG51bGwpCi0JCQlhdHRybGlzdCA9IGNyZWF0ZUF0dHJpYnV0ZUxpc3QoKTsKLQkJaXNFbmRXaXRoU2xhc2ggPSBmYWxzZTsKLQkJd2hpbGUgKHRva2VuaXplci5uZXh0VG9rZW4oKSAhPSBUQUdDKSB7Ci0JCQlpZiAodG9rZW5pemVyLnR0eXBlID09ICcvJykgewotCQkJCWlzRW5kV2l0aFNsYXNoID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaXNFbmRXaXRoU2xhc2ggPSBmYWxzZTsKLQkJCX0KLQkJCWlmICh0b2tlbml6ZXIudHR5cGUgPT0gU1RBR08gfHwgdG9rZW5pemVyLnR0eXBlID09IEVUQUdPKSB7Ci0JCQkJaWYgKGhhbmRsZUVycm9yKElQYXJzZXJFcnJvci5CRUZPUkVfQVRUUk5BTUUsIHRva2VuaXplci5zdmFsKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZXJyb3IoSVBhcnNlckVycm9yLlNUQVJUVEFHX1NZTlRBWF9FUlIsICJyZXF1aXJlcyBhbiBhdHRyaWJ1dGUgaW4gIiArIHJldCk7Ci0JCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHRva2VuaXplci50dHlwZSA9PSBFT0YpIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJdG9rZW5pemVyLnB1c2hCYWNrKCk7Ci0JCQlhdHRyID0gYXR0cmlidXRlKGVkLCBhdHRybGlzdCk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJcmV0LnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQkJLyoKLQkJCQkgKiB9IGVsc2UgaWYgKCFzeW50YXhFcnJvcikgeyBzeW50YXhFcnJvciA9IHRydWU7Ci0JCQkJICogZXJyb3IoU1RBUlRUQUdfU1lOVEFYX0VSUiwgInJlcXVpcmVzIGFuIGF0dHJpYnV0ZSBhZnRlciAiICsKLQkJCQkgKiByZXQpOwotCQkJCSAqLwotCQkJfQotCQl9Ci0KLQkJaWYgKGRvY0hhbmRsZXIgIT0gbnVsbCAmJiAhZUhhbmRsZUxvZ2ljYWwpIHsKLQkJCS8vIGlmKGR0ZC50b1N0cmluZygpLmluZGV4T2YoIlhIVE1MIikgPCAwIHx8ICFlbmRXaXRoU2xhc2gpewotCQkJZG9jSGFuZGxlci5zdGFydEVsZW1lbnQocmV0LmdldE5vZGVOYW1lKCksIGF0dHJsaXN0KTsKLQkJCS8vIH0KLQkJfQotCi0JCWlmIChlZCA9PSBudWxsKSB7Ci0KLQkJCWlmICghaGFuZGxlRXJyb3IoSVBhcnNlckVycm9yLlVOS05PV05fRUxFTUVOVCwgcmV0KSkgewotCQkJCWVycm9yKElQYXJzZXJFcnJvci5VTktOT1dOX0VMRU1FTlQsICJVbmtub3duIEVsZW1lbnQ6ICIgKyByZXQuZ2V0VGFnTmFtZSgpCi0JCQkJCQkrICIuICBJZ25vcmUgaXQuIik7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIGlmIChlZCA9PSBhbm9ueW1vdXNFbGVtZW50RGVmKSB7Ci0KLQkJCWlmIChoYW5kbGVFcnJvcihJUGFyc2VyRXJyb3IuVU5LTk9XTl9FTEVNRU5ULCByZXQpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCWVycm9yKElQYXJzZXJFcnJvci5VTktOT1dOX0VMRU1FTlQsICJVbmtub3duIEVsZW1lbnQ6ICIgKyByZXQuZ2V0VGFnTmFtZSgpCi0JCQkJCQkrICIuICBEZWZpbmUgaXRzIGRlZmluaXRpb24gYXMgPCFFTEVNRU5UICIKLQkJCQkJCSsgcmV0LmdldE5vZGVOYW1lKCkudG9VcHBlckNhc2UoKSArICIgLSAtIEFOWT4iKTsKLQkJCX0KLQkJfQotCi0JCWN1cnJlbnRUYWdOYW1lID0gcmV0LmdldE5vZGVOYW1lKCk7Ci0JCS8vIGlmIChpc1hIVE1MICYmIGlzRW5kV2l0aFNsYXNoKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2xhc2ggZW5kIHRhZyIpOwotCQkvLyBpZiAoZG9jSGFuZGxlciAhPSBudWxsICYmICFlSGFuZGxlTG9naWNhbCkgewotCQkvLyBkb2NIYW5kbGVyLmVuZEVsZW1lbnQocmV0LmdldE5vZGVOYW1lKCkpOwotCQkvLyB9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihkb2NIYW5kbGVyKTsKLQkJLy8gfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgbWFrZVVuaXF1ZShTdHJpbmcgaWQpIHsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gcHViRW50aXR5TWFwLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlTdHJpbmcgcmV0ID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGlkLmVxdWFscyhyZXQpKQotCQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgZGVmYXVsdCBkdGQuIElmICZsdDshRE9DVFlQRSAuLi4gJmd0OyBzdGF0ZW1lbnQgaXMgbWlzc2luZyBpbiBhCi0JICogdG9wIG9mIGEgZG9jdW1lbnQsIGEgcGFyc2VyIHJlYWRzIGl0IGJ5IHNwZWNpZmVkIGR0ZC4KLQkgKiAKLQkgKiBAcGFyYW0gZHRkCi0JICogICAgICAgICAgICBkdGQncyBwdWJsaWMgaWQgZm9yIGRlZmF1bHQgbGlrZQotCSAqICAgICAgICAgICAgPGNvZGU+Ii0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHREVEQoU3RyaW5nIGR0ZCkgewotCQlkZWZhdWx0RFREID0gbWFrZVVuaXF1ZShkdGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW5zdGFuY2UgdmFyaWFibGUgaG9sZHMgYSBkZWZhdWx0IERURCdzIHB1YmxpYyBJRC4gSWYgYSBwYXJzZXIgbWVldHMKLQkgKiBhIHN0cmFuZ2UgRE9DVFlQRSBkZWNsYXJhdGlvbiwgaXQgcmVhZHMgYSBkb2N1bWVudCB3aXRoIHRoaXMgZGVmYXVsdCBEVEQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0RFREID0gbnVsbDsKLQotCS8qKgotCSAqIEdldHMgdG9wIGVsZW1lbnQncyBuYW1lLiBJZiB5b3Ugd2FudCB0aGUgcGFyc2VyIHRvIHJlYWQgZG9jdW1lbnQgd2l0aG91dAotCSAqIERPQ1RZUEUgZGVjbGFyYXRpb24gYXQgdGhlIHRvcCwgeW91IG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuCi0JICogc29tZSBlbGVtZW50J3MgbmFtZS4gRm9yIEhUTUwgZG9jdW1lbnRzLCBpdCByZXR1cm5zICJIVE1MIi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRvcCBlbGVtZW50J3MgbmFtZQotCSAqIEBleGNlcHRpb24gUGFyc2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBhbHdheXMgdGhyb3duLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFRvcEVsZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotCQlpZiAoZGVmYXVsdFRvcEVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlZmF1bHRUb3BFbGVtZW50OwotCQl9Ci0JCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKLQkJCQkiZG9lc24ndCBrbm93IHdoaWNoIGVsZW1lbnQgbXVzdCBiZSBhdCB0aGUgdG9wLiIpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUb3BFbGVtZW50ID0gbnVsbDsKLQotCXB1YmxpYyBpbnQgZGVmYXVsdFRhZ0Nhc2UgPSBJUGFyc2VyLlVQUEVSX0NBU0U7Ci0KLQkvKioKLQkgKiBTcGVjaWZpZXMgZWxlbWVudCBuYW1lcycgY2FzZSB3aG9zZSBzdGFydCB0YWdzIGFyZSBvbWl0dGVkLiBEZWZhdWx0Ci0JICogYmVoYXZpZXIgbWFrZXMgdGhlbSB1cHBlcmNhc2VkLgotCSAqIAotCSAqIEBwYXJhbSB0YWdDYXNlCi0JICogICAgICAgICAgICB0aGlzIG11c3QgYmUge0BsaW5rIElQYXJzZXIjVVBQRVJfQ0FTRX1vciB7QGxpbmsgSVBhcnNlciNMT1dFUl9DQVNFfS4gSWYKLQkgKiAgICAgICAgICAgIG90aGVyd2lzZSwgaWdub3JlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRUYWdDYXNlKGludCB0YWdDYXNlKSB7Ci0JCWlmICh0YWdDYXNlID09IDAgfHwgdGFnQ2FzZSA9PSBJUGFyc2VyLkxPV0VSX0NBU0UpIHsKLQkJCXRoaXMuZGVmYXVsdFRhZ0Nhc2UgPSB0YWdDYXNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlIGEgc3BlY2lmaWVkIHN0cmluZyB0byBzcGVjaWZpZWQgY2FzZWQuCi0JICogCi0JICogQHNlZSAjc2V0RGVmYXVsdFRhZ0Nhc2UoaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgY2hhbmdlRGVmYXVsdFRhZ0Nhc2UoU3RyaW5nIHRhZykgewotCQlzd2l0Y2ggKHRoaXMuZGVmYXVsdFRhZ0Nhc2UpIHsKLQkJY2FzZSBJUGFyc2VyLlVQUEVSX0NBU0U6Ci0JCQlyZXR1cm4gdGFnLnRvVXBwZXJDYXNlKCk7Ci0JCWNhc2UgSVBhcnNlci5MT1dFUl9DQVNFOgotCQkJcmV0dXJuIHRhZy50b0xvd2VyQ2FzZSgpOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIFBhcnNlciBFcnJvciIpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCB0YWdDYXNlID0gSVBhcnNlci5PUklHSU5BTF9DQVNFOwotCi0JLyoqCi0JICogU3BlY2lmaWVzIGVsZW1lbnQgbmFtZXMnIGNhc2UuIERlZmF1bHQgYmVoYXZpZXIgbWFrZXMgdGhlbSBvcmlnaW5hbAotCSAqIGNhc2VkLgotCSAqIAotCSAqIEBwYXJhbSB0YWdDYXNlCi0JICogICAgICAgICAgICB0aGlzIG11c3QgYmUge0BsaW5rIElQYXJzZXIjVVBQRVJfQ0FTRX0se0BsaW5rIElQYXJzZXIjTE9XRVJfQ0FTRX1vcgotCSAqICAgICAgICAgICAge0BsaW5rIElQYXJzZXIjT1JJR0lOQUxfQ0FTRX0uIElmIG90aGVyd2lzZSwgaWdub3JlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ0Nhc2UoaW50IHRhZ0Nhc2UpIHsKLQkJaWYgKHRhZ0Nhc2UgPT0gSVBhcnNlci5VUFBFUl9DQVNFIHx8IHRhZ0Nhc2UgPT0gSVBhcnNlci5MT1dFUl9DQVNFCi0JCQkJfHwgdGFnQ2FzZSA9PSBJUGFyc2VyLk9SSUdJTkFMX0NBU0UpIHsKLQkJCXRoaXMudGFnQ2FzZSA9IHRhZ0Nhc2U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBTdHJpbmcgY2hhbmdlVGFnQ2FzZShTdHJpbmcgdGFnKSB7Ci0JCXN3aXRjaCAodGhpcy50YWdDYXNlKSB7Ci0JCWNhc2UgSVBhcnNlci5VUFBFUl9DQVNFOgotCQkJcmV0dXJuIHRhZy50b1VwcGVyQ2FzZSgpOwotCQljYXNlIElQYXJzZXIuTE9XRVJfQ0FTRToKLQkJCXJldHVybiB0YWcudG9Mb3dlckNhc2UoKTsKLQkJY2FzZSBJUGFyc2VyLk9SSUdJTkFMX0NBU0U6Ci0JCQlyZXR1cm4gdGFnOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIFBhcnNlciBFcnJvciIpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBhdHRyQ2FzZSA9IElQYXJzZXIuT1JJR0lOQUxfQ0FTRTsKLQotCS8qKgotCSAqIFNwZWNpZmllcyBhdHRyaWJ1dGUgbmFtZXMnIGNhc2UuIERlZmF1bHQgYmVoYXZpZXIgbWFrZXMgdGhlbSBvcmlnaW5hbAotCSAqIGNhc2VkLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyQ2FzZQotCSAqICAgICAgICAgICAgdGhpcyBtdXN0IGJlIHtAbGluayBJUGFyc2VyI1VQUEVSX0NBU0V9LHtAbGluayBJUGFyc2VyI0xPV0VSX0NBU0V9b3IKLQkgKiAgICAgICAgICAgIHtAbGluayBJUGFyc2VyI09SSUdJTkFMX0NBU0V9LiBJZiBvdGhlcndpc2UsIGlnbm9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyTmFtZUNhc2UoaW50IGF0dHJDYXNlKSB7Ci0JCWlmIChhdHRyQ2FzZSA9PSBJUGFyc2VyLlVQUEVSX0NBU0UgfHwgYXR0ckNhc2UgPT0gSVBhcnNlci5MT1dFUl9DQVNFCi0JCQkJfHwgYXR0ckNhc2UgPT0gSVBhcnNlci5PUklHSU5BTF9DQVNFKSB7Ci0JCQl0aGlzLmF0dHJDYXNlID0gYXR0ckNhc2U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBTdHJpbmcgY2hhbmdlQXR0ck5hbWVDYXNlKFN0cmluZyBhdHRyKSB7Ci0JCXN3aXRjaCAodGhpcy5hdHRyQ2FzZSkgewotCQljYXNlIElQYXJzZXIuVVBQRVJfQ0FTRToKLQkJCXJldHVybiBhdHRyLnRvVXBwZXJDYXNlKCk7Ci0JCWNhc2UgSVBhcnNlci5MT1dFUl9DQVNFOgotCQkJcmV0dXJuIGF0dHIudG9Mb3dlckNhc2UoKTsKLQkJY2FzZSBJUGFyc2VyLk9SSUdJTkFMX0NBU0U6Ci0JCQlyZXR1cm4gYXR0cjsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBQYXJzZXIgRXJyb3IiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGVuZm9yY2VkRG9jdHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBJZ25vcmVzIGEgZGVjbGFyYXRpb24gYXQgdGhlIHRvcCBvZiB0aGUgZG9jdW1lbnQgYW5kIGVuZm9yY2VzIGRvY3VtZW50Ci0JICogdHlwZSBzcGVjaWZpZWQgYnkgPGNvZGU+cHVibGljSWQ8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgZW5mb3JjZURvY3R5cGUoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWVuZm9yY2VkRG9jdHlwZSA9IG1ha2VVbmlxdWUocHVibGljSWQpOwotCX0KLQotCS8qKgotCSAqIENsb3NlcyBpbnB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0b2tlbml6ZXIuY2xvc2UoKTsKLQkJdG9rZW5pemVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV4dHJhRXJySW5mbyA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXRzIGV4dHJhIGVycm9yIGluZm9ybWF0aW9uLiBBIHBhcnNlciBwYXNzZXMgdHdvIGVycm9yIGluZm9ybWF0aW9uIChlLmcuCi0JICogZXJyb3IgY29kZSBhbmQgZXJyb3Igbm9kZSkgdG8gbm9kZS1sZXZlbCBlcnJvciBoYW5kbGVycy4gSG93ZXZlciwgaXQgaXMKLQkgKiBub3cgZW5vdWdoIGZvciBzb21lIGtpbmQgb2YgZXJyb3IgaGFuZGxlcnMgdG8gcmVjb3ZlciB0aGUgZXJyb3IuIElmCi0JICoge0BsaW5rIElQYXJzZXJFcnJvciNTVURERU5fRU5EVEFHfWVycm9yIG9jY3VycywgcGFyc2VyIHNldCBtaXNzZWQgZW5kCi0JICogdGFncyBiZXR3ZWVuIGVycm9yIG5vZGUgYW5kIGZ1dHVyZSBjb250ZXh0IHRvIGV4dHJhIGVycm9yIGluZm9ybWF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RXh0cmFFcnJJbmZvKCkgewotCQlyZXR1cm4gZXh0cmFFcnJJbmZvOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYW5kbGVFcnJvcihpbnQgY29kZSwgTm9kZSBub2RlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IGVycm9ySGFuZGxlck51bSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoZXJyb3JIYW5kbGVyc1tpXS5oYW5kbGVFcnJvcihjb2RlLCB0aGlzLCBub2RlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlib29sZWFuIGhhbmRsZUVycm9yKGludCBjb2RlLCBTdHJpbmcgZXJyb3JTdHIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IHRva2VuRXJyb3JIYW5kbGVyTnVtIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmICh0b2tlbkVycm9ySGFuZGxlcnNbaV0uaGFuZGxlRXJyb3IoY29kZSwgdGhpcywgZXJyb3JTdHIpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXZvaWQgcHV0Q2hhck51bUVudGl0eShDaGFyYWN0ZXIgQywgU3RyaW5nIGVudCkgewotCQlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jIGluc3RhbmNlb2YgU0dNTERvY3VtZW50KSB7Ci0JCQkoKFNHTUxEb2N1bWVudCkgZG9jKS5wdXRDaGFyTnVtRW50aXR5KEMsIGVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnRIYW5kbGVyIGRvY0hhbmRsZXIgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyBhIDxpPkRvY3VtZW50SGFuZGxlciA8L2k+IGluc3RhbmNlIGluY2x1ZGVkIGluIHRoaXMgcGFyc2VyLgotCSAqIAotCSAqIEBzZWUgI3NldERvY3VtZW50SGFuZGxlcihvcmcueG1sLnNheC5Eb2N1bWVudEhhbmRsZXIpCi0JICovCi0JcHVibGljIERvY3VtZW50SGFuZGxlciBnZXREb2N1bWVudEhhbmRsZXIoKSB7Ci0JCXJldHVybiB0aGlzLmRvY0hhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhIDxpPkRvY3VtZW50SGFuZGxlciA8L2k+IGluc3RhY2UgZm9yIHRoaXMgcGFyc2VyLgotCSAqIAotCSAqIEBzZWUgI2dldERvY3VtZW50SGFuZGxlcigpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRIYW5kbGVyKERvY3VtZW50SGFuZGxlciBoYW5kbGVyKSB7Ci0JCXRoaXMuZG9jSGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJlc2VydmVXaGl0ZXNwYWNlID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgcGFyc2VyIHByZXNlcnZlIHdoaXRlc3BhY2VzIG9yIG5vdC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcGFyc2VyIHByZXNlcnZlIHdoaXRlc3BhY2VzLgotCSAqICAgICAgICAgT3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFByZXNlcnZlV2hpdGVzcGFjZSgpIHsKLQkJcmV0dXJuIHByZXNlcnZlV2hpdGVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoaXMgcGFyc2VyIHByZXNlcnZlIHdoaXRlc3BhY2VzIG9yIG5vdC4gSWYgcHJlc2VydmUsIHRoZQotCSAqIHBhcnNlciBjcmVhdGUgdGV4dCBub2RlIGZvciB3aGl0ZXNwYWNlIGJldHdlZW4gdGFncyBhbmQgZG9lcyBub3QgaWdub3JlCi0JICogY2FycmlhZ2UgcmV0dXJuIGFuZCBsaW5lIGZlZWQgYWZ0ZXIgc3RhcnQgdGFncyBhbmQgYmVmb3JlIGVuZCB0YWdzLiBCeQotCSAqIGRlZmF1bHQgYSBwYXJzZXIgaWdub3JlcyB3aGl0ZXNwYWNlcy4KLQkgKiAKLQkgKiBAc2VlICNnZXRQcmVzZXJ2ZVdoaXRlc3BhY2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlcnZlV2hpdGVzcGFjZShib29sZWFuIHByZXNlcnYpIHsKLQkJaWYgKHRva2VuaXplciAhPSBudWxsKSB7Ci0JCQl0b2tlbml6ZXIuc2V0UHJlc2VydmVXaGl0ZXNwYWNlKHByZXNlcnYpOwotCQl9Ci0JCXRoaXMucHJlc2VydmVXaGl0ZXNwYWNlID0gcHJlc2VydjsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoaWNoIHRoaXMgcGFyc2VyIGludm9rZXMge0BsaW5rIAotCSAqIG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlciNzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywKLQkgKiBvcmcueG1sLnNheC5BdHRyaWJ1dGVMaXN0KX0gYW5kCi0JICoge0BsaW5rIG9yZy54bWwuc2F4LkRvY3VtZW50SGFuZGxlciNlbmRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcpfQotCSAqIDxjb2RlPmxvZ2ljYWxseTwvY29kZT4gb3IgPGNvZGU+cGh5c2ljYWxseTwvY29kZT4uPGNvZGU+Ci0JICogTG9naWNhbDwvY29kZT4KLQkgKiBtZWFucyB0aGF0IGlmIGEgc3RhcnQgb3IgZW5kIHRhZyBvZiBhIGVsZW1lbnQgaXMgb21pdHRlZCwgYSBwYXJzZXIKLQkgKiBpbnZva2VzIGVhY2ggbWV0aG9kLiA8Y29kZT5QaHlzaWNhbDwvY29kZT4gbWVhbnMgdGhhdCBwYXJzZXJzIGludm9rZXMKLQkgKiBlYWNoIG1ldGhvZCBpZiBhbmQgb25seSBpZiB0aGVpciB0YWcgYXBwZWFyZW50bHkgZXhpc3QuIElmCi0JICogPGNvZGU+cGh5c2ljYWw8L2NvZGU+LCBhIHBhcnNlciBkb2VzIG5vdCBjYXJlIGlmIHRoZSB0YWcgaXMgaWxsZWdhbCBvcgotCSAqIG5vdC4gRGVmYXVsdCBpcyA8Y29kZT5waHlzaWNhbDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gbG9naWNhbAotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgZGVhbCB3aXRoIHRhZ3MgYXMgbG9naWNhbC4gT3RoZXJ3aXNlLCBhcyBwaHlzaWNhbAotCSAqLwotCXB1YmxpYyB2b2lkIGVsZW1lbnRIYW5kbGUoYm9vbGVhbiBsb2dpY2FsKSB7Ci0JCXRoaXMuZUhhbmRsZUxvZ2ljYWwgPSBsb2dpY2FsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVIYW5kbGVMb2dpY2FsID0gdHJ1ZTsKLQotCXB1YmxpYyBWZWN0b3I8RWxlbWVudD4gYXV0b0dlbmVyYXRlZCA9IG5ldyBWZWN0b3I8RWxlbWVudD4oKTsKLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhpcyBwYXJzZXIKLQkgKiBvciBub3QuIEZvciBleGFtcGxlLCA8Y29kZT5UQk9EWTwvY29kZT4gdW5kZXIgPGNvZGU+VEFCTEU8L2NvZGU+IGlzCi0JICogYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgaW4gZm9sbG93aW5nIGRvY3VtZW50LgotCSAqIAotCSAqIDxQUkU+Ci0JICogCi0JICogJmx0O1RBQkxFJmd0OyAmbHQ7VFImZ3Q7Jmx0O1REJmd0OyZsdDtURCZndDsgJmx0Oy9UQUJMRSZndDsKLQkgKiAKLQkgKiA8UFJFPgotCSAqIAotCSAqIEBwYXJhbSBhbgotCSAqICAgICAgICAgICAgZWxlbWVudCBub2RlIHRvIGJlIGNoZWNrZWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPmVsZW1lbnQ8L2NvZGU+IGlzIGF1dG9tYXRpY2FsbHkKLQkgKiAgICAgICAgIGdlbmVyYXRlZCBieSB0aGlzLiBPdGhlcndpc2UgZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYXV0b0dlbmVyYXRlZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGF1dG9HZW5lcmF0ZWQuY29udGFpbnMoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkQXV0b0dlbmVyYXRlZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJYXV0b0dlbmVyYXRlZC5hZGRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEluc2VydHMgYSBzdHJpbmcgdG8gY3VycmVudCBwb3NpdGlvbiBpbiByZWFkIHN0cmVhbS4gVGhpcyBtZXRob2QgaXMKLQkgKiB1c3VhbGx5IGludm9rZWQgYnkgdG9rZW4tbGV2ZWwgZXJyb3IgaGFuZGxlcnMuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgU3RyaW5nIHRvIGluc2VydAotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydChTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0b2tlbml6ZXIudW5yZWFkKHN0cik7Ci0JfQotCi0JcHJpdmF0ZSBBdHRyaWJ1dGVMaXN0SW1wbCBjcmVhdGVBdHRyaWJ1dGVMaXN0KCkgewotCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZUxpc3RJbXBsKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGtlZXBVbmtub3duczsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLnNnbWwuaW1wbC5JU0dNTFBhcnNlciNrZWVwVW5rbm93bkVsZW1lbnRzKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQga2VlcFVua25vd25FbGVtZW50cyhib29sZWFuIGtlZXApIHsKLQkJdGhpcy5rZWVwVW5rbm93bnMgPSBrZWVwOwotCX0KLQotCS8qKgotCSAqIEdldHMgY3VycmVudCBsaW5lIG51bWJlciBvZiBzb3VyY2UgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiBsaW5lIG51bWJlcgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLnhtbC5zYXguTG9jYXRvciNnZXRMaW5lTnVtYmVyKCl9Ci0JICovCi0JcHVibGljIGludCBnZXRDdXJyZW50TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIHRva2VuaXplci5nZXRDdXJyZW50TGluZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgY3VycmVudCBjb2x1bW4gbnVtYmVyIG9mIHNvdXJjZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGNvbHVtbiBudW1iZXIKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy54bWwuc2F4LkxvY2F0b3IjZ2V0Q29sdW1uTnVtYmVyKCl9Ci0JICovCi0JcHVibGljIGludCBnZXRDdXJyZW50Q29sdW1uTnVtYmVyKCkgewotCQlyZXR1cm4gdG9rZW5pemVyLmdldEN1cnJlbnRDb2woKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGN1cnJlbnQgcmVhZGluZyBub2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Q3VycmVudE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLmN1cnJlbnROb2RlOwotCX0KLQotCXB1YmxpYyBOb2RlIGN1cnJlbnROb2RlOwotCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudE5vZGUoTm9kZSBub2RlKSB7Ci0JCXRoaXMuY3VycmVudE5vZGUgPSBub2RlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBrZWVwQ29tbWVudCA9IHRydWU7Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoaXMgcGFyc2VyIGtlZXBzIGNvbW1lbnRzIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBpbgotCSAqIHRoZSB0cmVlIG9yIG5vdC4gQnkgZGVmYXVsdCwgaXQga2VlcHMuCi0JICogCi0JICogQHBhcmFtIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGtlZXBzLCBPdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0S2VlcENvbW1lbnQoYm9vbGVhbiBrZWVwKSB7Ci0JCXRoaXMua2VlcENvbW1lbnQgPSBrZWVwOwotCX0KLQotCXByaXZhdGUgY2hhciBzYXhjaFtdOwotCi0JcHJpdmF0ZSBpbnQgYmVnaW4sIGxlbjsKLQotCXZvaWQgc2V0Q2hhcmFjdGVyKGNoYXIgY2hbXSwgaW50IGJlZ2luLCBpbnQgbGVuKSB7Ci0JCXRoaXMuc2F4Y2ggPSBjaDsKLQkJdGhpcy5iZWdpbiA9IGJlZ2luOwotCQl0aGlzLmxlbiA9IGxlbjsKLQl9Ci0KLQlwcml2YXRlIExleGljYWxIYW5kbGVyIGxleEhhbmRsZXI7Ci0KLQkvKioKLQkgKiBOb3RlOiBkb2VzIG5vdCBzdXBwb3J0Ci0JICoge0BsaW5rIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydEVudGl0eShqYXZhLmxhbmcuU3RyaW5nKX1hbmQKLQkgKiB7QGxpbmsgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZEVudGl0eShqYXZhLmxhbmcuU3RyaW5nKX0uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV4aWNhbEhhbmRsZXIoTGV4aWNhbEhhbmRsZXIgbGV4SGFuZGxlcikgewotCQl0aGlzLmxleEhhbmRsZXIgPSBsZXhIYW5kbGVyOwotCX0KLQotCUxleGljYWxIYW5kbGVyIGdldExleGljYWxIYW5kbGVyKCkgewotCQlyZXR1cm4gdGhpcy5sZXhIYW5kbGVyOwotCX0KLQotCXZvaWQgaW5jcmVtZW50RGVwdGgoaW50IGkpIHsKLQkJdGhpcy5kZXB0aCArPSBpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICBkZXB0aAotCSAqLwotCXB1YmxpYyB2b2lkIHJlb3BlbkNvbnRleHQoaW50IGkpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQl0aGlzLmRlcHRoICs9IGk7Ci0JCXRoaXMuY29udGV4dCA9IGFuY2VzdGVyc1tkZXB0aCAtIDFdOwotCQlpZiAoIWVIYW5kbGVMb2dpY2FsIHx8IGRvY0hhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaiA9IGRlcHRoOyBqIDwgaTsgaisrKSB7Ci0JCQlkb2NIYW5kbGVyLnN0YXJ0RWxlbWVudChhbmNlc3RlcnNbal0uZ2V0Tm9kZU5hbWUoKSwKLQkJCQkJbnVsbEF0dHJpYnV0ZUxpc3QpOwotCQl9Ci0JfQotCi0JcHVibGljIEVsZW1lbnRbXSBnZXRDb250ZXh0RWxlbWVudHMoKSB7Ci0JCUVsZW1lbnQgcmV0W10gPSBuZXcgRWxlbWVudFtkZXB0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYW5jZXN0ZXJzLCAwLCByZXQsIDAsIGRlcHRoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgYSBmcmFnbWVudCB1bmRlciBzcGVjaWZpZWQgY29udGV4dC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZUZyYWdtZW50KEVsZW1lbnQgcGFyZW50LCBSZWFkZXIgcmVhZGVyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKGR0ZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkNhbid0IHBhcnNlIHdpdGhvdXQgRFREIik7Ci0JCX0gZWxzZSBpZiAoZG9jID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiQ2FuJ3QgcGFyc2Ugd2l0aG91dCBhIERvY3VtZW50Iik7Ci0JCX0KLQkJdGhpcy5hbmNlc3RlckVsZW1lbnREZWZzWzBdID0gZHRkLmdldEVsZW1lbnREZWZpbml0aW9uKHBhcmVudAotCQkJCS5nZXROb2RlTmFtZSgpKTsKLQkJaWYgKHRoaXMuYW5jZXN0ZXJFbGVtZW50RGVmc1swXSA9PSBudWxsKSB7Ci0JCQl0aGlzLmFuY2VzdGVyRWxlbWVudERlZnNbMF0gPSBhbm9ueW1vdXNFbGVtZW50RGVmOwotCQl9Ci0JCXRoaXMuYW5jZXN0ZXJzWzBdID0gcGFyZW50OwotCQl0aGlzLmNvbnRleHQgPSBwYXJlbnQ7Ci0JCWRlcHRoID0gMTsKLQkJdGhpcy50b2tlbml6ZXIgPSBuZXcgSW5zVG9rZW5pemVyKHJlYWRlciwgdGhpcyk7Ci0JCWlmIChkb2NIYW5kbGVyICE9IG51bGwpIHsKLQkJCWRvY0hhbmRsZXIuc2V0RG9jdW1lbnRMb2NhdG9yKHRoaXMudG9rZW5pemVyKTsKLQkJfQotCQl0b2tlbml6ZXIuZXh0cmFjdE51bUVudGl0eShleHRyYWN0TnVtKTsKLQkJdG9rZW5pemVyLmV4dHJhY3RDaGFyRW50aXR5KGV4dHJhY3RDaGFyKTsKLQkJdG9rZW5pemVyLnNldFByZXNlcnZlV2hpdGVzcGFjZShwcmVzZXJ2ZVdoaXRlc3BhY2UpOwotCi0JCXJlYWRJbnN0YW5jZXMyKCk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIGEgZnJhZ21lbnQuIEFzIGEgc2lkZSBlZmZlY3QsIHdhc3RlcyBhIGVsZW1lbnQgbm9kZS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBwYXJzZUZyYWdtZW50KFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwKLQkJCVBhcnNlRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlFbGVtZW50IGR1bW15ID0gZG9jICE9IG51bGwgPyBkb2MuY3JlYXRlRWxlbWVudCgiZHVtbXkiKSA6IG51bGw7Ci0JCXBhcnNlRnJhZ21lbnQoZHVtbXksIHJlYWRlcik7Ci0JCURvY3VtZW50RnJhZ21lbnQgcmV0ID0gZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKLQkJZm9yIChOb2RlIGNoaWxkID0gZHVtbXkuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGR1bW15Ci0JCQkJLmdldEZpcnN0Q2hpbGQoKSkgewotCQkJZHVtbXkucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJcmV0LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UHVzaGJhY2tCdWZmZXJTaXplKCkgewotCQlyZXR1cm4gQlVGX1NJWjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTFRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzdmYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLklQcmludFhNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIFNHTUxUZXh0IGV4dGVuZHMgU0dNTENoYXJhY3RlckRhdGEgaW1wbGVtZW50cyBUZXh0LCBJUHJpbnRYTUwgewotCXB1YmxpYyBTR01MVGV4dChTdHJpbmcgc3RyLCBEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIoc3RyLCBkb2MpOwotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFRFWFRfTk9ERTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiN0ZXh0IjsKLQl9Ci0KLQlwdWJsaWMgVGV4dCBzcGxpdFRleHQoaW50IG9mZnNldCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCVNHTUxUZXh0IHNpYmxpbmc7Ci0JCXRyeSB7Ci0JCQlzaWJsaW5nID0gbmV3IFNHTUxUZXh0KHRleHQuc3Vic3RyaW5nKG9mZnNldCksIG93bmVyRG9jdW1lbnQpOwotCQl9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBlLmdldE1lc3NhZ2UoKSkgewotCQkJfTsKLQkJfQotCQlzaWJsaW5nLnByZXZpb3VzU2libGluZyA9IHRoaXM7Ci0JCXNpYmxpbmcucGFyZW50ID0gcGFyZW50OwotCQluZXh0U2libGluZyA9IHNpYmxpbmc7Ci0JCXRleHQgPSB0ZXh0LnN1YnN0cmluZyhvZmZzZXQpOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIG9yaWdpbmFsIHN0cmluZyB3aG9zZSBjb252ZXJ0ZWQgY2hhcmFjdGVyIGVudGl0aWVzIGFyZSByZXZlcnRlZC4gSWYKLQkgKiBhbiBvcmlnaW5hbCBzdHJpbmcgaXMgImEgJmFtcDtndDsgYiIsIHRoZW4gcmV0dXJuZWQgdmFsdWUgaXMgYWxzbyAiYQotCSAqICZhbXA7Z3Q7IGIiIChlZy4gcmV0dXJuIHZhbHVlIG9mIHtAbGluayAjZ2V0Tm9kZVZhbHVlKCl9IGlzICJhICZndDsgYiIpLgotCSAqIAotCSAqIEByZXR1cm4gb3JpZ2luYWwgc3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU0dNTERvY3VtZW50IGRvYyA9IChTR01MRG9jdW1lbnQpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOwotCQkJQ2hhcmFjdGVyIEMgPSBuZXcgQ2hhcmFjdGVyKGNoKTsKLQkJCVN0cmluZyBlbnRpdHlPcmlnaW4gPSBkb2MuZ2V0RW50aXR5T3JpZ2luKEMpOwotCQkJaWYgKGVudGl0eU9yaWdpbiAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKCcmJyArIGVudGl0eU9yaWdpbiArICc7Jyk7Ci0JCQl9IGVsc2UgewotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1hNTFN0cmluZygpIHsKLQkJU0dNTERvY3VtZW50IGRvYyA9IChTR01MRG9jdW1lbnQpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IHRleHQuY2hhckF0KGkpOwotCQkJQ2hhcmFjdGVyIEMgPSBuZXcgQ2hhcmFjdGVyKGNoKTsKLQkJCVN0cmluZyBlbnRpdHlPcmlnaW4gPSBkb2MuZ2V0RW50aXR5T3JpZ2luKEMpOwotCQkJaWYgKGVudGl0eU9yaWdpbiAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKCImIyIgKyAoaW50KSBjaCArICc7Jyk7Ci0JCQl9IGVsc2UgaWYgKGNoID09ICcmJykgewotCQkJCXNiLmFwcGVuZCgiJmFtcDsiKTsKLQkJCX0gZWxzZSBpZiAoY2ggPT0gJzwnKSB7Ci0JCQkJc2IuYXBwZW5kKCImbHQ7Iik7Ci0JCQl9IGVsc2UgaWYgKGNoID09ICc+JykgewotCQkJCXNiLmFwcGVuZCgiJmd0OyIpOwotCQkJfSBlbHNlIHsKLQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50QXNYTUwoUHJpbnRXcml0ZXIgcHcsIGludCBpbmRlbnRMZXZlbCwgYm9vbGVhbiBpbmRlbnQpIHsKLQkJcHcucHJpbnQodG9YTUxTdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRBc1NHTUwoUHJpbnRXcml0ZXIgcHcsIGludCBpbmRlbnRMZXZlbCwgYm9vbGVhbiBpbmRlbnQpIHsKLQkJcHcucHJpbnQodG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzV2hpdGVzcGFjZSA9IGZhbHNlOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0SXNXaGl0ZXNwYWNlSW5FbGVtZW50Q29udGVudCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNXaGl0ZXNwYWNlOwotCX0KLQotCXZvaWQgc2V0SXNXaGl0ZXNwYWNlSW5FbGVtZW50Q29udGVudChib29sZWFuIGIpIHsKLQkJdGhpcy5pc1doaXRlc3BhY2UgPSBiOwotCX0KLQotCS8qKgotCSAqIERPTSBMZXZlbCAzCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldFdob2xlVGV4dCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFRleHQgcmVwbGFjZVdob2xlVGV4dChTdHJpbmcgY29udGVudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTFRva2VuaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL2ltcGwvU0dNTFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTk0NjY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1NHTUxUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuSVNHTUxDb25zdGFudHM7Ci0KLS8qKgotICogVG9rZW5pemVyIGludGVyZmFjZQotICovCi1hYnN0cmFjdCBjbGFzcyBTR01MVG9rZW5pemVyIGltcGxlbWVudHMgSVNHTUxDb25zdGFudHMgewotCXByb3RlY3RlZCBMaW5lTnVtYmVyUmVhZGVyIHJlYWRlcjsKLQotCXB1YmxpYyBCdWZmZXJlZFJlYWRlciBnZXRSZWFkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnJlYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiB0b2tlbiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHN2YWw7Ci0KLQkvKioKLQkgKiB0b2tlbiB0eXBlLgotCSAqLwotCXB1YmxpYyBpbnQgdHR5cGU7Ci0KLQlwcm90ZWN0ZWQgaW50IHN0YXRlID0gREVGQVVMVDsKLQotCXByb3RlY3RlZCBib29sZWFuIHB1c2hCYWNrZWQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIFNHTUxUb2tlbml6ZXIgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHJlYWRlcgotCSAqICAgICAgICAgICAgcmVhZGVyIHRoYXQgcmVhZCBTR01MIERvY3VtZW50cy4KLQkgKi8KLQlwdWJsaWMgU0dNTFRva2VuaXplcihSZWFkZXIgcmVhZGVyKSB7Ci0JCXRoaXMocmVhZGVyLCBERUZBVUxUKTsKLQl9Ci0KLQlTR01MVG9rZW5pemVyKFJlYWRlciByZWFkZXIsIGludCBzdGF0ZSkgewotCQlpZiAocmVhZGVyIGluc3RhbmNlb2YgTGluZU51bWJlclJlYWRlcikgewotCQkJdGhpcy5yZWFkZXIgPSAoTGluZU51bWJlclJlYWRlcikgcmVhZGVyOwotCQl9IGVsc2UgewotCQkJdGhpcy5yZWFkZXIgPSBuZXcgTGluZU51bWJlclJlYWRlcihyZWFkZXIpOwotCQl9Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQkJcHVzaEJhY2tlZCA9IGZhbHNlOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBpbnQgZGVmYXVsdFN0YXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEdldHMgQ3VycmVudCBMaW5lIE51bWJlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGxpbmUgbnVtYmVyLgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0Q3VycmVudExpbmUoKSB7Ci0JCXJldHVybiByZWFkZXIuZ2V0TGluZU51bWJlcigpICsgMTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSB0b2tlbiBmcm9tIGEgU0dNTCBkb2N1bWVudCBhbmQgcmV0dXJuIGEgdHlwZSBvZiB0aGUgdG9rZW4uCi0JICogCi0JICogQHJldHVybiB0eXBlIG9mIGEgcmVhZCB0b2tlbi4KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotCSAqIEBleGNlcHRpb24gUGFyc2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBhbiBVbmV4cGVjdGVkIEVPRiBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IG5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24gewotCQlpZiAocHVzaEJhY2tlZCkgewotCQkJcHVzaEJhY2tlZCA9IGZhbHNlOwotCQkJcmV0dXJuIHR0eXBlOwotCQl9Ci0JCXN3aXRjaCAoc3RhdGUpIHsKLQkJY2FzZSBERUZBVUxUOgotCQkJcmV0dXJuIGRlZmF1bHRTdGF0ZSgpOwotCQljYXNlIFRBRzoKLQkJCXJldHVybiB0YWcoKTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFB1c2ggYmFjayB0b2tlbnMuIE5leHQgY2FsbCBvZiBuZXh0VG9rZW4oKSByZXR1cm5zIGN1cnJlbnQgdHR5cGUgYW5kIHN2YWwKLQkgKiB3aWxsIG5vdCBjaGFuZ2UuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHVzaEJhY2soKSB7Ci0JCXB1c2hCYWNrZWQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENoYXJhY3RlciBSaW5nIEJ1ZmZlciBmb3IgdW5yZWFkOwotCSAqLwotCXByb3RlY3RlZCBpbnQgY2hhckJ1ZmZlcltdID0gbmV3IGludFtCVUZfU0laXTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRl9TSVogPSAxMDI0OwotCi0JcHJvdGVjdGVkIGludCBpbmRleCA9IDA7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQlyZXR1cm4gY2hhckJ1ZmZlclstLWluZGV4XTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiByZWFkZXIucmVhZCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdW5yZWFkKGludCBjaCkgewotCQljaGFyQnVmZmVyW2luZGV4KytdID0gY2g7Ci0JfQotCi0JZmluYWwgdm9pZCBzd2l0Y2hUbyhpbnQgc3RhdGUpIHsKLQkJdGhpcy5zdGF0ZSA9IHN0YXRlOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBpbnQgdGFnKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotCWZpbmFsIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLnJlYWRlci5jbG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1Vuc3luY2hyb25pemVkSGFzaHRhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvaW1wbC9VbnN5bmNocm9uaXplZEhhc2h0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDY3YzhhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9pbXBsL1Vuc3luY2hyb25pemVkSGFzaHRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbDsKLQotY2xhc3MgVW5zeW5jaHJvbml6ZWRIYXNodGFibGUgewotCWNsYXNzIEVudHJ5IHsKLQkJU3RyaW5nIGtleTsKLQotCQlFbGVtZW50RGVmaW5pdGlvbiB2YWw7Ci0KLQkJaW50IG51bTsKLQotCQlFbnRyeSBuZXh0OwotCX0KLQotCXByaXZhdGUgRWxlbWVudERlZmluaXRpb24gbGluZWFyVGFibGVbXSA9IG5ldyBFbGVtZW50RGVmaW5pdGlvblsyNTZdOwotCi0JcHJpdmF0ZSBpbnQgY291bnQgPSAwOwotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZCgpIHsKLQkJRWxlbWVudERlZmluaXRpb24gbmV3VGFibGVbXSA9IG5ldyBFbGVtZW50RGVmaW5pdGlvbltjb3VudCAqIDJdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGxpbmVhclRhYmxlLCAwLCBuZXdUYWJsZSwgMCwgY291bnQpOwotCQlsaW5lYXJUYWJsZSA9IG5ld1RhYmxlOwotCX0KLQotCXByaXZhdGUgRW50cnkgdGFibGVbXSA9IG5ldyBFbnRyeVsyNTZdOwotCi0JcHJpdmF0ZSBpbnQgaGFzaENvZGUoY2hhciBrZXlbXSkgewotCQlpbnQgcmV0ID0gMDsKLQkJZm9yIChpbnQgaSA9IGtleS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJcmV0ID0gMjUgKiByZXQgKyAoa2V5W2ldICYgMHgxZikgLSAxOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JZmluYWwgRWxlbWVudERlZmluaXRpb24gZ2V0KGludCBudW1iZXIpIHsKLQkJcmV0dXJuIGxpbmVhclRhYmxlW251bWJlcl07Ci0JfQotCi0JZmluYWwgRWxlbWVudERlZmluaXRpb24gZ2V0KFN0cmluZyBrZXkpIHsKLQkJY2hhciBzdHJbXSA9IGtleS50b0NoYXJBcnJheSgpOwotCQlmb3IgKEVudHJ5IGVudHJ5ID0gdGFibGVbMHhmZiAmIGhhc2hDb2RlKHN0cildOyBlbnRyeSAhPSBudWxsOyBlbnRyeSA9IGVudHJ5Lm5leHQpIHsKLQkJCVN0cmluZyBlbnRyeUtleSA9IGVudHJ5LmtleTsKLQkJCWlmIChlbnRyeUtleS5lcXVhbHNJZ25vcmVDYXNlKGtleSkpCi0JCQkJcmV0dXJuIGVudHJ5LnZhbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlmaW5hbCB2b2lkIHB1dChTdHJpbmcga2V5LCBFbGVtZW50RGVmaW5pdGlvbiB2YWwpIHsKLQkJY2hhciBzdHJbXSA9IGtleS50b0NoYXJBcnJheSgpOwotCQlFbnRyeSBlbnRyeSA9IG5ldyBFbnRyeSgpOwotCQllbnRyeS5rZXkgPSBrZXk7Ci0JCWVudHJ5LnZhbCA9IHZhbDsKLQkJdmFsLm51bWJlciA9IGVudHJ5Lm51bSA9IGNvdW50OwotCQlpZiAobGluZWFyVGFibGUubGVuZ3RoID09IGNvdW50KQotCQkJZXhwYW5kKCk7Ci0JCWxpbmVhclRhYmxlW2NvdW50KytdID0gdmFsOwotCQlpbnQgaW5kZXggPSAweGZmICYgaGFzaENvZGUoc3RyKTsKLQkJZW50cnkubmV4dCA9IHRhYmxlW2luZGV4XTsKLQkJdGFibGVbaW5kZXhdID0gZW50cnk7Ci0JfQotCi0JZmluYWwgaW50IHNpemUoKSB7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvbW9kZWxncm91cC9BbmRNb2RlbEdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvbW9kZWxncm91cC9BbmRNb2RlbEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMDM5ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL21vZGVsZ3JvdXAvQW5kTW9kZWxHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5tb2RlbGdyb3VwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuSVNHTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQW5kTW9kZWxHcm91cCBleHRlbmRzIENvbXBvc2l0ZU1vZGVsR3JvdXAgewotCXB1YmxpYyBBbmRNb2RlbEdyb3VwKElNb2RlbEdyb3VwIG1vZGVsR3JvdXApIHsKLSAgICAgICAgc3VwZXIobW9kZWxHcm91cCk7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgYWRkKElNb2RlbEdyb3VwIG1vZGVsR3JvdXApIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogKGEgJiBiICYgKGMgJiBkKSkgIT0gKGEgJiBiICYgYyAmIGQpCi0gICAgICAgICAqLwotICAgICAgICBjaGlsZHJlbltjaGlsZExlbmd0aCsrXSA9IG1vZGVsR3JvdXA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHJldCA9IG5ldyBTdHJpbmcoIigiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZExlbmd0aCAtIDE7IGkrKykgewotICAgICAgICAgICAgcmV0ID0gcmV0ICsgY2hpbGRyZW5baV0gKyAnJic7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0ID0gcmV0ICsgY2hpbGRyZW5bY2hpbGRMZW5ndGggLSAxXSArICcpJzsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChJU0dNTFBhcnNlciBwYXJzZXIsIE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKSB7Ci0gICAgICAgIEhhc2h0YWJsZTxOb2RlLCBBbmRDb250ZXh0PiBtYXAgPSBwYXJzZXIuZ2V0QW5kTWFwKCk7Ci0gICAgICAgIEFuZENvbnRleHQgYWMgPSAoQW5kQ29udGV4dCkgbWFwLmdldChwYXJlbnQpOwotICAgICAgICBpZiAoYWMgPT0gbnVsbCkgewotICAgICAgICAgICAgYWMgPSBuZXcgQW5kQ29udGV4dCh0aGlzKTsKLSAgICAgICAgICAgIG1hcC5wdXQocGFyZW50LCBhYyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWMucHJldiAhPSBudWxsICYmIGFjLnByZXYubWF0Y2gocGFyc2VyLCBwYXJlbnQsIGNoaWxkKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWMucHJldkluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICBhYy5tZ3NbYWMucHJldkluZGV4XSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IGNoaWxkTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIElNb2RlbEdyb3VwIG1nID0gYWMubWdzW2ldOwotICAgICAgICAgICAgaWYgKG1nICE9IG51bGwgJiYgbWcubWF0Y2gocGFyc2VyLCBwYXJlbnQsIGNoaWxkKSkgewotICAgICAgICAgICAgICAgIGFjLnByZXZJbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgaWYgKG1nIGluc3RhbmNlb2YgUmVwTW9kZWxHcm91cCB8fCBtZyBpbnN0YW5jZW9mIFBsdXNNb2RlbEdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjLnByZXYgPSBtZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCkgewotICAgICAgICBmb3IgKGludCBpID0gY2hpbGRMZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgaWYgKCFjaGlsZHJlbltpXS5vcHRpb25hbCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgQW5kQ29udGV4dCB7Ci0gICAgICAgIElNb2RlbEdyb3VwIG1nc1tdOwotCi0gICAgICAgIElNb2RlbEdyb3VwIHByZXYgPSBudWxsOwotCi0gICAgICAgIGludCBwcmV2SW5kZXggPSAtMTsKLQotICAgICAgICBBbmRDb250ZXh0KEFuZE1vZGVsR3JvdXAgYW1nKSB7Ci0gICAgICAgICAgICBtZ3MgPSBuZXcgSU1vZGVsR3JvdXBbYW1nLmNoaWxkTGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWdzW2ldID0gYW1nLmNoaWxkcmVuW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRQcmV2KElNb2RlbEdyb3VwIG1nKSB7Ci0gICAgICAgICAgICBwcmV2ID0gbWc7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL21vZGVsZ3JvdXAvQ29tcG9zaXRlTW9kZWxHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL21vZGVsZ3JvdXAvQ29tcG9zaXRlTW9kZWxHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGIzYTE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9tb2RlbGdyb3VwL0NvbXBvc2l0ZU1vZGVsR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5tb2RlbGdyb3VwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9zaXRlTW9kZWxHcm91cCBpbXBsZW1lbnRzIElNb2RlbEdyb3VwIHsKLSAgICBwcm90ZWN0ZWQgSU1vZGVsR3JvdXAgY2hpbGRyZW5bXTsKLQotICAgIHByb3RlY3RlZCBpbnQgY2hpbGRMZW5ndGg7Ci0KLSAgICBwdWJsaWMgdm9pZCByZWZlcihib29sZWFuIGluZmluaXRlKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hpbGRyZW5baV0ucmVmZXIoaW5maW5pdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbXBvc2l0ZU1vZGVsR3JvdXAoSU1vZGVsR3JvdXAgbW9kZWxHcm91cCkgewotICAgICAgICBjaGlsZHJlbiA9IG5ldyBJTW9kZWxHcm91cFsxMjhdOwotICAgICAgICBjaGlsZHJlblswXSA9IG1vZGVsR3JvdXA7Ci0gICAgICAgIGNoaWxkTGVuZ3RoID0gMTsKLSAgICAgICAgbW9kZWxHcm91cC5yZWZlcihmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2goaW50IG51bWJlcikgewotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihoYXNoW251bWJlcl0pOwotICAgICAgICByZXR1cm4gaGFzaFtudW1iZXJdOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNoW10gPSBudWxsOwotCi0gICAgcHVibGljIGJvb2xlYW5bXSByZWhhc2goaW50IHRvdGFsU2l6ZSkgewotICAgICAgICBpZiAoaGFzaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGFzaDsKLSAgICAgICAgfQotICAgICAgICBoYXNoID0gbmV3IGJvb2xlYW5bdG90YWxTaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IGNoaWxkTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGJvb2xlYW4gY2hpbGRIYXNoW10gPSBjaGlsZHJlbltpXS5yZWhhc2godG90YWxTaXplKTsKLSAgICAgICAgICAgIGlmIChjaGlsZEhhc2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSB0b3RhbFNpemUgLSAxOyBqID49IDA7IGotLSkKLSAgICAgICAgICAgICAgICAgICAgaGFzaFtqXSB8PSBjaGlsZEhhc2hbal07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0JcHVibGljIGludCBnZXRDaGlsZExlbmd0aCgpIHsKLQkJcmV0dXJuIGNoaWxkTGVuZ3RoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvbW9kZWxncm91cC9JTW9kZWxHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL21vZGVsZ3JvdXAvSU1vZGVsR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkOTdkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvbW9kZWxncm91cC9JTW9kZWxHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLm1vZGVsZ3JvdXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLklTR01MUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBJTW9kZWxHcm91cCB7Ci0JLyoqCi0JICogQ2hlY2tzIGlmIDxjb2RlPmNoaWxkPC9jb2RlPiBtYXRjaGVzIHRvIDxjb2RlPnBhcmVudDwvY29kZT4uIEFuZCBhcwotCSAqIGEgc2lkZSBlZmZlY3QsIGFkZHMgY2hpbGQgdG8gcGFyZW50IGFuZCBzZXRzIHBhcnNlcnMgY29udGV4dCB0byBpdCBpZiBpdAotCSAqIG1hdGNoZXMuCi0JICogCi0JICogQHBhcmFtIHBhcnNlcgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiAgICAgICAgICAgIG5vZGUgdG8gYmUgdGVzdGVkIGJ5IHRoaXMgbWV0aG9kCi0JICogQHJldHVybiB0cnVlIGlmIDxjb2RlPmNoaWxkPC9jb2RlPiBtYXRjaGVzIHRvIDxjb2RlPnBhcmVudDwvY29kZT4KLQkgKi8KLQlib29sZWFuIG1hdGNoKElTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpOwotCi0JcHVibGljIGJvb2xlYW4gb3B0aW9uYWwoKTsKLQotCXB1YmxpYyB2b2lkIHJlZmVyKGJvb2xlYW4gaW5maW5pdGUpOwotCi0JYm9vbGVhbiBtYXRjaChpbnQgbnVtYmVyKTsKLQotCWJvb2xlYW5bXSByZWhhc2goaW50IHRvdGFsU2l6ZSk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvbW9kZWxncm91cC9PcHRNb2RlbEdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvbW9kZWxncm91cC9PcHRNb2RlbEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NGUzOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL21vZGVsZ3JvdXAvT3B0TW9kZWxHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLm1vZGVsZ3JvdXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLklTR01MUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIE9wdE1vZGVsR3JvdXAgaW1wbGVtZW50cyBJTW9kZWxHcm91cCB7Ci0JcHJpdmF0ZSBJTW9kZWxHcm91cCBjaGlsZDsKLQotCXB1YmxpYyBPcHRNb2RlbEdyb3VwKElNb2RlbEdyb3VwIG1vZGVsR3JvdXApIHsKLQkJY2hpbGQgPSBtb2RlbEdyb3VwOwotCQltb2RlbEdyb3VwLnJlZmVyKGZhbHNlKTsKLQl9Ci0KLQkvLyBmb3IgZGVidWcuCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICIoIiArIGNoaWxkICsgIik/IjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaChJU0dNTFBhcnNlciBwYXJzZXIsIE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKSB7Ci0JCWJvb2xlYW4gcmV0ID0gdGhpcy5jaGlsZC5tYXRjaChwYXJzZXIsIHBhcmVudCwgY2hpbGQpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm9wdDogIityZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZlcihib29sZWFuIGluZmluaXRlKSB7Ci0JCWNoaWxkLnJlZmVyKGluZmluaXRlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzaFtdOwotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2goaW50IG51bWJlcikgewotCQlyZXR1cm4gaGFzaFtudW1iZXJdOwotCX0KLQotCXB1YmxpYyBib29sZWFuW10gcmVoYXNoKGludCB0b3RhbFNpemUpIHsKLQkJcmV0dXJuIGhhc2ggIT0gbnVsbCA/IGhhc2ggOiAoaGFzaCA9IGNoaWxkLnJlaGFzaCh0b3RhbFNpemUpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL21vZGVsZ3JvdXAvT3JNb2RlbEdyb3VwLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvbW9kZWxncm91cC9Pck1vZGVsR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4NzNiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvbW9kZWxncm91cC9Pck1vZGVsR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5tb2RlbGdyb3VwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLklTR01MUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuaW1wbC5FbGVtZW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBPck1vZGVsR3JvdXAgZXh0ZW5kcyBDb21wb3NpdGVNb2RlbEdyb3VwIHsKLSAgICBwdWJsaWMgT3JNb2RlbEdyb3VwKElNb2RlbEdyb3VwIG1vZGVsR3JvdXApIHsKLSAgICAgICAgc3VwZXIobW9kZWxHcm91cCk7Ci0gICAgICAgIGlmIChtb2RlbEdyb3VwIGluc3RhbmNlb2YgT3JNb2RlbEdyb3VwKSB7Ci0gICAgICAgICAgICBPck1vZGVsR3JvdXAgb3JNRyA9IChPck1vZGVsR3JvdXApIG1vZGVsR3JvdXA7Ci0gICAgICAgICAgICB0aGlzLmNoaWxkTGVuZ3RoID0gb3JNRy5jaGlsZExlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jaGlsZExlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXSA9IG9yTUcuY2hpbGRyZW5baV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAoYSB8IGIgfCAoYyB8IGQpKSA9PSAoYSB8IGIgfCBjIHwgZCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGQoSU1vZGVsR3JvdXAgbW9kZWxHcm91cCkgewotICAgICAgICBpZiAobW9kZWxHcm91cCBpbnN0YW5jZW9mIE9yTW9kZWxHcm91cCkgewotICAgICAgICAgICAgT3JNb2RlbEdyb3VwIG9yTW9kZWxHcm91cCA9IChPck1vZGVsR3JvdXApIG1vZGVsR3JvdXA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9yTW9kZWxHcm91cC5jaGlsZExlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW5bY2hpbGRMZW5ndGgrK10gPSBvck1vZGVsR3JvdXAuY2hpbGRyZW5baV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGlsZHJlbltjaGlsZExlbmd0aCsrXSA9IG1vZGVsR3JvdXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudERlZmluaXRpb25bXSBnZXRDaGlsZHJlbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEVsZW1lbnREZWZpbml0aW9uIHJldFtdID0gbmV3IEVsZW1lbnREZWZpbml0aW9uW2NoaWxkTGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZExlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICByZXRbaV0gPSAoRWxlbWVudERlZmluaXRpb24pIGNoaWxkcmVuW2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLy8gZm9yIGRlYnVnLgotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyByZXQgPSBuZXcgU3RyaW5nKCIoIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRMZW5ndGggLSAxOyBpKyspIHsKLSAgICAgICAgICAgIHJldCA9IHJldCArIGNoaWxkcmVuW2ldICsgJ3wnOwotICAgICAgICB9Ci0gICAgICAgIHJldCA9IHJldCArIGNoaWxkcmVuW2NoaWxkTGVuZ3RoIC0gMV0gKyAnKSc7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2goSVNHTUxQYXJzZXIgcGFyc2VyLCBOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5tYXRjaChwYXJzZXIsIHBhcmVudCwgY2hpbGQpKSB7Ci0vLyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm9yOiBtYXRjaCIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvcjogb3V0Iik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBvcHRpb25hbCgpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IGNoaWxkTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5vcHRpb25hbCgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL21vZGVsZ3JvdXAvUGx1c01vZGVsR3JvdXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9tb2RlbGdyb3VwL1BsdXNNb2RlbEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMGM1NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL21vZGVsZ3JvdXAvUGx1c01vZGVsR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5tb2RlbGdyb3VwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwuSVNHTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgUGx1c01vZGVsR3JvdXAgaW1wbGVtZW50cyBJTW9kZWxHcm91cCB7Ci0gICAgcHJpdmF0ZSBJTW9kZWxHcm91cCBjaGlsZDsKLQotICAgIFJlcE1vZGVsR3JvdXAgcmVwOwotCi0gICAgcHVibGljIFBsdXNNb2RlbEdyb3VwKElNb2RlbEdyb3VwIG1vZGVsR3JvdXApIHsKLSAgICAgICAgY2hpbGQgPSBtb2RlbEdyb3VwOwotICAgICAgICByZXAgPSBuZXcgUmVwTW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICB9Ci0KLSAgICAvLyBmb3IgZGVidWcuCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICIoIiArIGNoaWxkICsgIikrIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChJU0dNTFBhcnNlciBwYXJzZXIsIE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKSB7Ci0gICAgICAgIEhhc2h0YWJsZTxOb2RlLCBOb2RlPiBtYXAgPSBwYXJzZXIuZ2V0UGx1c01hcCgpOwotICAgICAgICBib29sZWFuIHJldDsKLSAgICAgICAgaWYgKG1hcC5nZXQocGFyZW50KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXQgPSB0aGlzLmNoaWxkLm1hdGNoKHBhcnNlciwgcGFyZW50LCBjaGlsZCk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChwYXJlbnQsIHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicGx1czogIityZXQpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHJlcC5tYXRjaChwYXJzZXIsIHBhcmVudCwgY2hpbGQpOwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInBsdXM6ICIrcmV0KTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBvcHRpb25hbCgpIHsKLSAgICAgICAgcmV0dXJuIGNoaWxkLm9wdGlvbmFsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVmZXIoYm9vbGVhbiBpbmZpbml0ZSkgewotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNoW107Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaChpbnQgbnVtYmVyKSB7Ci0gICAgICAgIHJldHVybiBoYXNoW251bWJlcl07Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW5bXSByZWhhc2goaW50IHRvdGFsU2l6ZSkgewotICAgICAgICByZXR1cm4gaGFzaCAhPSBudWxsID8gaGFzaCA6IChoYXNoID0gcmVwLnJlaGFzaCh0b3RhbFNpemUpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL21vZGVsZ3JvdXAvUmVwTW9kZWxHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL21vZGVsZ3JvdXAvUmVwTW9kZWxHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDcwMDk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9tb2RlbGdyb3VwL1JlcE1vZGVsR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5tb2RlbGdyb3VwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC5JU0dNTFBhcnNlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBSZXBNb2RlbEdyb3VwIGltcGxlbWVudHMgSU1vZGVsR3JvdXAgewotCXByaXZhdGUgSU1vZGVsR3JvdXAgY2hpbGQ7Ci0KLQlwdWJsaWMgUmVwTW9kZWxHcm91cChJTW9kZWxHcm91cCBtb2RlbEdyb3VwKSB7Ci0JCWNoaWxkID0gbW9kZWxHcm91cDsKLQkJbW9kZWxHcm91cC5yZWZlcih0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIigiICsgY2hpbGQgKyAiKSoiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoKElTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJcGFyc2VyLmNsZWFyQ29udGV4dE1hcChwYXJlbnQpOwotCQlyZXR1cm4gdGhpcy5jaGlsZC5tYXRjaChwYXJzZXIsIHBhcmVudCwgY2hpbGQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG9wdGlvbmFsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZlcihib29sZWFuIGluZmluaXRlKSB7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc2hbXTsKLQotCXB1YmxpYyBib29sZWFuIG1hdGNoKGludCBudW1iZXIpIHsKLQkJcmV0dXJuIGhhc2hbbnVtYmVyXTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbltdIHJlaGFzaChpbnQgdG90YWxTaXplKSB7Ci0JCXJldHVybiBoYXNoICE9IG51bGwgPyBoYXNoIDogKGhhc2ggPSBjaGlsZC5yZWhhc2godG90YWxTaXplKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL21vZGVsZ3JvdXAvU2VxTW9kZWxHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL21vZGVsZ3JvdXAvU2VxTW9kZWxHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGJjNDE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC9tb2RlbGdyb3VwL1NlcU1vZGVsR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwubW9kZWxncm91cDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sLklQYXJzZXJFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLklTR01MUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgU2VxTW9kZWxHcm91cCBleHRlbmRzIENvbXBvc2l0ZU1vZGVsR3JvdXAgewotCXB1YmxpYyBTZXFNb2RlbEdyb3VwKElNb2RlbEdyb3VwIG1vZGVsR3JvdXApIHsKLQkJc3VwZXIobW9kZWxHcm91cCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKElNb2RlbEdyb3VwIG1vZGVsR3JvdXApIHsKLQkJLyoKLQkJICogKGEgLCBiLCAoYywgZCkpID09IChhLCBiLCBjLCBkKQotCQkgKi8KLQkJaWYgKG1vZGVsR3JvdXAgaW5zdGFuY2VvZiBTZXFNb2RlbEdyb3VwKSB7Ci0JCQlTZXFNb2RlbEdyb3VwIGFub3RoZXIgPSAoU2VxTW9kZWxHcm91cCkgbW9kZWxHcm91cDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5vdGhlci5jaGlsZExlbmd0aDsgaSsrKSB7Ci0JCQkJYW5vdGhlci5jaGlsZHJlbltpXS5yZWZlcihmYWxzZSk7Ci0JCQkJdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkTGVuZ3RoKytdID0gYW5vdGhlci5jaGlsZHJlbltpXTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNoaWxkcmVuW2NoaWxkTGVuZ3RoKytdID0gbW9kZWxHcm91cDsKLQkJCW1vZGVsR3JvdXAucmVmZXIoZmFsc2UpOwotCQl9Ci0JfQotCi0JLy8gZm9yIGRlYnVnLgotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyByZXQgPSBuZXcgU3RyaW5nKCIoIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRMZW5ndGggLSAxOyBpKyspIHsKLQkJCXJldCA9IHJldCArIGNoaWxkcmVuW2ldICsgJywnOwotCQl9Ci0JCXJldCA9IHJldCArIGNoaWxkcmVuW2NoaWxkTGVuZ3RoIC0gMV0gKyAnKSc7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLy8gVE9ETyBzdXBwb3J0IG5lc3RlZCBzZXFNb2RlbAotCXB1YmxpYyBib29sZWFuIG1hdGNoKElTR01MUGFyc2VyIHBhcnNlciwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpIHsKLQkJSGFzaHRhYmxlPE5vZGUsIEludGVnZXI+IG1hcCA9IHBhcnNlci5nZXRTZXFNYXAoKTsKLQkJSW50ZWdlciBjdXJyZW50ID0gKEludGVnZXIpIG1hcC5nZXQocGFyZW50KTsKLQkJSU1vZGVsR3JvdXAgbWc7Ci0JCWludCBpbmRleCA9IGN1cnJlbnQgPT0gbnVsbCA/IDAgOiBjdXJyZW50LmludFZhbHVlKCk7Ci0JCS8vIHByZWZldGNoIDIKLQkJaW50IHJlc3QgPSAwOwotCQkvLyBpbnQgY3VySW5kZXggPSBpbmRleDsKLQkJSU1vZGVsR3JvdXAgc2tpcHBlZFtdID0gcGFyc2VyLmdldFNlcUFycmF5KCk7Ci0JCWludCBza2lwcGVkTnVtID0gMDsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1hdGNoOiAxc3QiKTsKLQkJd2hpbGUgKGluZGV4IDwgY2hpbGRMZW5ndGgpIHsKLQkJCW1nID0gY2hpbGRyZW5baW5kZXhdOwotCi0JCQlpZiAobWcubWF0Y2gocGFyc2VyLCBwYXJlbnQsIGNoaWxkKSkgewotCQkJCWlmICghKG1nIGluc3RhbmNlb2YgUGx1c01vZGVsR3JvdXApCi0JCQkJCQkmJiAhKG1nIGluc3RhbmNlb2YgUmVwTW9kZWxHcm91cCkpIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQkJaWYgKHNraXBwZWROdW0gPiAwKSB7Ci0JCQkJCXBhcnNlci5lcnJvcihJUGFyc2VyRXJyb3IuSUxMRUdBTF9DSElMRCwgIk9yZGVyIG9mICIKLQkJCQkJCQkrIHBhcmVudCArICIncyBjaGlsZHJlbiBpcyB3cm9uZy4iKTsKLQkJCQl9Ci0KLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1hdGNoOiB0cnVlICIraW5kZXgpOwotCi0JCQkJbWFwLnB1dChwYXJlbnQsIG5ldyBJbnRlZ2VyKGluZGV4KSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKG1nLm9wdGlvbmFsKCkpIHsKLQkJCQlpbmRleCsrOwotCQkJfSBlbHNlIGlmIChyZXN0IDwgMikgewotCQkJCXNraXBwZWRbc2tpcHBlZE51bSsrXSA9IG1nOwotCQkJCXJlc3QrKzsKLQkJCQlpbmRleCsrOwotCQkJfSBlbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1hdGNoOiBmYWxzZSIpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1hdGNoOiAybmQiKTsKLQkJLy8gc2VhcmNoIGJlZm9yZSBpbmRleCwgaWYgZm91bmQgLT4gZXJyb3IKLQkJLyoKLQkJICogZm9yIChpbnQgaSA9IGN1ckluZGV4IC0gMjsgaSA+PSAwOyBpLS0pIHsgbWcgPSBjaGlsZHJlbltpXTsgaWYKLQkJICogKG1nLm1hdGNoKHBhcnNlciwgcGFyZW50LCBjaGlsZCkpIHsgLy8gbWFwLnB1dChwYXJlbnQsIG5ldyBJbnRlZ2VyKGkgKwotCQkgKiAxKSk7IG91dGVyMTogZm9yIChOb2RlIHByZXYgPSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsgcHJldiAhPQotCQkgKiBudWxsOyApIHsgaW50IHByZXZJRCA9IGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCA/Ci0JCSAqIHBhcnNlci5nZXREVEQoKS5nZXRFbGVtZW50RGVmaW5pdGlvbihwcmV2LmdldE5vZGVOYW1lKCkpLm51bWJlciA6Ci0JCSAqIHBhcnNlci5wY2RhdGFOdW1iZXI7IGZvciAoaW50IGogPSBpICsgMTsgaiA8IGN1ckluZGV4OyBqKyspIHsgbWcgPQotCQkgKiBjaGlsZHJlbltqXTsgaWYgKG1nLm1hdGNoKHByZXZJRCkpIHsgcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJICogcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgcHJldik7IHByZXYgPSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJICogY29udGludWUgb3V0ZXIxOyB9IH0gcHJldiA9IHByZXYuZ2V0UHJldmlvdXNTaWJsaW5nKCk7IH0KLQkJICogcGFyc2VyLmVycm9yKFNHTUxDb25zdGFudHMuSUxMRUdBTF9DSElMRCwgIk9yZGVyIG9mICIgKyBwYXJlbnQgKyAiJ3MKLQkJICogY2hpbGRyZW4gaXMgd3JvbmcuIik7IHJldHVybiB0cnVlOyB9IH0KLQkJICovCi0JCU5vZGUgc2libGluZyA9IHBhcmVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKHNpYmxpbmcgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudAotCQkJCSYmIHNpYmxpbmcuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGNoaWxkLmdldE5vZGVOYW1lKCkpCi0JCQkJJiYgcGFyc2VyLmF1dG9HZW5lcmF0ZWQoKEVsZW1lbnQpIHNpYmxpbmcpKSB7Ci0JCQkvLyBtdXN0IGJlIGVycm9yCi0JCQl3aGlsZSAoc2libGluZy5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlOb2RlIHNpYkNoaWxkID0gc2libGluZy5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJc2libGluZy5yZW1vdmVDaGlsZChzaWJDaGlsZCk7Ci0JCQkJY2hpbGQuYXBwZW5kQ2hpbGQoc2liQ2hpbGQpOwotCQkJfQotCQkJcGFyZW50LnJlcGxhY2VDaGlsZChjaGlsZCwgc2libGluZyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gb3B0aW9uYWwoKSB7Ci0JCWZvciAoaW50IGkgPSBjaGlsZExlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoIWNoaWxkcmVuW2ldLm9wdGlvbmFsKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvdXRpbC9FcnJvckhhbmRsZXJUYWJsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC91dGlsL0Vycm9ySGFuZGxlclRhYmxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDZlNGMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC91dGlsL0Vycm9ySGFuZGxlclRhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBHb2ggS09ORE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5zZ21sLnV0aWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JRXJyb3JIYW5kbGVyOwotCi0vKioKLSAqIEZvciBKREsxLjIgb3IgbGF0ZXIKLSAqLwotcHVibGljIGNsYXNzIEVycm9ySGFuZGxlclRhYmxlSW1wbCBleHRlbmRzIEhhc2h0YWJsZTxVUkwsIElFcnJvckhhbmRsZXJbXT4gaW1wbGVtZW50cwotCQlJRXJyb3JIYW5kbGVyVGFibGUgewotCXB1YmxpYyBFcnJvckhhbmRsZXJUYWJsZUltcGwoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJUHJvcGVydGllcyBwcm9wID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJdHJ5IHsKLQkJCXByb3AubG9hZChnZXRDbGFzcygpCi0JCQkJCS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJlcnJvcmhhbmRsZXJzLnByb3BlcnRpZXMiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWZvciAoRW51bWVyYXRpb24gZSA9IHByb3Aua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIHVybFN0ciA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkJCVVSTCB1cmw7Ci0JCQl0cnkgewotCQkJCXVybCA9IG5ldyBVUkwodXJsU3RyKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgewotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcHV0KHVybCwgY3JlYXRlRXJyb3JIYW5kbGVycygoU3RyaW5nKSBwcm9wLmdldCh1cmxTdHIpKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBlcnJvckhhbmRsZXJOYW1lQXJyYXlbXSA9IG5ldyBTdHJpbmdbMTI4XTsKLQotCXByaXZhdGUgSUVycm9ySGFuZGxlcltdIGNyZWF0ZUVycm9ySGFuZGxlcnMoU3RyaW5nIGVycm9ySGFuZGxlck5hbWVzKSB7Ci0JCWludCBsYXN0Q29tbWEgPSAwOwotCQlpbnQgZXJyb3JIYW5kbGVyTnVtID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvckhhbmRsZXJOYW1lcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoZXJyb3JIYW5kbGVyTmFtZXMuY2hhckF0KGkpID09ICcsJykgewotCQkJCWVycm9ySGFuZGxlck5hbWVBcnJheVtlcnJvckhhbmRsZXJOdW0rK10gPSBlcnJvckhhbmRsZXJOYW1lcwotCQkJCQkJLnN1YnN0cmluZyhsYXN0Q29tbWEsIGkpOwotCQkJCWxhc3RDb21tYSA9IGkgKyAxOwotCQkJfQotCQl9Ci0JCWVycm9ySGFuZGxlck5hbWVBcnJheVtlcnJvckhhbmRsZXJOdW0rK10gPSBlcnJvckhhbmRsZXJOYW1lcwotCQkJCS5zdWJzdHJpbmcobGFzdENvbW1hKTsKLQotCQlJRXJyb3JIYW5kbGVyIHJldFtdID0gbmV3IElFcnJvckhhbmRsZXJbZXJyb3JIYW5kbGVyTnVtXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlcnJvckhhbmRsZXJOdW07IGkrKykgewotCQkJdHJ5IHsKLQkJCQlDbGFzcyBlcnJvckhhbmRsZXJDbGFzcyA9IENsYXNzCi0JCQkJCQkuZm9yTmFtZShlcnJvckhhbmRsZXJOYW1lQXJyYXlbaV0pOwotCQkJCXJldFtpXSA9IChJRXJyb3JIYW5kbGVyKSBlcnJvckhhbmRsZXJDbGFzcy5uZXdJbnN0YW5jZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIElFcnJvckhhbmRsZXJbXSBnZXRFcnJvckhhbmRsZXJzKFVSTCB1cmwpIHsKLQkJcmV0dXJuIChJRXJyb3JIYW5kbGVyW10pIGdldCh1cmwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC91dGlsL0lFcnJvckhhbmRsZXJUYWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL3V0aWwvSUVycm9ySGFuZGxlclRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDU1YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL3V0aWwvSUVycm9ySGFuZGxlclRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwudXRpbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSUVycm9ySGFuZGxlcjsKLQotcHVibGljIGludGVyZmFjZSBJRXJyb3JIYW5kbGVyVGFibGUgewotICAgIHB1YmxpYyBJRXJyb3JIYW5kbGVyW10gZ2V0RXJyb3JIYW5kbGVycyhVUkwgdXJsKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC91dGlsL0lNdXRhYmxlVHJlZU5vZGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvdXRpbC9JTXV0YWJsZVRyZWVOb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGQ4NjhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC91dGlsL0lNdXRhYmxlVHJlZU5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwudXRpbDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuKjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi1wdWJsaWMgaW50ZXJmYWNlIElNdXRhYmxlVHJlZU5vZGVGYWN0b3J5IHsKLQlwdWJsaWMgTXV0YWJsZVRyZWVOb2RlIGNyZWF0ZU5vZGUoTm9kZSBub2RlKTsKLQotCXB1YmxpYyBNdXRhYmxlVHJlZU5vZGUgZ2V0Tm9kZShOb2RlIG5vZGUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL3V0aWwvTXV0YWJsZVRyZWVOb2RlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC91dGlsL011dGFibGVUcmVlTm9kZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNWQyMWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL3V0aWwvTXV0YWJsZVRyZWVOb2RlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgR29oIEtPTkRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5kb20uc2dtbC51dGlsOwotCi1pbXBvcnQgamF2YXguc3dpbmcudHJlZS4qOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBNdXRhYmxlVHJlZU5vZGVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIElNdXRhYmxlVHJlZU5vZGVGYWN0b3J5IHsKLQkvKioKLQkgKiBLZXk6IERPTSBOb2RlLCBWYWx1ZTogTXV0YWJsZVRyZWVOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgSGFzaHRhYmxlPE5vZGUsIE11dGFibGVUcmVlTm9kZUltcGw+IHRhYmxlID0gbmV3IEhhc2h0YWJsZTxOb2RlLCBNdXRhYmxlVHJlZU5vZGVJbXBsPigpOwotCi0JcHVibGljIE11dGFibGVUcmVlTm9kZSBjcmVhdGVOb2RlKE5vZGUgbm9kZSkgewotCQlNdXRhYmxlVHJlZU5vZGVJbXBsIHJldCA9IChNdXRhYmxlVHJlZU5vZGVJbXBsKSB0YWJsZS5nZXQobm9kZSk7Ci0JCWlmIChyZXQgPT0gbnVsbCkgewotCQkJcmV0ID0gbmV3IE11dGFibGVUcmVlTm9kZUltcGwobm9kZSwgdGhpcyk7Ci0JCQl0YWJsZS5wdXQobm9kZSwgcmV0KTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBNdXRhYmxlVHJlZU5vZGUgZ2V0Tm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChNdXRhYmxlVHJlZU5vZGVJbXBsKSB0YWJsZS5nZXQobm9kZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL3V0aWwvTXV0YWJsZVRyZWVOb2RlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL3V0aWwvTXV0YWJsZVRyZWVOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQxNTYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vc2dtbC91dGlsL011dGFibGVUcmVlTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEdvaCBLT05ET0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZG9tLnNnbWwudXRpbDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuKjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgTXV0YWJsZVRyZWVOb2RlSW1wbCBpbXBsZW1lbnRzIE11dGFibGVUcmVlTm9kZSB7Ci0JcHJpdmF0ZSBOb2RlIGRvbU5vZGU7Ci0KLQlwcml2YXRlIElNdXRhYmxlVHJlZU5vZGVGYWN0b3J5IGZhY3Rvcnk7Ci0KLQlwdWJsaWMgTm9kZSBnZXREb21Ob2RlKCkgewotCQlyZXR1cm4gZG9tTm9kZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJTXV0YWJsZVRyZWVOb2RlRmFjdG9yeSBzZmFjdG9yeTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFNlZSB7QGxpbmsgSU11dGFibGVUcmVlTm9kZUZhY3Rvcnl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBNdXRhYmxlVHJlZU5vZGVJbXBsIGNyZWF0ZU5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChzZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzZmFjdG9yeSA9IG5ldyBNdXRhYmxlVHJlZU5vZGVGYWN0b3J5SW1wbCgpOwotCQl9Ci0JCXJldHVybiAoTXV0YWJsZVRyZWVOb2RlSW1wbCkgc2ZhY3RvcnkuY3JlYXRlTm9kZShub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTXV0YWJsZVRyZWVOb2RlSW1wbChOb2RlIG5vZGUsIElNdXRhYmxlVHJlZU5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJdGhpcy5kb21Ob2RlID0gbm9kZTsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZG9tTm9kZS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBUcmVlTm9kZSBnZXRDaGlsZEF0KGludCBjaGlsZEluZGV4KSB7Ci0JCU5vZGUgcmV0OwotCQlmb3IgKHJldCA9IGRvbU5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZEluZGV4ID4gMCAmJiByZXQgIT0gbnVsbDsgcmV0ID0gcmV0Ci0JCQkJLmdldE5leHRTaWJsaW5nKCksIGNoaWxkSW5kZXgtLSkKLQkJCTsKLQkJcmV0dXJuIHJldCAhPSBudWxsID8gZmFjdG9yeS5jcmVhdGVOb2RlKHJldCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKLQkJaW50IHJldCA9IDA7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGRvbU5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpCi0JCQlyZXQrKzsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgVHJlZU5vZGUgZ2V0UGFyZW50KCkgewotCQlOb2RlIGRvbVBhcmVudCA9IGRvbU5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlyZXR1cm4gZG9tUGFyZW50ID09IG51bGwgPyBudWxsIDogZmFjdG9yeS5jcmVhdGVOb2RlKGRvbVBhcmVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbmRleChUcmVlTm9kZSBub2RlKSB7Ci0JCU5vZGUgdGFyZ2V0Q2hpbGQgPSAoKE11dGFibGVUcmVlTm9kZUltcGwpIG5vZGUpLmRvbU5vZGU7Ci0JCWludCByZXQgPSAwOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBkb21Ob2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZAotCQkJCS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQgPT0gdGFyZ2V0Q2hpbGQpIHsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfSBlbHNlIHsKLQkJCQlyZXQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBkb21Ob2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCBkb21Ob2RlIGluc3RhbmNlb2YgRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMZWFmKCkgewotCQlyZXR1cm4gIShkb21Ob2RlIGluc3RhbmNlb2YgRWxlbWVudCkgJiYgIWRvbU5vZGUuaGFzQ2hpbGROb2RlcygpCi0JCQkJJiYgIShkb21Ob2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpOwotCX0KLQotCXB1YmxpYyBFbnVtZXJhdGlvbiBjaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGlvbigpIHsKLQkJCXByaXZhdGUgTm9kZSBuZXh0Q2hpbGQgPSBkb21Ob2RlLmdldEZpcnN0Q2hpbGQoKTsKLQotCQkJcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQkJCXJldHVybiBuZXh0Q2hpbGQgIT0gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKLQkJCQlpZiAobmV4dENoaWxkID09IG51bGwpCi0JCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQkJTXV0YWJsZVRyZWVOb2RlIHJldCA9IGZhY3RvcnkuY3JlYXRlTm9kZShuZXh0Q2hpbGQpOwotCQkJCW5leHRDaGlsZCA9IG5leHRDaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0KE11dGFibGVUcmVlTm9kZSBjaGlsZCwgaW50IGluZGV4KSB7Ci0JCU5vZGUgYWZ0ZXI7Ci0JCWZvciAoYWZ0ZXIgPSBkb21Ob2RlLmdldEZpcnN0Q2hpbGQoKTsgYWZ0ZXIgIT0gbnVsbCAmJiBpbmRleCA+IDA7IGFmdGVyID0gYWZ0ZXIKLQkJCQkuZ2V0TmV4dFNpYmxpbmcoKSwgaW5kZXgtLSkKLQkJCTsKLQkJZG9tTm9kZS5pbnNlcnRCZWZvcmUoKChNdXRhYmxlVHJlZU5vZGVJbXBsKSBjaGlsZCkuZG9tTm9kZSwgYWZ0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJTm9kZSBjaGlsZDsKLQkJZm9yIChjaGlsZCA9IGRvbU5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBpbmRleCA+IDAgJiYgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZAotCQkJCS5nZXROZXh0U2libGluZygpLCBpbmRleC0tKQotCQkJOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCWRvbU5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShNdXRhYmxlVHJlZU5vZGUgbm9kZSkgewotCQlkb21Ob2RlLnJlbW92ZUNoaWxkKCgoTXV0YWJsZVRyZWVOb2RlSW1wbCkgbm9kZSkuZG9tTm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXNlck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQl0aGlzLmRvbU5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVBhcmVudCgpIHsKLQkJZG9tTm9kZS5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQoZG9tTm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE11dGFibGVUcmVlTm9kZSBuZXdQYXJlbnQpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvdXRpbC9lcnJvcmhhbmRsZXJzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZG9tL3NnbWwvdXRpbC9lcnJvcmhhbmRsZXJzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMjMyNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5odG1sL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9zZ21sL3V0aWwvZXJyb3JoYW5kbGVycy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzZiZDdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjM2E0YjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFY2xpcHNlIEFDVEYgT0RGIE1vZGVsIFBsdWctaW4gKEluY3ViYXRpb24pCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYKLUJ1bmRsZS1WZXJzaW9uOiAwLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmFjdGYuY29yZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmFuaW0sCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtYXQsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm1hbmlmZXN0LAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5udW1iZXIsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZSwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucHJlc2VudGF0aW9uLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZSwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN2ZywKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuYWNjZXNzaWJpbGl0eSwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5jb252ZXJ0ZXIsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnhsaW5rCi1CdW5kbGUtQ2xhc3NQYXRoOiBvZGZhcGkuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5vZGYuT2RmUGx1Z2luCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxZGJjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1ZDA5Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLQkJCSAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgb2RmYXBpLmphcgotamFycy5jb21waWxlLm9yZGVyID0gb2RmYXBpLmphcgotc291cmNlLm9kZmFwaS5qYXIgPSBzcmMvCi1vdXRwdXQub2RmYXBpLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvT0RGQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL09ERkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjIyNDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvT0RGQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGY7Ci0KLS8qKgotICogT0RGQ29uc3RhbnRzIGRlZmluZXMgdGhlIGNvbnN0YW50IHZhbHVlcyB1c2VkIGJ5IE9ERiBET00gQVBJCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBPREZDb25zdGFudHMgewotCXB1YmxpYyBlbnVtIENvbnRlbnRUeXBlIHsKLQkJV1JJVEUsIFNQUkVBRFNIRUVULCBQUkVTRU5UQVRJT04sIERSQVcsIENIQVJULCBOT05FCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0RUX1NVRkZJWCA9ICIub2R0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9EU19TVUZGSVggPSAiLm9kcyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPRFBfU1VGRklYID0gIi5vZHAiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0RGX01BTklGRVNUX0RJUiA9ICJNRVRBLUlORiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPREZfQ09OVEVOVF9GSUxFTkFNRSA9ICJjb250ZW50LnhtbCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPREZfU1RZTEVfRklMRU5BTUUgPSAic3R5bGVzLnhtbCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPREZfTUFOSUZFU1RfRklMRU5BTUUgPSBPREZfTUFOSUZFU1RfRElSCi0JCQkrIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKSArICJtYW5pZmVzdC54bWwiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvT0RGRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL09ERkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTVmNjJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvT0RGRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGY7Ci0KLS8qKgotICogV2hlbiBhIE9ERiBwYXJzZXIgbWVldHMgYW4gdW5leHBlY3RlZCBhbmQgdW5yZWNvdmVyYWJsZSBlcnJvciwgT0RGRXhjZXB0aW9uIGlzIHRocm93bgotICovCi1wdWJsaWMgY2xhc3MgT0RGRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTE4OTk5MDk3NTA2ODQ1MTcxOEw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgT0RGRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIE9ERkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBjYXVzZQotCSAqLwotCXB1YmxpYyBPREZFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNhdXNlCi0JICovCi0JcHVibGljIE9ERkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIoY2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9PREZQYXJzZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvT0RGUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNmZmOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9PREZQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGY7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZEb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBPREZQYXJzZXIgaXMgdXNlZCB3aGVuIHBhcnNpbmcgT0RGIGRvY3VtZW50cy4KLSAqLwotcHVibGljIGNsYXNzIE9ERlBhcnNlciB7Ci0KLQlwcml2YXRlIElucHV0U3RyZWFtIGdldEZpbGVJbnB1dFN0cmVhbShTdHJpbmcgb2RmTmFtZSwgU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTChvZGZOYW1lKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCVppcEVudHJ5IHppcEVudHJ5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZShuZXcgRmlsZSh1cmwudG9VUkkoKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl6aXBGaWxlID0gbmV3IFppcEZpbGUob2RmTmFtZSk7Ci0JCQl9Ci0JCQlTdHJpbmcgemlwRmlsZU5hbWUgPSBmaWxlTmFtZS5yZXBsYWNlQWxsKCJcXFxcIiwgIi8iKTsKLQkJCXppcEVudHJ5ID0gemlwRmlsZS5nZXRFbnRyeSh6aXBGaWxlTmFtZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQlpZiAoemlwRW50cnkgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpcyA9IHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oemlwRW50cnkpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVPREZOb2RlKE5vZGUgcGFyZW50LCBPREZEb2N1bWVudCBvZGZEb2MsCi0JCQlPREZOb2RlIG9kZk5vZGVQYXJlbnQpIHsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9ICgoRWxlbWVudCkgcGFyZW50KS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAoKGF0dHJzICE9IG51bGwpICYmIChhdHRycy5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCSgoT0RGRG9jdW1lbnRJbXBsKSBvZGZEb2MpLmdldE9ERk5vZGUoYXR0cnMuaXRlbShpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTm9kZUxpc3QgbmwgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSAhPSAwKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBjaGlsZCA9IG5sLml0ZW0oaSk7Ci0KLQkJCQlPREZOb2RlIG9kZkNoaWxkID0gKChPREZEb2N1bWVudEltcGwpIG9kZkRvYykuZ2V0T0RGTm9kZShjaGlsZCk7Ci0JCQkJY3JlYXRlT0RGTm9kZShjaGlsZCwgb2RmRG9jLCBvZGZDaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE9ERkRvY3VtZW50IHBhcnNlKElucHV0U291cmNlIGlzKSB7Ci0JCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCWRvY3VtZW50ID0gZG9jdW1lbnRCdWlsZGVyLnBhcnNlKGlzKTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCU5vZGUgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQlPREZEb2N1bWVudCBvZGZEb2MgPSBuZXcgT0RGRG9jdW1lbnRJbXBsKGRvY3VtZW50KTsKLQkJT0RGTm9kZSBvZGZEb2NSb290ID0gKE9ERk5vZGUpIG9kZkRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJY3JlYXRlT0RGTm9kZShyb290LCBvZGZEb2MsIG9kZkRvY1Jvb3QpOwotCi0JCXJldHVybiBvZGZEb2M7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIGEgT0RGIGRvY3VtZW50IGFuZCByZXR1cm4gZG9jdW1lbnQuIAotCSAqCi0JICogQHBhcmFtIG9kZk5hbWUKLQkgKiAgICAgICAgICAgIGZpbGUgcGF0aCBvZiBPREYgZG9jdW1lbnQgdG8gcGFyc2UKLQkgKiBAcGFyYW0geG1sTmFtZQotCSAqICAgICAgICAgICAgWE1MIGZpbGUgbmFtZSBjb21wcmVzc2VkIGluIE9ERiBmaWxlCi0JICogQHJldHVybiBEb2N1bWVudC4KLQkgKi8JCi0JcHVibGljIE9ERkRvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyBvZGZOYW1lLCBTdHJpbmcgeG1sTmFtZSkgewotCQlPREZEb2N1bWVudCBvZGZEb2MgPSBudWxsOwotCQl0cnkgewotCQkJSW5wdXRTdHJlYW0gaXMgPSBnZXRGaWxlSW5wdXRTdHJlYW0ob2RmTmFtZSwgeG1sTmFtZSk7Ci0JCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJCW9kZkRvYyA9IHBhcnNlKG5ldyBJbnB1dFNvdXJjZShpcykpOwotCQkJCWlzLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gb2RmRG9jOwotCX0KLQotCS8qKgotCSAqIFBhcnNlcyBhIE9ERiBkb2N1bWVudCBhbmQgcmV0dXJuIGRvY3VtZW50IGludGVyZmFjZSBvZiAiY29udGVudC54bWwiLiAKLQkgKgotCSAqIEBwYXJhbSBvZGZOYW1lCi0JICogICAgICAgICAgICBmaWxlIHBhdGggb2YgT0RGIGRvY3VtZW50IHRvIHBhcnNlCi0JICogQHJldHVybiBEb2N1bWVudC4KLQkgKi8JCi0JcHVibGljIE9ERkRvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyBvZGZOYW1lKSB7Ci0JCU9ERkRvY3VtZW50IGNvbnRlbnREb2MgPSBnZXREb2N1bWVudChvZGZOYW1lLAotCQkJCU9ERkNvbnN0YW50cy5PREZfQ09OVEVOVF9GSUxFTkFNRSk7Ci0JCU9ERkRvY3VtZW50IHN0eWxlRG9jID0gZ2V0RG9jdW1lbnQob2RmTmFtZSwKLQkJCQlPREZDb25zdGFudHMuT0RGX1NUWUxFX0ZJTEVOQU1FKTsKLQotCQlpZiAoY29udGVudERvYyAhPSBudWxsKSB7Ci0JCQljb250ZW50RG9jLnNldFN0eWxlRG9jdW1lbnQoc3R5bGVEb2MpOwotCQkJY29udGVudERvYy5zZXRVUkwob2RmTmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudERvYzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGZpbGUgbmFtZSBsaXN0IGNvbXByZXNzZWQgaW4gT0RGIGRvY3VtZW50LiAKLQkgKgotCSAqIEBwYXJhbSBvZGZOYW1lCi0JICogICAgICAgICAgICBmaWxlIHBhdGggb2YgT0RGIGRvY3VtZW50IHRvIHBhcnNlCi0JICogQHJldHVybiBmaWxlIG5hbWUgbGlzdC4KLQkgKi8JCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRGaWxlRW50cmllcyhTdHJpbmcgb2RmTmFtZSkgewotCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOwotCi0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTChvZGZOYW1lKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQl6aXBGaWxlID0gbmV3IFppcEZpbGUodXJsLmdldFBhdGgoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZShvZGZOYW1lKTsKLQkJCX0KLQkJCUVudW1lcmF0aW9uIGVudHJpZXMgPSB6aXBGaWxlLmVudHJpZXMoKTsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7Ci0JCQkJbGlzdC5hZGQobmFtZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEV4dHJhY3QgYW5kIGNvcHkgZmlsZSBjb21wcmVzc2VkIGluIE9ERiBkb2N1bWVudC4gCi0JICoKLQkgKiBAcGFyYW0gb2RmTmFtZQotCSAqICAgICAgICAgICAgZmlsZSBwYXRoIG9mIE9ERiBkb2N1bWVudCB0byBwYXJzZQotCSAqIEBwYXJhbSBlbnRyeQotCSAqICAgICAgICAgICAgZmlsZSBuYW1lIGNvbXByZXNzZWQgaW4gT0RGIGRvY3VtZW50Ci0JICogQHBhcmFtIG91dHB1dEZpbGVOYW1lCi0JICogICAgICAgICAgICBmaWxlIHBhdGggdG8gY29weSBmaWxlIGV4dHJhY3RlZCBmcm9tIE9ERiBkb2N1bWVudAotCSAqLwkJCQotCXB1YmxpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBvZGZOYW1lLCBTdHJpbmcgZW50cnksIFN0cmluZyBvdXRwdXRGaWxlTmFtZSkgewotCQlJbnB1dFN0cmVhbSBpcyA9IGdldEZpbGVJbnB1dFN0cmVhbShvZGZOYW1lLCBlbnRyeSk7Ci0JCUZpbGVVdGlscy5zYXZlVG9GaWxlKGlzLCBvdXRwdXRGaWxlTmFtZSwgdHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9hbmltL0FuaW1Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYW5pbS9BbmltQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOGM4YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9hbmltL0FuaW1Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5hbmltOwotCi0vKioKLSAqIEFuaW1Db25zdGFudHMgZGVmaW5lcyB0aGUgY29uc3RhbnQgdmFsdWVzIHVzZWQgYnkgYW5pbWF0aW9uIG5hbWVzcGFjZSBvZiBPREYgRE9NIEFQSQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQW5pbUNvbnN0YW50cyB7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQU5JTV9OQU1FU1BBQ0VfVVJJID0gInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6YW5pbWF0aW9uOjEuMCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BBUiA9ICJwYXIiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9Db250ZW50QmFzZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9Db250ZW50QmFzZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2OWNkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvQ29udGVudEJhc2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkNvbnN0YW50cy5Db250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSUNvbnRlbnRSYW5nZTsKLQotLyoqCi0gKiBPREYgZWxlbWVudHMgdGhhdCBoYXMgPG9mZmljZTpib2R5PiBlbGVtZW50IGFzIHBhcmVudCBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRCYXNlRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgY29udGVudCB0eXBlIGRlZmluZWQgaW4ge0BsaW5rIE9ERkNvbnN0YW50cyNDb250ZW50VHlwZX0uCi0JICogCi0JICogQHJldHVybiBPREYgZG9jdW1lbnQgdHlwZQotCSAqLwotCXB1YmxpYyBDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBuZXdseSBjcmVhdGVkIHJhbmdlIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gbmV3IHJhbmdlIGluc3RhbmNlCi0JICovCi0JSUNvbnRlbnRSYW5nZSBjcmVhdGVSYW5nZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9EcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9EcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxZjY1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvRHJhd2luZ09iamVjdEJhc2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuRGVzY0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN2Zy5UaXRsZUVsZW1lbnQ7Ci0KLS8qKgotICogQWxsIGdyYXBoaWNzIE9ERiBlbGVtZW50cyBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERyYXdpbmdPYmplY3RCYXNlRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBUaXRsZUVsZW1lbnQgZ2V0U1ZHVGl0bGVFbGVtZW50KCk7Ci0KLQlwdWJsaWMgRGVzY0VsZW1lbnQgZ2V0U1ZHRGVzY0VsZW1lbnQoKTsKLQotCXB1YmxpYyBPREZFbGVtZW50IGdldFNob3J0RGVzY0VsZW1lbnQoKTsKLQotCXB1YmxpYyBPREZFbGVtZW50IGdldExvbmdEZXNjRWxlbWVudCgpOwotCi0JLy8gZm9yIE5vdGVzOCwgTm90ZXM4IHNhdmUgZG9jdW1lbnQgYnkgT0RGIDEuMSBzY2hlbWEsCi0JLy8gYnV0IG9kZjp2ZXJzaW9uIGlzIHNldCBhcyAxLjAKLQlwdWJsaWMgT0RGRWxlbWVudCBnZXRTaG9ydERlc2NFbGVtZW50KGRvdWJsZSB2ZXJzaW9uKTsKLQotCXB1YmxpYyBPREZFbGVtZW50IGdldExvbmdEZXNjRWxlbWVudChkb3VibGUgdmVyc2lvbik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL0RyYXdpbmdPYmplY3RFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvRHJhd2luZ09iamVjdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBlYzM4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvRHJhd2luZ09iamVjdEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuVGV4dEJveEVsZW1lbnQ7Ci0KLS8qKgotICogR3JhcGhpY3MgT0RGIGVsZW1lbnRzIHRoYXQgZG8gbm90IGhhdmUgPGRyYXc6ZnJhbWU+IGFzIHBhcmVudCBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERyYXdpbmdPYmplY3RFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEJhc2VFbGVtZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3Q2FwdGlvbklkKCk7Ci0KLQlsb25nIGdldEhlaWdodCgpOwotCi0JbG9uZyBnZXRXaWR0aCgpOwotCi0JbG9uZyBnZXRYKCk7Ci0KLQlsb25nIGdldFkoKTsKLQotCXZvaWQgc2V0SGVpZ2h0KGxvbmcgaGVpZ2h0KTsKLQotCXZvaWQgc2V0V2lkdGgobG9uZyB3aWR0aCk7Ci0KLQl2b2lkIHNldFgobG9uZyB4KTsKLQotCXZvaWQgc2V0WShsb25nIHkpOwotCi0JbG9uZyBnZXRQYWdlSW5kZXgoKTsKLQotCWxvbmcgZ2V0WkluZGV4KCk7Ci0KLQlwdWJsaWMgVGV4dEJveEVsZW1lbnQgZ2V0Qm91bmRDYXB0aW9uVGV4dEJveEVsZW1lbnQoKTsKLQotCS8vIGZvciBOb3RlczgsIE5vdGVzOCBzYXZlIGRvY3VtZW50IGJ5IE9ERiAxLjEgc2NoZW1hLAotCS8vIGJ1dCBvZGY6dmVyc2lvbiBpcyBzZXQgYXMgMS4wCi0JcHVibGljIFRleHRCb3hFbGVtZW50IGdldEJvdW5kQ2FwdGlvblRleHRCb3hFbGVtZW50KGRvdWJsZSB2ZXJzaW9uKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL0VtYmVkRHJhd2luZ09iamVjdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQzZThhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5GcmFtZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuU2VxdWVuY2VFbGVtZW50OwotCi0vKioKLSAqIEdyYXBoaWNzIE9ERiBlbGVtZW50cyB0aGF0IGhhdmUgPGRyYXc6ZnJhbWU+IGFzIHBhcmVudCBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnQgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQgewotCXB1YmxpYyBGcmFtZUVsZW1lbnQgZ2V0RnJhbWVFbGVtZW50KCk7Ci0KLQlwdWJsaWMgU2VxdWVuY2VFbGVtZW50IGdldFRleHRTZXF1ZW5jZUVsZW1lbnQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGQXR0ci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERkF0dHIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE3YWY4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGQXR0ci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2U7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotCi0vKioKLSAqIFRoZSBleHRlbmRlZCBpbnRlcmZhY2Ugb2YgdGhlIHtAbGluayBBdHRyfS4KLSAqLwotcHVibGljIGludGVyZmFjZSBPREZBdHRyIGV4dGVuZHMgT0RGTm9kZSwgQXR0ciB7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGQ2hhcmFjdGVyRGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERkNoYXJhY3RlckRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlODAxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGQ2hhcmFjdGVyRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2U7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotCi0vKioKLSAqIFRoZSBleHRlbmRlZCBpbnRlcmZhY2Ugb2YgdGhlIHtAbGluayBDaGFyYWN0ZXJEYXRhfS4KLSAqLwotcHVibGljIGludGVyZmFjZSBPREZDaGFyYWN0ZXJEYXRhIGV4dGVuZHMgT0RGTm9kZSwgQ2hhcmFjdGVyRGF0YSB7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGQ29tbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERkNvbW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkNDEzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGQ29tbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2U7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotCi0vKioKLSAqIFRoZSBleHRlbmRlZCBpbnRlcmZhY2Ugb2YgdGhlIHtAbGluayBDb21tZW50fS4KLSAqLwotcHVibGljIGludGVyZmFjZSBPREZDb21tZW50IGV4dGVuZHMgT0RGQ2hhcmFjdGVyRGF0YSwgQ29tbWVudCB7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGRG9jdW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDY0YzZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2U7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBUaGUgZXh0ZW5kZWQgaW50ZXJmYWNlIG9mIHRoZSB7QGxpbmsgRG9jdW1lbnR9LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ERkRvY3VtZW50IGV4dGVuZHMgRG9jdW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0VVJMKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRVUkwoU3RyaW5nIHNVcmwpOwotCi0JcHVibGljIHZvaWQgc2V0T0RGVmVyc2lvbihkb3VibGUgdmVyc2lvbik7Ci0KLQlwdWJsaWMgZG91YmxlIGdldE9ERlZlcnNpb24oKTsKLQotCXB1YmxpYyB2b2lkIHNldFN0eWxlRG9jdW1lbnQoT0RGRG9jdW1lbnQgc3R5bGVEb2MpOwotCi0JcHVibGljIE9ERkRvY3VtZW50IGdldFN0eWxlRG9jdW1lbnQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzZmEwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2U7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFRoZSBleHRlbmRlZCBpbnRlcmZhY2Ugb2YgdGhlIHtAbGluayBFbGVtZW50fS4KLSAqLwotcHVibGljIGludGVyZmFjZSBPREZFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERk5hbWVkTm9kZU1hcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERk5hbWVkTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTk3YWVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZOYW1lZE5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFRoZSBleHRlbmRlZCBpbnRlcmZhY2Ugb2YgdGhlIHtAbGluayBOYW1lZE5vZGVNYXB9LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ERk5hbWVkTm9kZU1hcCBleHRlbmRzIE5hbWVkTm9kZU1hcCB7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERk5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I0N2IxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2U7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoZSBleHRlbmRlZCBpbnRlcmZhY2Ugb2YgdGhlIHtAbGluayBOb2RlfS4KLSAqLwotcHVibGljIGludGVyZmFjZSBPREZOb2RlIGV4dGVuZHMgTm9kZSB7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGTm9kZUxpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZOb2RlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzU3NDhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZOb2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2U7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBUaGUgZXh0ZW5kZWQgaW50ZXJmYWNlIG9mIHRoZSB7QGxpbmsgTm9kZUxpc3R9LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ERk5vZGVMaXN0IGV4dGVuZHMgTm9kZUxpc3QgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERlByb2Nlc3NpbmdJbnN0cnVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERlByb2Nlc3NpbmdJbnN0cnVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmVjOTk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9PREZQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotCi0vKioKLSAqIFRoZSBleHRlbmRlZCBpbnRlcmZhY2Ugb2YgdGhlIHtAbGluayBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb259LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ERlByb2Nlc3NpbmdJbnN0cnVjdGlvbiBleHRlbmRzIE9ERk5vZGUsCi0JCVByb2Nlc3NpbmdJbnN0cnVjdGlvbiB7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGVGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL09ERlRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIwOTJkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvT0RGVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2U7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqIFRoZSBleHRlbmRlZCBpbnRlcmZhY2Ugb2YgdGhlIHtAbGluayBUZXh0fS4KLSAqLwotcHVibGljIGludGVyZmFjZSBPREZUZXh0IGV4dGVuZHMgT0RGQ2hhcmFjdGVyRGF0YSwgVGV4dCB7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9BYnN0cmFjdE9ERk5vZGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9BYnN0cmFjdE9ERk5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYjY5MDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvQWJzdHJhY3RPREZOb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPREZOb2RlRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIENvbnN0cnVjdG9yIGZpbmRFbGVtZW50Q29uc3RyYWN0b3IoQ2xhc3MgY3MpIHsKLQkJQ29uc3RydWN0b3JbXSBjb25zdHJ1Y3RvcnMgPSBjcy5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJQ2xhc3NbXSBwYXJtcyA9IGNvbnN0cnVjdG9yc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJaWYgKHBhcm1zLmxlbmd0aCA9PSAyICYmIHBhcm1zWzBdLmVxdWFscyhPREZEb2N1bWVudC5jbGFzcykKLQkJCQkJJiYgcGFybXNbMV0uZXF1YWxzKEVsZW1lbnQuY2xhc3MpKSB7Ci0JCQkJcmV0dXJuIGNvbnN0cnVjdG9yc1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChPREZEb2N1bWVudCBvZGZEb2MsIFN0cmluZyB0YWdOYW1lLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL0RyYXdpbmdPYmplY3RCYXNlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL0RyYXdpbmdPYmplY3RCYXNlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkNTM0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9EcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQgewotCi0JcHJvdGVjdGVkIERyYXdpbmdPYmplY3RCYXNlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgT0RGRWxlbWVudCBnZXRTaG9ydERlc2NFbGVtZW50KCkgewotCQlPREZEb2N1bWVudCBkb2MgPSAoT0RGRG9jdW1lbnQpIHRoaXMuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlyZXR1cm4gZ2V0U2hvcnREZXNjRWxlbWVudChkb2MuZ2V0T0RGVmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgT0RGRWxlbWVudCBnZXRTaG9ydERlc2NFbGVtZW50KGRvdWJsZSB2ZXJzaW9uKSB7Ci0JCWlmICh2ZXJzaW9uID09IDEuMCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0U1ZHRGVzY0VsZW1lbnQoKTsKLQkJfSBlbHNlIGlmICh2ZXJzaW9uID4gMS4wKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRTVkdUaXRsZUVsZW1lbnQoKTsKLQkJfSBlbHNlIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oImludmFsaWQgb2ZmaWNlIHZlcnNpb24iKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT0RGRWxlbWVudCBnZXRMb25nRGVzY0VsZW1lbnQoKSB7Ci0JCU9ERkRvY3VtZW50IGRvYyA9IChPREZEb2N1bWVudCkgdGhpcy5nZXRPd25lckRvY3VtZW50KCk7Ci0JCXJldHVybiBnZXRMb25nRGVzY0VsZW1lbnQoZG9jLmdldE9ERlZlcnNpb24oKSk7Ci0JfQotCi0JcHVibGljIE9ERkVsZW1lbnQgZ2V0TG9uZ0Rlc2NFbGVtZW50KGRvdWJsZSB2ZXJzaW9uKSB7Ci0JCWlmICh2ZXJzaW9uID09IDEuMCkgewotCQkJbmV3IE9ERkV4Y2VwdGlvbigibG9uZyBkZXNjIGlzIG5vdCBhdmFpbGFibGUgZm9yIE9ERiAxLjAiKQotCQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZWxzZSBpZiAodmVyc2lvbiA+IDEuMCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0U1ZHRGVzY0VsZW1lbnQoKTsKLQkJfSBlbHNlIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oImludmFsaWQgb2ZmaWNlIHZlcnNpb24iKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9EcmF3aW5nT2JqZWN0RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNlYjBiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9EcmF3aW5nT2JqZWN0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzLkNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRHJhd0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5HRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5QYWdlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5UZXh0Qm94RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkJvZHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuRG9jdW1lbnRDb250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLlNwcmVhZFNoZWV0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLkRlc2NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuU1ZHQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuVGl0bGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC54cGF0aC5YUGF0aFNlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIERyYXdpbmdPYmplY3RFbGVtZW50SW1wbCBleHRlbmRzCi0JCURyYXdpbmdPYmplY3RCYXNlRWxlbWVudEltcGwgaW1wbGVtZW50cyBEcmF3aW5nT2JqZWN0RWxlbWVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBYUGF0aFNlcnZpY2UgeHBhdGhTZXJ2aWNlID0gWFBhdGhTZXJ2aWNlRmFjdG9yeQotCQkJLm5ld1NlcnZpY2UoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgRVhQMSA9IHhwYXRoU2VydmljZQotCQkJLmNvbXBpbGUoIi4vKlsobmFtZXNwYWNlLXVyaSgpPSciICsgU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJCi0JCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIFNWR0NvbnN0YW50cy5FTEVNRU5UX1RJVExFCi0JCQkJCSsgIicpXSIpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEVYUDIgPSB4cGF0aFNlcnZpY2UKLQkJCS5jb21waWxlKCIuLypbKG5hbWVzcGFjZS11cmkoKT0nIiArIFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSQotCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBTVkdDb25zdGFudHMuRUxFTUVOVF9ERVNDCi0JCQkJCSsgIicpXSIpOwotCi0JcHJvdGVjdGVkIERyYXdpbmdPYmplY3RFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdDYXB0aW9uSWQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQ0FQVElPTl9JRCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9DQVBUSU9OX0lEKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0SGVpZ2h0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRXaWR0aCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0WCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0WSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KGxvbmcgaGVpZ2h0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdpZHRoKGxvbmcgd2lkdGgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0WChsb25nIHgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0WShsb25nIHkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIGxvbmcgZ2V0UGFnZUluZGV4KCkgewotCQkvLyBpZiBwcmVzZW50YXRpb24gZG9jCi0JCVBhZ2VFbGVtZW50IHBhZ2UgPSBudWxsOwotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJd2hpbGUgKG51bGwgIT0gcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUGFnZUVsZW1lbnQpIHsKLQkJCQlwYWdlID0gKFBhZ2VFbGVtZW50KSBwYXJlbnQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoKG51bGwgPT0gcGFyZW50KSB8fCAocGFyZW50IGluc3RhbmNlb2YgQm9keUVsZW1lbnQpKQotCQkJCWJyZWFrOwotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlpZiAobnVsbCAhPSBwYWdlKQotCQkJcmV0dXJuIHBhZ2UuZ2V0UGFnZUluZGV4KCk7Ci0KLQkJLy8gaWYgc3ByZWFkc2hlZXQgZG9jCi0JCVRhYmxlRWxlbWVudCBzaGVldCA9IG51bGw7Ci0JCXBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJd2hpbGUgKG51bGwgIT0gcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgVGFibGVFbGVtZW50KSB7Ci0JCQkJTm9kZSBncGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAoZ3BhcmVudCBpbnN0YW5jZW9mIFNwcmVhZFNoZWV0RWxlbWVudCkgewotCQkJCQlzaGVldCA9IChUYWJsZUVsZW1lbnQpIHBhcmVudDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKChudWxsID09IHBhcmVudCkgfHwgKHBhcmVudCBpbnN0YW5jZW9mIEJvZHlFbGVtZW50KSkKLQkJCQlicmVhazsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKG51bGwgIT0gc2hlZXQpIHsKLQkJCWludCBzaGVldEluZGV4ID0gMDsKLQotCQkJTm9kZSBwcmVTaWIgPSBzaGVldC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCXdoaWxlIChwcmVTaWIgIT0gbnVsbCkgewotCQkJCWlmIChwcmVTaWIgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpCi0JCQkJCXNoZWV0SW5kZXgrKzsKLQkJCQlwcmVTaWIgPSBwcmVTaWIuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBzaGVldEluZGV4OwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBsb25nIGdldFpJbmRleCgpIHsKLQkJLy8gT3Blbk9mZmljZS5vcmcgc2F2ZSBkcmF3OnotaW5kZXggYXR0cmlidXRlIGZvciBhbGwgZ3JhcGhpYyBvYmplY3QgaW4KLQkJLy8gT0RUIGFuZCBPRFMKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9aX0lOREVYKSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoCi0JCQkJCQlEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCURyYXdDb25zdGFudHMuQVRUUl9aX0lOREVYKSkuaW50VmFsdWUoKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQkvLyBPcGVuT2ZmaWNlLm9yZyBkb24ndCBzYXZlIGRyYXc6ei1pbmRleCBhdHRyaWJ1dGUgZm9yIGFsbCBncmFwaGljCi0JCS8vIG9iamVjdCBpbiBPRFAKLQkJRG9jdW1lbnRDb250ZW50RWxlbWVudCBjb250ZW50ID0gKERvY3VtZW50Q29udGVudEVsZW1lbnQpIG9kZkRvYwotCQkJCS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJQ29udGVudFR5cGUgdHlwZSA9IGNvbnRlbnQuZ2V0Qm9keUVsZW1lbnQoKS5nZXRDb250ZW50KCkKLQkJCQkuZ2V0Q29udGVudFR5cGUoKTsKLQkJaWYgKCh0eXBlID09IENvbnRlbnRUeXBlLlBSRVNFTlRBVElPTikgfHwgKHR5cGUgPT0gQ29udGVudFR5cGUuRFJBVykpIHsKLQkJCU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFBhZ2VFbGVtZW50KSB7Ci0JCQkJaW50IHpJbmRleCA9IDA7Ci0JCQkJTm9kZSBwcmVOb2RlID0gdGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQl3aGlsZSAocHJlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChwcmVOb2RlIGluc3RhbmNlb2YgRHJhd2luZ09iamVjdEVsZW1lbnQpIHsKLQkJCQkJCXpJbmRleCsrOwotCQkJCQl9IGVsc2UgaWYgKHByZU5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCQlOb2RlTGlzdCBubCA9ICgoRWxlbWVudCkgcHJlTm9kZSkKLQkJCQkJCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJCQkJCQkJRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCQkJCQkJRHJhd0NvbnN0YW50cy5FTEVNRU5UX0NPTlRST0wpOwotCQkJCQkJaWYgKChudWxsICE9IG5sKSAmJiAobmwuZ2V0TGVuZ3RoKCkgPiAwKSkKLQkJCQkJCQl6SW5kZXggKz0gbmwuZ2V0TGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQkJcHJlTm9kZSA9IHByZU5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJfQotCQkJCXJldHVybiB6SW5kZXg7Ci0JCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEdFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoR0VsZW1lbnQpIHBhcmVudCkuZ2V0WkluZGV4KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBUZXh0Qm94RWxlbWVudCBnZXRCb3VuZENhcHRpb25UZXh0Qm94RWxlbWVudCgpIHsKLQkJT0RGRG9jdW1lbnQgb2RmRG9jID0gKE9ERkRvY3VtZW50KSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCXJldHVybiBnZXRCb3VuZENhcHRpb25UZXh0Qm94RWxlbWVudChvZGZEb2MuZ2V0T0RGVmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dEJveEVsZW1lbnQgZ2V0Qm91bmRDYXB0aW9uVGV4dEJveEVsZW1lbnQoZG91YmxlIHZlcnNpb24pIHsKLQkJaWYgKHZlcnNpb24gPT0gMS4wKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGNhcHRpb25JZCA9IGdldEF0dHJEcmF3Q2FwdGlvbklkKCk7Ci0JCWlmIChjYXB0aW9uSWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCU9ERkRvY3VtZW50IG9kZkRvYyA9IChPREZEb2N1bWVudCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlPREZFbGVtZW50SW1wbCByb290ID0gKE9ERkVsZW1lbnRJbXBsKSBvZGZEb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCU9ERkVsZW1lbnQgZWxlbSA9IHJvb3QuZmluZEVsZW1lbnRCeUF0dHJWYWx1ZSgKLQkJCQlEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkVMRU1FTlRfVEVYVF9CT1gsCi0JCQkJVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksIFRleHRDb25zdGFudHMuQVRUUl9JRCwKLQkJCQljYXB0aW9uSWQpOwotCQlpZiAoKGVsZW0gIT0gbnVsbCkgJiYgKGVsZW0gaW5zdGFuY2VvZiBUZXh0Qm94RWxlbWVudCkpIHsKLQkJCXJldHVybiAoVGV4dEJveEVsZW1lbnQpIGVsZW07Ci0JCX0KLQkJbmV3IE9ERkV4Y2VwdGlvbigKLQkJCQkiJ2RyYXc6Y2FwdGlvbi1pZCcgZG9lcyBub3QgcG9pbnQgdG8gdGV4dDpib3ggZWxlbWVudC4iKQotCQkJCS5wcmludFN0YWNrVHJhY2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRpdGxlRWxlbWVudCBnZXRTVkdUaXRsZUVsZW1lbnQoKSB7Ci0JCU5vZGVMaXN0IG5sID0geHBhdGhTZXJ2aWNlLmV2YWxGb3JOb2RlTGlzdChFWFAxLCB0aGlzKTsKLQkJaWYgKChubCAhPSBudWxsKSAmJiAobmwuZ2V0TGVuZ3RoKCkgPT0gMSkpCi0JCQlyZXR1cm4gKFRpdGxlRWxlbWVudCkgbmwuaXRlbSgwKTsKLQkJaWYgKChubCAhPSBudWxsKSAmJiAobmwuZ2V0TGVuZ3RoKCkgPiAxKSkgewotCQkJbmV3IE9ERkV4Y2VwdGlvbigKLQkJCQkJImRyYXdpbmcgb2JqZWN0IGhhcyBtb3JlIHRoYW4gb25lIHN2Zzp0aXRsZSBlbGVtZW50cy4iKQotCQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERlc2NFbGVtZW50IGdldFNWR0Rlc2NFbGVtZW50KCkgewotCQlOb2RlTGlzdCBubCA9IHhwYXRoU2VydmljZS5ldmFsRm9yTm9kZUxpc3QoRVhQMiwgdGhpcyk7Ci0JCWlmICgobmwgIT0gbnVsbCkgJiYgKG5sLmdldExlbmd0aCgpID09IDEpKQotCQkJcmV0dXJuIChEZXNjRWxlbWVudCkgbmwuaXRlbSgwKTsKLQkJaWYgKChubCAhPSBudWxsKSAmJiAobmwuZ2V0TGVuZ3RoKCkgPiAxKSkgewotCQkJbmV3IE9ERkV4Y2VwdGlvbigKLQkJCQkJImRyYXdpbmcgb2JqZWN0IGhhcyBtb3JlIHRoYW4gb25lIHN2ZzpkZXNjIGVsZW1lbnRzLiIpCi0JCQkJCS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL0VtYmVkRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMzc4ZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5GcmFtZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN2Zy5EZXNjRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLlRpdGxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5TZXF1ZW5jZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC54cGF0aC5YUGF0aFNlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbWJlZERyYXdpbmdPYmplY3RFbGVtZW50SW1wbCBleHRlbmRzCi0JCURyYXdpbmdPYmplY3RCYXNlRWxlbWVudEltcGwgaW1wbGVtZW50cyBFbWJlZERyYXdpbmdPYmplY3RFbGVtZW50IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhQYXRoU2VydmljZSB4cGF0aFNlcnZpY2UgPSBYUGF0aFNlcnZpY2VGYWN0b3J5Ci0JCQkubmV3U2VydmljZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBleHAxID0geHBhdGhTZXJ2aWNlCi0JCQkuY29tcGlsZSgiLi4vKltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJKyBUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJKyBUZXh0Q29uc3RhbnRzLkVMRU1FTlRfU0VRVUVOQ0UgKyAiJ10iKTsKLQotCXByb3RlY3RlZCBFbWJlZERyYXdpbmdPYmplY3RFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBGcmFtZUVsZW1lbnQgZ2V0RnJhbWVFbGVtZW50KCkgewotCQlPREZFbGVtZW50IHBhcmVudCA9IChPREZFbGVtZW50KSB0aGlzLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEZyYW1lRWxlbWVudCkgewotCQkJcmV0dXJuIChGcmFtZUVsZW1lbnQpIHBhcmVudDsKLQkJfSBlbHNlIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oCi0JCQkJCSJwYXJlbnQgb2YgZW1iZWQgb2JqZWN0IGVsZW1lbnQgc2hvdWxkIGJlIGRyYXc6ZnJhbWUgZWxlbWVudC4iKQotCQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRpdGxlRWxlbWVudCBnZXRTVkdUaXRsZUVsZW1lbnQoKSB7Ci0JCUZyYW1lRWxlbWVudCBmcmFtZSA9IGdldEZyYW1lRWxlbWVudCgpOwotCQlpZiAoZnJhbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZnJhbWUuZ2V0U1ZHVGl0bGVFbGVtZW50KCk7Ci0JfQotCi0JcHVibGljIERlc2NFbGVtZW50IGdldFNWR0Rlc2NFbGVtZW50KCkgewotCQlGcmFtZUVsZW1lbnQgZnJhbWUgPSBnZXRGcmFtZUVsZW1lbnQoKTsKLQkJaWYgKGZyYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZyYW1lLmdldFNWR0Rlc2NFbGVtZW50KCk7Ci0JfQotCi0JcHVibGljIFNlcXVlbmNlRWxlbWVudCBnZXRUZXh0U2VxdWVuY2VFbGVtZW50KCkgewotCQlGcmFtZUVsZW1lbnQgZnJhbWUgPSBnZXRGcmFtZUVsZW1lbnQoKTsKLQkJaWYgKGZyYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlTGlzdCBubCA9IHhwYXRoU2VydmljZS5ldmFsRm9yTm9kZUxpc3QoZXhwMSwgZnJhbWUpOwotCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSA9PSAxKSkKLQkJCXJldHVybiAoU2VxdWVuY2VFbGVtZW50KSBubC5pdGVtKDApOwotCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSA+IDEpKSB7Ci0JCQluZXcgT0RGRXhjZXB0aW9uKAotCQkJCQkiZHJhdzppbWFnZSBoYXMgbW9yZSB0aGFuIG9uZSB0ZXh0OnNlcXVlbmNlIGVsZW1lbnRzLiIpCi0JCQkJCS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGQXR0ckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERkF0dHJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOWFlZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGQXR0ckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uVHlwZUluZm87Ci0KLQotY2xhc3MgT0RGQXR0ckltcGwgZXh0ZW5kcyBPREZOb2RlSW1wbCBpbXBsZW1lbnRzIE9ERkF0dHIgewotCi0JcHVibGljIE9ERkF0dHJJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgQXR0ciBpQXR0cikgewotCQlzdXBlcihvZGZEb2MsIGlBdHRyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAoKEF0dHIpIGlOb2RlKS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0T3duZXJFbGVtZW50KCkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBBdHRyKSB7Ci0JCQlFbGVtZW50IGlPd25lciA9ICgoQXR0cikgaU5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCQkJaWYgKGlPd25lciA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlyZXR1cm4gKEVsZW1lbnQpIG9kZkRvYy5nZXRPREZOb2RlKGlPd25lcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFR5cGVJbmZvIGdldFNjaGVtYVR5cGVJbmZvKCkgewotCQlyZXR1cm4gKChBdHRyKSBpTm9kZSkuZ2V0U2NoZW1hVHlwZUluZm8oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRTcGVjaWZpZWQoKSB7Ci0JCXJldHVybiAoKEF0dHIpIGlOb2RlKS5nZXRTcGVjaWZpZWQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gKChBdHRyKSBpTm9kZSkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0lkKCkgewotCQlyZXR1cm4gKChBdHRyKSBpTm9kZSkuaXNJZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCSgoQXR0cikgaU5vZGUpLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZDaGFyYWN0ZXJEYXRhSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGQ2hhcmFjdGVyRGF0YUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk3NGFkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZDaGFyYWN0ZXJEYXRhSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ2hhcmFjdGVyRGF0YTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIE9ERkNoYXJhY3RlckRhdGFJbXBsIGV4dGVuZHMgT0RGTm9kZUltcGwgaW1wbGVtZW50cwotCQlPREZDaGFyYWN0ZXJEYXRhIHsKLQotCXB1YmxpYyBPREZDaGFyYWN0ZXJEYXRhSW1wbChPREZEb2N1bWVudCBvZGZEb2MsCi0JCQlDaGFyYWN0ZXJEYXRhIGlubmVyQ2hhcmFjdGVyRGF0YSkgewotCQlzdXBlcihvZGZEb2MsIGlubmVyQ2hhcmFjdGVyRGF0YSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwZW5kRGF0YShTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YSkgewotCQkJKChDaGFyYWN0ZXJEYXRhKSBpTm9kZSkuYXBwZW5kRGF0YShhcmcpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKSB7Ci0JCQkoKENoYXJhY3RlckRhdGEpIGlOb2RlKS5kZWxldGVEYXRhKG9mZnNldCwgY291bnQpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIENoYXJhY3RlckRhdGEpIHsKLQkJCXJldHVybiAoKENoYXJhY3RlckRhdGEpIGlOb2RlKS5nZXREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIENoYXJhY3RlckRhdGEpIHsKLQkJCXJldHVybiAoKENoYXJhY3RlckRhdGEpIGlOb2RlKS5nZXRMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnREYXRhKGludCBvZmZzZXQsIFN0cmluZyBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKSB7Ci0JCQkoKENoYXJhY3RlckRhdGEpIGlOb2RlKS5pbnNlcnREYXRhKG9mZnNldCwgYXJnKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2VEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCwgU3RyaW5nIGFyZykKLQkJCXRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKSB7Ci0JCQkoKENoYXJhY3RlckRhdGEpIGlOb2RlKS5yZXBsYWNlRGF0YShvZmZzZXQsIGNvdW50LCBhcmcpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIENoYXJhY3RlckRhdGEpIHsKLQkJCSgoQ2hhcmFjdGVyRGF0YSkgaU5vZGUpLnNldERhdGEoZGF0YSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHN1YnN0cmluZ0RhdGEoaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YSkgewotCQkJcmV0dXJuICgoQ2hhcmFjdGVyRGF0YSkgaU5vZGUpLnN1YnN0cmluZ0RhdGEob2Zmc2V0LCBjb3VudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGQ29tbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERkNvbW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMjY3NzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGQ29tbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZDb21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIE9ERkNvbW1lbnRJbXBsIGV4dGVuZHMgT0RGQ2hhcmFjdGVyRGF0YUltcGwgaW1wbGVtZW50cyBPREZDb21tZW50IHsKLQlwdWJsaWMgT0RGQ29tbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBDb21tZW50IGlubmVyQ29tbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGlubmVyQ29tbWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGRG9jdW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZEb2N1bWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ0YjJiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZEb2N1bWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkNoYXJ0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsLkNoYXJ0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyM2QuRHIzZENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHIzZC5pbXBsLkRyM2ROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5EcmF3Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGwuRHJhd05vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkZvcm1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbC5Gb3JtTm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm51bWJlci5OdW1iZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm51bWJlci5pbXBsLk51bWJlck5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuRG9jdW1lbnRDb250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkRvY3VtZW50U3R5bGVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLk9mZmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLmltcGwuT2ZmaWNlTm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnByZXNlbnRhdGlvbi5QcmVzZW50YXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnByZXNlbnRhdGlvbi5pbXBsLlByZXNlbnRhdGlvbk5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbC5TdHlsZU5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuU1ZHQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuaW1wbC5TVkdOb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLmltcGwuVGFibGVOb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UZXh0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGwuVGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBPREZEb2N1bWVudEltcGwgZXh0ZW5kcyBPREZOb2RlSW1wbCBpbXBsZW1lbnRzIE9ERkRvY3VtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPiBmYWN0b3J5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTsKLQlzdGF0aWMgewotCQlmYWN0b3J5TWFwLnB1dChDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Tm9kZUZhY3RvcnkuY2xhc3MpOwotCQlmYWN0b3J5TWFwLnB1dChEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwgRHIzZE5vZGVGYWN0b3J5LmNsYXNzKTsKLQkJZmFjdG9yeU1hcC5wdXQoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksIERyYXdOb2RlRmFjdG9yeS5jbGFzcyk7Ci0JCWZhY3RvcnlNYXAucHV0KEZvcm1Db25zdGFudHMuRk9STV9OQU1FU1BBQ0VfVVJJLCBGb3JtTm9kZUZhY3RvcnkuY2xhc3MpOwotCQlmYWN0b3J5TWFwLnB1dChOdW1iZXJDb25zdGFudHMuTlVNQkVSX05BTUVTUEFDRV9VUkksCi0JCQkJTnVtYmVyTm9kZUZhY3RvcnkuY2xhc3MpOwotCQlmYWN0b3J5TWFwLnB1dChPZmZpY2VDb25zdGFudHMuT0ZGSUNFX05BTUVTUEFDRV9VUkksCi0JCQkJT2ZmaWNlTm9kZUZhY3RvcnkuY2xhc3MpOwotCQlmYWN0b3J5TWFwLnB1dChQcmVzZW50YXRpb25Db25zdGFudHMuUFJFU0VOVEFUSU9OX05BTUVTUEFDRV9VUkksCi0JCQkJUHJlc2VudGF0aW9uTm9kZUZhY3RvcnkuY2xhc3MpOwotCQlmYWN0b3J5TWFwLnB1dChTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlTm9kZUZhY3RvcnkuY2xhc3MpOwotCQlmYWN0b3J5TWFwLnB1dChUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlTm9kZUZhY3RvcnkuY2xhc3MpOwotCQlmYWN0b3J5TWFwLnB1dChUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwgVGV4dE5vZGVGYWN0b3J5LmNsYXNzKTsKLQkJZmFjdG9yeU1hcC5wdXQoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLCBTVkdOb2RlRmFjdG9yeS5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNYXA8Tm9kZSwgT0RGTm9kZT4gaW50ZXJuYWxOb2RlTWFwID0gbmV3IEhhc2hNYXA8Tm9kZSwgT0RGTm9kZT4oKTsKLQotCXByaXZhdGUgU3RyaW5nIHNVcmwgPSBudWxsOwotCi0JcHJpdmF0ZSBPREZEb2N1bWVudCBzdHlsZURvYyA9IG51bGw7Ci0KLQlwdWJsaWMgT0RGRG9jdW1lbnRJbXBsKERvY3VtZW50IGRvYykgewotCQlzdXBlcihkb2MpOwotCQlpbnRlcm5hbE5vZGVNYXAucHV0KGRvYywgdGhpcyk7Ci0JfQotCi0JcHVibGljIE5vZGUgYWRvcHROb2RlKE5vZGUgc291cmNlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQXR0ciBjcmVhdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lKQotCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENEQVRBU2VjdGlvbiBjcmVhdGVDREFUQVNlY3Rpb24oU3RyaW5nIGRhdGEpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJcmV0dXJuICgoRG9jdW1lbnQpIGlOb2RlKS5jcmVhdGVDREFUQVNlY3Rpb24oZGF0YSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbW1lbnQgY3JlYXRlQ29tbWVudChTdHJpbmcgZGF0YSkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJcmV0dXJuICgoRG9jdW1lbnQpIGlOb2RlKS5jcmVhdGVDb21tZW50KGRhdGEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgdGFnTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKEVsZW1lbnQpIGdldE9ERk5vZGUoKChEb2N1bWVudCkgaU5vZGUpCi0JCQkJCS5jcmVhdGVFbGVtZW50KHRhZ05hbWUpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50TlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHF1YWxpZmllZE5hbWUpCi0JCQl0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoRWxlbWVudCkgZ2V0T0RGTm9kZSgoKERvY3VtZW50KSBpTm9kZSkuY3JlYXRlRWxlbWVudE5TKAotCQkJCQluYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5UmVmZXJlbmNlIGNyZWF0ZUVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSkKLQkJCXRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJcmV0dXJuICgoRG9jdW1lbnQpIGlOb2RlKS5jcmVhdGVFbnRpdHlSZWZlcmVuY2UobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwKLQkJCVN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoKERvY3VtZW50KSBpTm9kZSkuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRleHQgY3JlYXRlVGV4dE5vZGUoU3RyaW5nIGRhdGEpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCVRleHQgaVRleHQgPSAoKERvY3VtZW50KSBpTm9kZSkuY3JlYXRlVGV4dE5vZGUoZGF0YSk7Ci0JCQlyZXR1cm4gKFRleHQpIGdldE9ERk5vZGUoaVRleHQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdHlwZSgpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoKERvY3VtZW50KSBpTm9kZSkuZ2V0RG9jdHlwZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGdldERvY3VtZW50RWxlbWVudCgpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCUVsZW1lbnQgaUVsZW0gPSAoKERvY3VtZW50KSBpTm9kZSkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQlpZiAoaUVsZW0gPT0gbnVsbCkKLQkJCQlyZXR1cm4gaUVsZW07Ci0JCQlyZXR1cm4gKEVsZW1lbnQpIGdldE9ERk5vZGUoaUVsZW0pOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRVUkkoKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKChEb2N1bWVudCkgaU5vZGUpLmdldERvY3VtZW50VVJJKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERPTUNvbmZpZ3VyYXRpb24gZ2V0RG9tQ29uZmlnKCkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJcmV0dXJuICgoRG9jdW1lbnQpIGlOb2RlKS5nZXREb21Db25maWcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50QnlJZChTdHJpbmcgZWxlbWVudElkKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlFbGVtZW50IGlFbGVtID0gKChEb2N1bWVudCkgaU5vZGUpLmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7Ci0JCQlpZiAoaUVsZW0gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoRWxlbWVudCkgZ2V0T0RGTm9kZShpRWxlbSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZyB0YWduYW1lKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlOb2RlTGlzdCBpTm9kZUxpc3QgPSAoKERvY3VtZW50KSBpTm9kZSkKLQkJCQkJLmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ25hbWUpOwotCQkJaWYgKGlOb2RlTGlzdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIG5ldyBPREZOb2RlTGlzdEltcGwodGhpcywgaU5vZGVMaXN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlOb2RlTGlzdCBpTm9kZUxpc3QgPSAoKERvY3VtZW50KSBpTm9kZSkuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLQkJCQkJbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOwotCQkJaWYgKGlOb2RlTGlzdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIG5ldyBPREZOb2RlTGlzdEltcGwodGhpcywgaU5vZGVMaXN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRE9NSW1wbGVtZW50YXRpb24gZ2V0SW1wbGVtZW50YXRpb24oKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKChEb2N1bWVudCkgaU5vZGUpLmdldEltcGxlbWVudGF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEVuY29kaW5nKCkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJcmV0dXJuICgoRG9jdW1lbnQpIGlOb2RlKS5nZXRJbnB1dEVuY29kaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0U3RyaWN0RXJyb3JDaGVja2luZygpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoKERvY3VtZW50KSBpTm9kZSkuZ2V0U3RyaWN0RXJyb3JDaGVja2luZygpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhtbEVuY29kaW5nKCkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJcmV0dXJuICgoRG9jdW1lbnQpIGlOb2RlKS5nZXRYbWxFbmNvZGluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFhtbFN0YW5kYWxvbmUoKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKChEb2N1bWVudCkgaU5vZGUpLmdldFhtbFN0YW5kYWxvbmUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRYbWxWZXJzaW9uKCkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJcmV0dXJuICgoRG9jdW1lbnQpIGlOb2RlKS5nZXRYbWxWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGUgaW1wb3J0Tm9kZShOb2RlIGltcG9ydGVkTm9kZSwgYm9vbGVhbiBkZWVwKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3JtYWxpemVEb2N1bWVudCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIE5vZGUgcmVuYW1lTm9kZShOb2RlIG4sIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lKQotCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRVUkkoU3RyaW5nIGRvY3VtZW50VVJJKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQkoKERvY3VtZW50KSBpTm9kZSkuc2V0RG9jdW1lbnRVUkkoZG9jdW1lbnRVUkkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RyaWN0RXJyb3JDaGVja2luZyhib29sZWFuIHN0cmljdEVycm9yQ2hlY2tpbmcpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCSgoRG9jdW1lbnQpIGlOb2RlKS5zZXRTdHJpY3RFcnJvckNoZWNraW5nKHN0cmljdEVycm9yQ2hlY2tpbmcpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0WG1sU3RhbmRhbG9uZShib29sZWFuIHhtbFN0YW5kYWxvbmUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJKChEb2N1bWVudCkgaU5vZGUpLnNldFhtbFN0YW5kYWxvbmUoeG1sU3RhbmRhbG9uZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRYbWxWZXJzaW9uKFN0cmluZyB4bWxWZXJzaW9uKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCSgoRG9jdW1lbnQpIGlOb2RlKS5zZXRYbWxWZXJzaW9uKHhtbFZlcnNpb24pOwotCQl9Ci0JfQotCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gT0RGRG9jdW1lbnQgaW1wbGVtZW50YXRpb24KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCXByaXZhdGUgTWV0aG9kIGZpbmRDcmVhdGVFbGVtZW50TWV0aG9kKENsYXNzIGNzKSB7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBjcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoImNyZWF0ZUVsZW1lbnQiLmVxdWFscyhtZXRob2RzW2ldLmdldE5hbWUoKSkpIHsKLQkJCQlDbGFzc1tdIHBhcm1zID0gbWV0aG9kc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJCWlmIChwYXJtcy5sZW5ndGggPT0gMyAmJiBwYXJtc1swXS5lcXVhbHMoT0RGRG9jdW1lbnQuY2xhc3MpCi0JCQkJCQkmJiBwYXJtc1sxXS5lcXVhbHMoU3RyaW5nLmNsYXNzKQotCQkJCQkJJiYgcGFybXNbMl0uZXF1YWxzKEVsZW1lbnQuY2xhc3MpKSB7Ci0JCQkJCXJldHVybiBtZXRob2RzW2ldOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT0RGTm9kZSBnZXRPREZOb2RlKE5vZGUgbm9kZSkgewotCQlPREZOb2RlIHJlc3VsdCA9IGludGVybmFsTm9kZU1hcC5nZXQobm9kZSk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJQ2xhc3MgZmFjdG9yeSA9IGZhY3RvcnlNYXAuZ2V0KG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlNZXRob2QgY3JlYXRlRWxlbU1ldGhvZCA9IGZpbmRDcmVhdGVFbGVtZW50TWV0aG9kKGZhY3RvcnkpOwotCQkJCXRyeSB7Ci0JCQkJCXJlc3VsdCA9IChPREZOb2RlKSBjcmVhdGVFbGVtTWV0aG9kLmludm9rZShmYWN0b3J5LAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IHRoaXMsIG5vZGUuZ2V0TG9jYWxOYW1lKCksCi0JCQkJCQkJCQkoRWxlbWVudCkgbm9kZSB9KTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCXJlc3VsdCA9IG5ldyBPREZFbGVtZW50SW1wbCh0aGlzLCAoRWxlbWVudCkgbm9kZSk7Ci0JCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBBdHRyKSB7Ci0JCQkJcmVzdWx0ID0gbmV3IE9ERkF0dHJJbXBsKHRoaXMsIChBdHRyKSBub2RlKTsKLQkJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlyZXN1bHQgPSBuZXcgT0RGVGV4dEltcGwodGhpcywgKFRleHQpIG5vZGUpOwotCQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ29tbWVudCkgewotCQkJCXJlc3VsdCA9IG5ldyBPREZDb21tZW50SW1wbCh0aGlzLCAoQ29tbWVudCkgbm9kZSk7Ci0JCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDaGFyYWN0ZXJEYXRhKSB7Ci0JCQkJcmVzdWx0ID0gbmV3IE9ERkNoYXJhY3RlckRhdGFJbXBsKHRoaXMsIChDaGFyYWN0ZXJEYXRhKSBub2RlKTsKLQkJCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgewotCQkJCXJlc3VsdCA9IG5ldyBPREZQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKHRoaXMsCi0JCQkJCQkoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gbmV3IE9ERk5vZGVJbXBsKHRoaXMsIG5vZGUpOwotCQkJfQotCQl9Ci0JCWludGVybmFsTm9kZU1hcC5wdXQobm9kZSwgcmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLQkJcmV0dXJuIHNVcmw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VVJMKFN0cmluZyBzVXJsKSB7Ci0JCXRoaXMuc1VybCA9IHNVcmw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T0RGVmVyc2lvbihkb3VibGUgdmVyc2lvbikgewotCQlFbGVtZW50IHJvb3QgPSB0aGlzLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlyb290LnNldEF0dHJpYnV0ZU5TKE9mZmljZUNvbnN0YW50cy5PRkZJQ0VfTkFNRVNQQUNFX1VSSSwKLQkJCQlPZmZpY2VDb25zdGFudHMuQVRUUl9WRVJTSU9OLCBuZXcgRG91YmxlKHZlcnNpb24pLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBkb3VibGUgZ2V0T0RGVmVyc2lvbigpIHsKLQkJRWxlbWVudCByb290ID0gdGhpcy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJaWYgKHJvb3QgaW5zdGFuY2VvZiBEb2N1bWVudENvbnRlbnRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChEb2N1bWVudENvbnRlbnRFbGVtZW50KSByb290KS5nZXRBdHRyT2ZmaWNlVmVyc2lvbigpOwotCQl9IGVsc2UgaWYgKHJvb3QgaW5zdGFuY2VvZiBEb2N1bWVudFN0eWxlc0VsZW1lbnQpIHsKLQkJCXJldHVybiAoKERvY3VtZW50U3R5bGVzRWxlbWVudCkgcm9vdCkuZ2V0QXR0ck9mZmljZVZlcnNpb24oKTsKLQkJfQotCQlyZXR1cm4gLTEuMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHlsZURvY3VtZW50KE9ERkRvY3VtZW50IHN0eWxlRG9jKSB7Ci0JCXRoaXMuc3R5bGVEb2MgPSBzdHlsZURvYzsKLQl9Ci0KLQlwdWJsaWMgT0RGRG9jdW1lbnQgZ2V0U3R5bGVEb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuc3R5bGVEb2M7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzBmYzc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkRvY3VtZW50U3R5bGVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVHlwZUluZm87Ci0KLXB1YmxpYyBjbGFzcyBPREZFbGVtZW50SW1wbCBleHRlbmRzIE9ERk5vZGVJbXBsIGltcGxlbWVudHMgT0RGRWxlbWVudCwKLQkJU2VyaWFsaXphYmxlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDU3OTY1MjM3NjkzODU3NzI5Nkw7Ci0KLQlwdWJsaWMgT0RGRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGlFbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgaUVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBPREZFbGVtZW50IGZpbmRFbGVtZW50QnlBdHRyVmFsdWUoU3RyaW5nIGVsZW1OYW1lc3BhY2VVUkksCi0JCQlTdHJpbmcgZWxlbUxvY2FsTmFtZSwgU3RyaW5nIGF0dHJOYW1lc3BhY2VVUkksCi0JCQlTdHJpbmcgYXR0ckxvY2FsTmFtZSwgU3RyaW5nIGF0dHJWYWx1ZSkgewotCQlFbGVtZW50IHJvb3QgPSBnZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IG5sID0gWFBhdGhTZXJ2aWNlRmFjdG9yeS5uZXdTZXJ2aWNlKCkuZXZhbFBhdGhGb3JOb2RlTGlzdCgKLQkJCQkiLi8vKltuYW1lc3BhY2UtdXJpKCk9JyIgKyBlbGVtTmFtZXNwYWNlVVJJCi0JCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBlbGVtTG9jYWxOYW1lICsgIiddIgotCQkJCQkJKyAiW2F0dHJpYnV0ZTo6KltuYW1lc3BhY2UtdXJpKCk9JyIgKyBhdHRyTmFtZXNwYWNlVVJJCi0JCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBhdHRyTG9jYWxOYW1lICsgIiddPSciCi0JCQkJCQkrIGF0dHJWYWx1ZSArICInXSIsIHJvb3QpOwotCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSAhPSAwKSkgewotCQkJcmV0dXJuIChPREZFbGVtZW50KSBubC5pdGVtKDApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPREZFbGVtZW50IGZpbmRFbGVtZW50QnlBdHRyVmFsdWVGcm9tU3R5bGVEb2MoCi0JCQlTdHJpbmcgZWxlbU5hbWVzcGFjZVVSSSwgU3RyaW5nIGVsZW1Mb2NhbE5hbWUsCi0JCQlTdHJpbmcgYXR0ck5hbWVzcGFjZVVSSSwgU3RyaW5nIGF0dHJMb2NhbE5hbWUsIFN0cmluZyBhdHRyVmFsdWUpIHsKLQkJT0RGRG9jdW1lbnQgc3R5bGVEb2MgPSAoKE9ERkRvY3VtZW50KSBnZXRPd25lckRvY3VtZW50KCkpCi0JCQkJLmdldFN0eWxlRG9jdW1lbnQoKTsKLQkJaWYgKHN0eWxlRG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRWxlbWVudCBzdHlsZVJvb3QgPSBzdHlsZURvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJaWYgKChzdHlsZVJvb3QgIT0gbnVsbCkgJiYgKHN0eWxlUm9vdCBpbnN0YW5jZW9mIERvY3VtZW50U3R5bGVzRWxlbWVudCkpIHsKLQkJCXJldHVybiAoKE9ERkVsZW1lbnRJbXBsKSBzdHlsZVJvb3QpLmZpbmRFbGVtZW50QnlBdHRyVmFsdWUoCi0JCQkJCWVsZW1OYW1lc3BhY2VVUkksIGVsZW1Mb2NhbE5hbWUsIGF0dHJOYW1lc3BhY2VVUkksCi0JCQkJCWF0dHJMb2NhbE5hbWUsIGF0dHJWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgaU5vZGUpLmdldEF0dHJpYnV0ZShuYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpCi0JCQl0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgaU5vZGUpLmdldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCUF0dHIgaUF0dHIgPSAoKEVsZW1lbnQpIGlOb2RlKS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCQkJaWYgKGlBdHRyID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCXJldHVybiAoQXR0cikgb2RmRG9jLmdldE9ERk5vZGUoaUF0dHIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBdHRyIGdldEF0dHJpYnV0ZU5vZGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKQotCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCUF0dHIgaUF0dHIgPSAoKEVsZW1lbnQpIGlOb2RlKS5nZXRBdHRyaWJ1dGVOb2RlTlMobmFtZXNwYWNlVVJJLAotCQkJCQlsb2NhbE5hbWUpOwotCQkJaWYgKGlBdHRyID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCXJldHVybiAoQXR0cikgb2RmRG9jLmdldE9ERk5vZGUoaUF0dHIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlOb2RlTGlzdCBpTm9kZUxpc3QgPSAoKEVsZW1lbnQpIGlOb2RlKS5nZXRFbGVtZW50c0J5VGFnTmFtZShuYW1lKTsKLQkJCXJldHVybiBuZXcgT0RGTm9kZUxpc3RJbXBsKG9kZkRvYywgaU5vZGVMaXN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKQotCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCU5vZGVMaXN0IGlOb2RlTGlzdCA9ICgoRWxlbWVudCkgaU5vZGUpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJCW5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKLQkJCXJldHVybiBuZXcgT0RGTm9kZUxpc3RJbXBsKG9kZkRvYywgaU5vZGVMaXN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVHlwZUluZm8gZ2V0U2NoZW1hVHlwZUluZm8oKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKEVsZW1lbnQpIGlOb2RlKS5nZXRTY2hlbWFUeXBlSW5mbygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgaU5vZGUpLmdldFRhZ05hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgaU5vZGUpLmhhc0F0dHJpYnV0ZShuYW1lKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkKLQkJCXRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50KSBpTm9kZSkuaGFzQXR0cmlidXRlTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkoKEVsZW1lbnQpIGlOb2RlKS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKQotCQkJdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCSgoRWxlbWVudCkgaU5vZGUpLnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKLQkJfQotCX0KLQotCXB1YmxpYyBBdHRyIHJlbW92ZUF0dHJpYnV0ZU5vZGUoQXR0ciBvbGRBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJQXR0ciBpUmVtb3ZlZEF0dHIgPSAoKEVsZW1lbnQpIGlOb2RlKS5yZW1vdmVBdHRyaWJ1dGVOb2RlKG9sZEF0dHIpOwotCQkJb2RmRG9jLmdldE9ERk5vZGUoaVJlbW92ZWRBdHRyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCSgoRWxlbWVudCkgaU5vZGUpLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0JCUF0dHIgaU5ld0F0dHIgPSAoKEVsZW1lbnQpIGlOb2RlKS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCi0JCWlmIChpTmV3QXR0ciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlvZGZEb2MuZ2V0T0RGTm9kZShpTmV3QXR0cik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwKLQkJCVN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCSgoRWxlbWVudCkgaU5vZGUpLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSwgdmFsdWUpOwotCQlBdHRyIGlOZXdBdHRyID0gKChFbGVtZW50KSBpTm9kZSkuZ2V0QXR0cmlidXRlTm9kZU5TKG5hbWVzcGFjZVVSSSwKLQkJCQlxdWFsaWZpZWROYW1lKTsKLQotCQlpZiAoaU5ld0F0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJb2RmRG9jLmdldE9ERk5vZGUoaU5ld0F0dHIpOwotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIEF0dHIgc2V0QXR0cmlidXRlTm9kZShBdHRyIG5ld0F0dHIpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoKGlOb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgJiYgKG5ld0F0dHIgaW5zdGFuY2VvZiBPREZOb2RlSW1wbCkpIHsKLQkJCU5vZGUgaU5ld0F0dHIgPSAoKE9ERk5vZGVJbXBsKSBuZXdBdHRyKS5nZXRJbnRlcm5hbE5vZGUoKTsKLQkJCWlmIChpTmV3QXR0ciBpbnN0YW5jZW9mIEF0dHIpIHsKLQkJCQl0cnkgewotCQkJCQkoKEVsZW1lbnQpIGlOb2RlKS5zZXRBdHRyaWJ1dGVOb2RlKChBdHRyKSBpTmV3QXR0cik7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaU5ld0F0dHIgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJcmV0dXJuIChBdHRyKSBvZGZEb2MuZ2V0T0RGTm9kZShpTmV3QXR0cik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEF0dHIgc2V0QXR0cmlidXRlTm9kZU5TKEF0dHIgbmV3QXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzZXRBdHRyaWJ1dGVOb2RlKG5ld0F0dHIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkoKEVsZW1lbnQpIGlOb2RlKS5zZXRJZEF0dHJpYnV0ZShuYW1lLCBpc0lkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsCi0JCQlib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkoKEVsZW1lbnQpIGlOb2RlKS5zZXRJZEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBpc0lkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5vZGUoQXR0ciBpZEF0dHIsIGJvb2xlYW4gaXNJZCkKLQkJCXRocm93cyBET01FeGNlcHRpb24gewotCQlOb2RlIGludGVybmFsSWRBdHRyID0gKChPREZOb2RlSW1wbCkgaWRBdHRyKS5nZXRJbnRlcm5hbE5vZGUoKTsKLQkJaWYgKChpTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpICYmIChpbnRlcm5hbElkQXR0ciBpbnN0YW5jZW9mIEF0dHIpKSB7Ci0JCQkoKEVsZW1lbnQpIGlOb2RlKS5zZXRJZEF0dHJpYnV0ZU5vZGUoKEF0dHIpIGludGVybmFsSWRBdHRyLCBpc0lkKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZOYW1lZE5vZGVNYXBJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZOYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Y2U5ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGTmFtZWROb2RlTWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotY2xhc3MgT0RGTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIE9ERk5hbWVkTm9kZU1hcCB7Ci0JcHJvdGVjdGVkIE9ERkRvY3VtZW50SW1wbCBvZGZEb2MgPSBudWxsOwotCi0JcHJpdmF0ZSBOYW1lZE5vZGVNYXAgaUF0dHJzOwotCi0JcHVibGljIE9ERk5hbWVkTm9kZU1hcEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBOYW1lZE5vZGVNYXAgaUF0dHJzKSB7Ci0JCXRoaXMub2RmRG9jID0gKE9ERkRvY3VtZW50SW1wbCkgb2RmRG9jOwotCQl0aGlzLmlBdHRycyA9IGlBdHRyczsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlOb2RlIGlOb2RlID0gaUF0dHJzLml0ZW0oaW5kZXgpOwotCQlpZiAoaU5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gb2RmRG9jLmdldE9ERk5vZGUoaU5vZGUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gaUF0dHJzLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlOb2RlIGlOb2RlID0gaUF0dHJzLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJaWYgKGlOb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG9kZkRvYy5nZXRPREZOb2RlKGlOb2RlKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW0oTm9kZSBub2RlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJTm9kZSBpTm9kZSA9IGlBdHRycy5zZXROYW1lZEl0ZW0obm9kZSk7Ci0JCWlmIChpTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBvZGZEb2MuZ2V0T0RGTm9kZShpTm9kZSk7Ci0JfQotCi0JcHVibGljIE5vZGUgcmVtb3ZlTmFtZWRJdGVtKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJTm9kZSBpTm9kZSA9IGlBdHRycy5yZW1vdmVOYW1lZEl0ZW0obmFtZSk7Ci0JCWlmIChpTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBvZGZEb2MuZ2V0T0RGTm9kZShpTm9kZSk7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQlOb2RlIGlOb2RlID0gaUF0dHJzLmdldE5hbWVkSXRlbU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKLQkJaWYgKGlOb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG9kZkRvYy5nZXRPREZOb2RlKGlOb2RlKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW1OUyhOb2RlIG5vZGUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlOb2RlIGlOb2RlID0gaUF0dHJzLnNldE5hbWVkSXRlbU5TKG5vZGUpOwotCQlpZiAoaU5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gb2RmRG9jLmdldE9ERk5vZGUoaU5vZGUpOwotCX0KLQotCXB1YmxpYyBOb2RlIHJlbW92ZU5hbWVkSXRlbU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpCi0JCQl0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJTm9kZSBpTm9kZSA9IGlBdHRycy5yZW1vdmVOYW1lZEl0ZW1OUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7Ci0JCWlmIChpTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBvZGZEb2MuZ2V0T0RGTm9kZShpTm9kZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGTm9kZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERk5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzE5MGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLWNsYXNzIE9ERk5vZGVJbXBsIGltcGxlbWVudHMgT0RGTm9kZSB7Ci0JcHJvdGVjdGVkIE9ERkRvY3VtZW50SW1wbCBvZGZEb2MgPSBudWxsOwotCi0JcHJvdGVjdGVkIE5vZGUgaU5vZGUgPSBudWxsOwotCi0JLy8gY29uc3RydWN0dXJlIGZvciBPREZEb2N1bWVudEltcGwKLQlwcm90ZWN0ZWQgT0RGTm9kZUltcGwoTm9kZSBpTm9kZSkgewotCQl0aGlzLm9kZkRvYyA9IChPREZEb2N1bWVudEltcGwpIHRoaXM7Ci0JCXRoaXMuaU5vZGUgPSBpTm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT0RGTm9kZUltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBOb2RlIGlOb2RlKSB7Ci0JCXRoaXMub2RmRG9jID0gKE9ERkRvY3VtZW50SW1wbCkgb2RmRG9jOwotCQl0aGlzLmlOb2RlID0gaU5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgZ2V0SW50ZXJuYWxOb2RlKCkgewotCQlyZXR1cm4gaU5vZGU7Ci0JfQotCi0JcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdDaGlsZCBpbnN0YW5jZW9mIE9ERk5vZGVJbXBsKSB7Ci0JCQlOb2RlIGlOZXdDaGlsZCA9ICgoT0RGTm9kZUltcGwpIG5ld0NoaWxkKS5nZXRJbnRlcm5hbE5vZGUoKTsKLQkJCU5vZGUgaVJlc3VsdE5vZGUgPSBpTm9kZS5hcHBlbmRDaGlsZChpTmV3Q2hpbGQpOwotCQkJcmV0dXJuIG5ldyBPREZOb2RlSW1wbChvZGZEb2MsIGlSZXN1bHROb2RlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCWlmIChvZGZEb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCU5vZGUgaUNsb25lTm9kZSA9IGlOb2RlLmNsb25lTm9kZShkZWVwKTsKLQkJaWYgKGlDbG9uZU5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBvZGZEb2MuZ2V0T0RGTm9kZShpQ2xvbmVOb2RlKTsKLQl9Ci0KLQlwdWJsaWMgc2hvcnQgY29tcGFyZURvY3VtZW50UG9zaXRpb24oTm9kZSBvdGhlcikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvdGhlciBpbnN0YW5jZW9mIE9ERk5vZGVJbXBsKSB7Ci0JCQlOb2RlIGlPdGhlciA9ICgoT0RGTm9kZUltcGwpIG90aGVyKS5nZXRJbnRlcm5hbE5vZGUoKTsKLQkJCXJldHVybiBpTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihpT3RoZXIpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKG9kZkRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTmFtZWROb2RlTWFwIGlBdHRycyA9IGlOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGlBdHRycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgT0RGTmFtZWROb2RlTWFwSW1wbChvZGZEb2MsIGlBdHRycyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCkgewotCQlyZXR1cm4gaU5vZGUuZ2V0QmFzZVVSSSgpOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gbmV3IE9ERk5vZGVMaXN0SW1wbChvZGZEb2MsIGlOb2RlLmdldENoaWxkTm9kZXMoKSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlpZiAob2RmRG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIGlGaXJzdENoaWxkID0gaU5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoaUZpcnN0Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBvZGZEb2MuZ2V0T0RGTm9kZShpRmlyc3RDaGlsZCk7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0TGFzdENoaWxkKCkgewotCQlpZiAob2RmRG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIGlMYXN0Q2hpbGQgPSBpTm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKGlMYXN0Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBvZGZEb2MuZ2V0T0RGTm9kZShpTGFzdENoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLQkJcmV0dXJuIGlOb2RlLmdldExvY2FsTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gaU5vZGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0TmV4dFNpYmxpbmcoKSB7Ci0JCWlmIChvZGZEb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCU5vZGUgaU5leHRTaWJsaW5nID0gaU5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJaWYgKGlOZXh0U2libGluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIG9kZkRvYy5nZXRPREZOb2RlKGlOZXh0U2libGluZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGlOb2RlLmdldE5vZGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gaU5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gaU5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JfQotCi0JcHVibGljIERvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBvZGZEb2M7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJTm9kZSBpUGFyZW50ID0gaU5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAoaVBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBvZGZEb2MuZ2V0T0RGTm9kZShpUGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIGlOb2RlLmdldFByZWZpeCgpOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLQkJaWYgKG9kZkRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBpUHJldmlvdXNTaWJsaW5nID0gaU5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCWlmIChpUHJldmlvdXNTaWJsaW5nID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gb2RmRG9jLmdldE9ERk5vZGUoaVByZXZpb3VzU2libGluZyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0Q29udGVudCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gaU5vZGUuZ2V0VGV4dENvbnRlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFVzZXJEYXRhKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGlOb2RlLmdldFVzZXJEYXRhKGtleSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGlOb2RlLmhhc0F0dHJpYnV0ZXMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gaU5vZGUuaGFzQ2hpbGROb2RlcygpOwotCX0KLQotCXB1YmxpYyBOb2RlIGluc2VydEJlZm9yZShOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZkNoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG9kZkRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKChuZXdDaGlsZCBpbnN0YW5jZW9mIE9ERk5vZGVJbXBsKQotCQkJCSYmIChyZWZDaGlsZCBpbnN0YW5jZW9mIE9ERk5vZGVJbXBsKSkgewotCQkJTm9kZSBpTmV3Q2hpbGQgPSAoKE9ERk5vZGVJbXBsKSBuZXdDaGlsZCkuZ2V0SW50ZXJuYWxOb2RlKCk7Ci0JCQlOb2RlIGlSZWZDaGlsZCA9ICgoT0RGTm9kZUltcGwpIHJlZkNoaWxkKS5nZXRJbnRlcm5hbE5vZGUoKTsKLQkJCU5vZGUgaUluc2VydGVkQ2hpbGQgPSBpTm9kZS5pbnNlcnRCZWZvcmUoaU5ld0NoaWxkLCBpUmVmQ2hpbGQpOwotCQkJaWYgKGlJbnNlcnRlZENoaWxkID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gb2RmRG9jLmdldE9ERk5vZGUoaUluc2VydGVkQ2hpbGQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXJldHVybiBpTm9kZS5pc0RlZmF1bHROYW1lc3BhY2UobmFtZXNwYWNlVVJJKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWFsTm9kZShOb2RlIGFyZykgewotCQlpZiAoYXJnIGluc3RhbmNlb2YgT0RGTm9kZUltcGwpIHsKLQkJCU5vZGUgaWFyZyA9ICgoT0RGTm9kZUltcGwpIGFyZykuZ2V0SW50ZXJuYWxOb2RlKCk7Ci0JCQlyZXR1cm4gaU5vZGUuaXNFcXVhbE5vZGUoaWFyZyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2FtZU5vZGUoTm9kZSBvdGhlcikgewotCQlpZiAob3RoZXIgaW5zdGFuY2VvZiBPREZOb2RlSW1wbCkgewotCQkJTm9kZSBpb3RoZXIgPSAoKE9ERk5vZGVJbXBsKSBvdGhlcikuZ2V0SW50ZXJuYWxOb2RlKCk7Ci0JCQlyZXR1cm4gaU5vZGUuaXNTYW1lTm9kZShpb3RoZXIpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZChTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIGlOb2RlLmlzU3VwcG9ydGVkKGZlYXR1cmUsIHZlcnNpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgbG9va3VwTmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIGlOb2RlLmxvb2t1cE5hbWVzcGFjZVVSSShwcmVmaXgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgbG9va3VwUHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJcmV0dXJuIGlOb2RlLmxvb2t1cFByZWZpeChuYW1lc3BhY2VVUkkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvZGZEb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChvbGRDaGlsZCBpbnN0YW5jZW9mIE9ERk5vZGVJbXBsKSB7Ci0JCQlOb2RlIGlPbGRDaGlsZCA9ICgoT0RGTm9kZUltcGwpIG9sZENoaWxkKS5nZXRJbnRlcm5hbE5vZGUoKTsKLQkJCU5vZGUgaVJlbW92ZWRDaGlsZCA9IGlOb2RlLnJlbW92ZUNoaWxkKGlPbGRDaGlsZCk7Ci0JCQlyZXR1cm4gb2RmRG9jLmdldE9ERk5vZGUoaVJlbW92ZWRDaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGUgcmVwbGFjZUNoaWxkKE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAob2RmRG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoKG5ld0NoaWxkIGluc3RhbmNlb2YgT0RGTm9kZUltcGwpCi0JCQkJJiYgKG9sZENoaWxkIGluc3RhbmNlb2YgT0RGTm9kZUltcGwpKSB7Ci0JCQlOb2RlIGlOZXdDaGlsZCA9ICgoT0RGTm9kZUltcGwpIG5ld0NoaWxkKS5nZXRJbnRlcm5hbE5vZGUoKTsKLQkJCU5vZGUgaU9sZENoaWxkID0gKChPREZOb2RlSW1wbCkgb2xkQ2hpbGQpLmdldEludGVybmFsTm9kZSgpOwotCQkJTm9kZSBpUmVwbGFjZWRDaGlsZCA9IGlOb2RlLnJlcGxhY2VDaGlsZChpTmV3Q2hpbGQsIGlPbGRDaGlsZCk7Ci0JCQlyZXR1cm4gb2RmRG9jLmdldE9ERk5vZGUoaVJlcGxhY2VkQ2hpbGQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaU5vZGUuc2V0Tm9kZVZhbHVlKG5vZGVWYWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpTm9kZS5zZXRQcmVmaXgocHJlZml4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0Q29udGVudChTdHJpbmcgdGV4dENvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpTm9kZS5zZXRUZXh0Q29udGVudCh0ZXh0Q29udGVudCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBzZXRVc2VyRGF0YShTdHJpbmcga2V5LCBPYmplY3QgZGF0YSwgVXNlckRhdGFIYW5kbGVyIGhhbmRsZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERk5vZGVMaXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODgzNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1jbGFzcyBPREZOb2RlTGlzdEltcGwgaW1wbGVtZW50cyBPREZOb2RlTGlzdCB7Ci0JcHJpdmF0ZSBPREZEb2N1bWVudEltcGwgb3duZXI7Ci0KLQlwcml2YXRlIE5vZGVMaXN0IGlOb2RlTGlzdDsKLQotCXB1YmxpYyBPREZOb2RlTGlzdEltcGwoT0RGRG9jdW1lbnRJbXBsIG93bmVyLCBOb2RlTGlzdCBpTm9kZUxpc3QpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmlOb2RlTGlzdCA9IGlOb2RlTGlzdDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlOb2RlIGlOb2RlID0gaU5vZGVMaXN0Lml0ZW0oaW5kZXgpOwotCQlpZiAoaU5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gb3duZXIuZ2V0T0RGTm9kZShpTm9kZSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBpTm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTYxNWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERlByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZQcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgT0RGUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBleHRlbmRzIE9ERk5vZGVJbXBsIGltcGxlbWVudHMKLQkJT0RGUHJvY2Vzc2luZ0luc3RydWN0aW9uIHsKLQotCXB1YmxpYyBPREZQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKE9ERkRvY3VtZW50IG9kZkRvYywKLQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBpbm5lclByb2Nlc3NpbmdJbnN0cnVjdGlvbikgewotCQlzdXBlcihvZGZEb2MsIGlubmVyUHJvY2Vzc2luZ0luc3RydWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgewotCQkJcmV0dXJuICgoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBpTm9kZSkuZ2V0RGF0YSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0KCkgewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIHsKLQkJCXJldHVybiAoKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgaU5vZGUpLmdldFRhcmdldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIHMpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIHsKLQkJCSgoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBpTm9kZSkuc2V0RGF0YShzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGU3R5bGFibGVFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9iYXNlL2ltcGwvT0RGU3R5bGFibGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDcxOGE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERlN0eWxhYmxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU9ERkVsZW1lbnQsIElTdHlsYWJsZSB7Ci0JcHJvdGVjdGVkIE9ERlN0eWxhYmxlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHlsZShTdHlsZUVsZW1lbnQgc3R5bGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotCXB1YmxpYyBTdHlsZUVsZW1lbnQgZ2V0U3R5bGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3R5bGVMaXN0ZW5lcihJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHlsZUxpc3RlbmVyKElTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERlRleHRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Jhc2UvaW1wbC9PREZUZXh0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU0ZGQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvYmFzZS9pbXBsL09ERlRleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi1jbGFzcyBPREZUZXh0SW1wbCBleHRlbmRzIE9ERkNoYXJhY3RlckRhdGFJbXBsIGltcGxlbWVudHMgT0RGVGV4dCB7Ci0KLQlwdWJsaWMgT0RGVGV4dEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBUZXh0IGlubmVyVGV4dCkgewotCQlzdXBlcihvZGZEb2MsIGlubmVyVGV4dCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXaG9sZVRleHQoKSB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCXJldHVybiAoKFRleHQpIGlOb2RlKS5nZXRXaG9sZVRleHQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpIHsKLQkJaWYgKGlOb2RlIGluc3RhbmNlb2YgVGV4dCkgewotCQkJcmV0dXJuICgoVGV4dCkgaU5vZGUpLmlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBUZXh0IHJlcGxhY2VXaG9sZVRleHQoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoaU5vZGUgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQlyZXR1cm4gKChUZXh0KSBpTm9kZSkucmVwbGFjZVdob2xlVGV4dChjb250ZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGV4dCBzcGxpdFRleHQoaW50IG9mZnNldCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChpTm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCXJldHVybiAoKFRleHQpIGlOb2RlKS5zcGxpdFRleHQob2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0F4aXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0F4aXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZGZhOTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9BeGlzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8Y2hhcnQ6YXhpcz4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBBeGlzRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnREaW1lbnNpb24oKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0TmFtZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvQ2F0ZWdvcmllc0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvQ2F0ZWdvcmllc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RiMzFjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0NhdGVnb3JpZXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGNoYXJ0OmNhdGVnb3JpZXM+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2F0ZWdvcmllc0VsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZUNlbGxSYW5nZUFkZHJlc3MoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0NoYXJ0Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0NoYXJ0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYWNjNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9DaGFydENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydDsKLQotLyoqCi0gKiBDaGFydENvbnN0YW50cyBkZWZpbmVzIHRoZSBjb25zdGFudCB2YWx1ZXMgdXNlZCBieSBjaGFydCBuYW1lc3BhY2Ugb2YgT0RGIERPTSBBUEkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENoYXJ0Q29uc3RhbnRzIHsKLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBDSEFSVF9OQU1FU1BBQ0VfVVJJID0gInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6Y2hhcnQ6MS4wIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQ0hBUlQgPSAiY2hhcnQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9USVRMRSA9ICJ0aXRsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xFR0VORCA9ICJsZWdlbmQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QTE9UX0FSRUEgPSAicGxvdC1hcmVhIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQVhJUyA9ICJheGlzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQ0FURUdPUklFUyA9ICJjYXRlZ29yaWVzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfR1JJRCA9ICJncmlkIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfU0VSSUVTID0gInNlcmllcyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0RBVEFfUE9JTlQgPSAiZGF0YS1wb2ludCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1NUT0NLX0dBSU5fTUFSS0VSID0gInN0b2NrLWdhaW4tbWFya2VyIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfU1RPQ0tfTE9TU19NQVJLRVIgPSAic3RvY2stbG9zcy1tYXJrZXIiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TVE9DS19SQU5HRV9MSU5FID0gInN0b2NrLXJhbmdlLWxpbmUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9XQUxMID0gIndhbGwiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9GTE9PUiA9ICJmbG9vciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RJTUVOU0lPTiA9ICJkaW1lbnNpb24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9DTEFTUyA9ICJjbGFzcyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1JFUEVBVEVEID0gInJlcGVhdGVkIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTEVHRU5EX1BPU0lUSU9OID0gImxlZ2VuZC1wb3NpdGlvbiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RBVEFfU09VUkNFX0hBU19MQUJFTFMgPSAiZGF0YS1zb3VyY2UtaGFzLWxhYmVscyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1RBQkxFX05VTUJFUl9MSVNUID0gInRhYmxlLW51bWJlci1saXN0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfU1RZTEVfTkFNRSA9ICJzdHlsZS1uYW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfSkFQQU5FU0VfQ0FORExFX1NUSUNLID0gImphcGFuZXNlLWNhbmRsZS1zdGljayI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NUT0NLX1dJVEhfVk9MVU1FID0gInN0b2NrLXdpdGgtdm9sdW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVEhSRUVfRElNRU5TSU9OQUwgPSAidGhyZWUtZGltZW5zaW9uYWwiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUVQID0gImRlZXAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9MSU5FUyA9ICJsaW5lcyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0lOVEVSUE9MQVRJT04gPSAiaW50ZXJwb2xhdGlvbiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NZTUJPTF9UWVBFID0gInN5bWJvbC10eXBlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVkVSVElDQUwgPSAidmVydGljYWwiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9MSU5FU19VU0VEID0gImxpbmVzLXVzZWQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT05ORUNUX0JBUlMgPSAiY29ubmVjdC1iYXJzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfU0VSSUVTX1NPVVJDRSA9ICJzZXJpZXMtc291cmNlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTUVBTl9WQUxVRSA9ICJtZWFuLXZhbHVlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRVJST1JfTUFSR0lOID0gImVycm9yLW1hcmdpbiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0VSUk9SX0xPV0VSX0xJTUlUID0gImVycm9yLWxvd2VyLWxpbWl0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRVJST1JfVVBQRVJfTElNSVQgPSAiZXJyb3ItdXBwZXItbGltaXQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9FUlJPUl9DQVRFR09SWSA9ICJlcnJvci1jYXRlZ29yeSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0VSUk9SX1BFUkNFTlRBR0UgPSAiZXJyb3ItcGVyY2VudGFnZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1JFR1JFU1NJT05fVFlQRSA9ICJyZWdyZXNzaW9uLXR5cGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9EQVRBX0xBQkVMX05VTUJFUiA9ICJkYXRhLWxhYmVsLW51bWJlciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RBVEFfTEFCRUxfVEVYVCA9ICJkYXRhLWxhYmVsLXRleHQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9EQVRBX0xBQkVMX1NZTUJPTCA9ICJkYXRhLWxhYmVsLXN5bWJvbCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RJU1BMQVlfTEFCRUwgPSAiZGlzcGxheS1sYWJlbCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1RJQ0tfTUFSS1NfTUFKT1JfSU5ORVIgPSAidGljay1tYXJrcy1tYWpvci1pbm5lciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1RJQ0tfTUFSS1NfTUFKT1JfT1VURVIgPSAidGljay1tYXJrcy1tYWpvci1vdXRlciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0xPR0FSSVRITUlDID0gImxvZ2FyaXRobWljIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVEVYVF9PVkVSTEFQID0gInRleHQtb3ZlcmxhcCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0xBQkVMX0FSUkFOR0VNRU5UID0gImxhYmVsLWFycmFuZ2VtZW50IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVklTSUJMRSA9ICJ2aXNpYmxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfT1JJR0lOID0gIm9yaWdpbiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0dBUF9XSURUSCA9ICJnYXAtd2lkdGgiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9PVkVSTEFQID0gIm92ZXJsYXAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TT0xJRF9UWVBFID0gInNvbGlkLXR5cGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9BVFRBQ0hFRF9BWElTID0gImF0dGFjaGVkLWF4aXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9NSU5JTVVNID0gIm1pbmltdW0iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9NQVhJTVVNID0gIm1heGltdW0iOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvQ2hhcnRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0NoYXJ0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjdjMDk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvQ2hhcnRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxjaGFydDpjaGFydD4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDaGFydEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1dpZHRoKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdIZWlnaHQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0Q2xhc3MoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0RhdGFQb2ludEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvRGF0YVBvaW50RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDZiOTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvRGF0YVBvaW50RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxjaGFydDpkYXRhLXBvaW50PiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERhdGFQb2ludEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgaW50IGdldEF0dHJDaGFydFJlcGVhdGVkKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9GbG9vckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvRmxvb3JFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwY2M1ZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9GbG9vckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGNoYXJ0OmZsb29yPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZsb29yRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9HcmlkRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9HcmlkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGU4M2MxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvR3JpZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGNoYXJ0OmdyaWQ+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JpZEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0Q2xhc3MoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L0xlZ2VuZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvTGVnZW5kRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTljOThjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvTGVnZW5kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8Y2hhcnQ6bGVnZW5kPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExlZ2VuZEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1goKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1koKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0TGVnZW5kUG9zaXRpb24oKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1Bsb3RBcmVhRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9QbG90QXJlYUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVhNzQxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1Bsb3RBcmVhRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8Y2hhcnQ6cGxvdC1hcmVhPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBsb3RBcmVhRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVDZWxsUmFuZ2VBZGRyZXNzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydERhdGFTb3VyY2VIYXNMYWJlbHMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0VGFibGVOdW1iZXJMaXN0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdYKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdZKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdXaWR0aCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnSGVpZ2h0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkVnJwKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkVnBuKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkVnVwKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkUHJvamVjdGlvbigpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHIzZERpc3RhbmNlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkRm9jYWxMZW5ndGgoKTsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckRyM2RTaGFkb3dTbGFudCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHIzZFNoYWRlTW9kZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHIzZEFtYmllbnRDb2xvcigpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckRyM2RMaWdodGluZ01vZGUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1Nlcmllc0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvU2VyaWVzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmI1MDg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvU2VyaWVzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8Y2hhcnQ6c2VyaWVzPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcmllc0VsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0QXR0YWNoZWRBeGlzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9TdG9ja0dhaW5NYXJrZXJFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1N0b2NrR2Fpbk1hcmtlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4NDYzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1N0b2NrR2Fpbk1hcmtlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGNoYXJ0OnN0b2NrLWdhaW4tbWFya2VyPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0b2NrR2Fpbk1hcmtlckVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvU3RvY2tMb3NzTWFya2VyRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9TdG9ja0xvc3NNYXJrZXJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkODQ2ODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9TdG9ja0xvc3NNYXJrZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxjaGFydDpzdG9jay1sb3NzLW1hcmtlcj4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBTdG9ja0xvc3NNYXJrZXJFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCwgSVN0eWxhYmxlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1N0b2NrUmFuZ2VMaW5lRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9TdG9ja1JhbmdlTGluZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4MTljOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1N0b2NrUmFuZ2VMaW5lRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8Y2hhcnQ6c3RvY2stcmFuZ2UtbGluZT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBTdG9ja1JhbmdlTGluZUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvVGl0bGVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1RpdGxlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWEzOTNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvVGl0bGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8Y2hhcnQ6dGl0bGU+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGl0bGVFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCwgSVN0eWxhYmxlLCBJRWRpdGFibGUgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1goKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1koKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1dhbGxFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L1dhbGxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDE4ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9XYWxsRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8Y2hhcnQ6d2FsbD4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBXYWxsRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0F4aXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0F4aXNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGYyYTIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9BeGlzRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5BeGlzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuQ2hhcnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBBeGlzRWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQXhpc0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc0ODI5MjQwMzUzNjU2OTcyNzRMOwotCi0JcHJvdGVjdGVkIEF4aXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0RGltZW5zaW9uKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0RJTUVOU0lPTikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9ESU1FTlNJT04pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydE5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9DYXRlZ29yaWVzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9DYXRlZ29yaWVzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3MmUzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvQ2F0ZWdvcmllc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkNhdGVnb3JpZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIENhdGVnb3JpZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgQ2F0ZWdvcmllc0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUwMzk0MzEwMTI3ODQ5Mjc3NjhMOwotCi0JcHJvdGVjdGVkIENhdGVnb3JpZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlQ2VsbFJhbmdlQWRkcmVzcygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9DRUxMX1JBTkdFX0FERFJFU1MpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfQ0VMTF9SQU5HRV9BRERSRVNTKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9DaGFydEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvQ2hhcnRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWZlZDk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9DaGFydEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuQ2hhcnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkNoYXJ0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLlNWR0NvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIENoYXJ0RWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQ2hhcnRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4NDIyMzQ5NzgzODA2Njk3MjE5TDsKLQotCXByb3RlY3RlZCBDaGFydEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnV2lkdGgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJU1ZHQ29uc3RhbnRzLkFUVFJfV0lEVEgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfV0lEVEgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdIZWlnaHQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJU1ZHQ29uc3RhbnRzLkFUVFJfSEVJR0hUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJCVNWR0NvbnN0YW50cy5BVFRSX0hFSUdIVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0Q2xhc3MoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfQ0xBU1MpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfQ0xBU1MpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0NoYXJ0Tm9kZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9DaGFydE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDcyN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0NoYXJ0Tm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5BYnN0cmFjdE9ERk5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5DaGFydENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBDaGFydE5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPREZOb2RlRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M+IHRhZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0KLQlzdGF0aWMgewotCQl0YWdNYXAucHV0KENoYXJ0Q29uc3RhbnRzLkVMRU1FTlRfQ0hBUlQsIENoYXJ0RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KENoYXJ0Q29uc3RhbnRzLkVMRU1FTlRfVElUTEUsIFRpdGxlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KENoYXJ0Q29uc3RhbnRzLkVMRU1FTlRfTEVHRU5ELCBMZWdlbmRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoQ2hhcnRDb25zdGFudHMuRUxFTUVOVF9QTE9UX0FSRUEsIFBsb3RBcmVhRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KENoYXJ0Q29uc3RhbnRzLkVMRU1FTlRfQVhJUywgQXhpc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChDaGFydENvbnN0YW50cy5FTEVNRU5UX0NBVEVHT1JJRVMsCi0JCQkJQ2F0ZWdvcmllc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChDaGFydENvbnN0YW50cy5FTEVNRU5UX0dSSUQsIEdyaWRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoQ2hhcnRDb25zdGFudHMuRUxFTUVOVF9TRVJJRVMsIFNlcmllc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChDaGFydENvbnN0YW50cy5FTEVNRU5UX0RBVEFfUE9JTlQsCi0JCQkJRGF0YVBvaW50RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KENoYXJ0Q29uc3RhbnRzLkVMRU1FTlRfU1RPQ0tfR0FJTl9NQVJLRVIsCi0JCQkJU3RvY2tHYWluTWFya2VyRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KENoYXJ0Q29uc3RhbnRzLkVMRU1FTlRfU1RPQ0tfTE9TU19NQVJLRVIsCi0JCQkJU3RvY2tMb3NzTWFya2VyRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KENoYXJ0Q29uc3RhbnRzLkVMRU1FTlRfU1RPQ0tfUkFOR0VfTElORSwKLQkJCQlTdG9ja1JhbmdlTGluZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChDaGFydENvbnN0YW50cy5FTEVNRU5UX1dBTEwsIFdhbGxFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoQ2hhcnRDb25zdGFudHMuRUxFTUVOVF9GTE9PUiwgRmxvb3JFbGVtZW50SW1wbC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoT0RGRG9jdW1lbnQgb2RmRG9jLCBTdHJpbmcgdGFnTmFtZSwKLQkJCUVsZW1lbnQgZWxlbWVudCkgewotCQlDbGFzcyBjcyA9IChDbGFzcykgdGFnTWFwLmdldCh0YWdOYW1lKTsKLQkJaWYgKG51bGwgPT0gY3MpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoRWxlbWVudCkgZmluZEVsZW1lbnRDb25zdHJhY3RvcihjcykubmV3SW5zdGFuY2UoCi0JCQkJCW5ldyBPYmplY3RbXSB7IG9kZkRvYywgZWxlbWVudCB9KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9EYXRhUG9pbnRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0RhdGFQb2ludEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNWIyNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0RhdGFQb2ludEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkNoYXJ0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5EYXRhUG9pbnRFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgRGF0YVBvaW50RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIERhdGFQb2ludEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MjEyMjM4NDg5MjUxMTcxNjEyTDsKLQotCXByb3RlY3RlZCBEYXRhUG9pbnRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckNoYXJ0UmVwZWF0ZWQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfUkVQRUFURUQpKSB7Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfUkVQRUFURUQpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0Zsb29yRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9GbG9vckVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MGVjODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0Zsb29yRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5GbG9vckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBGbG9vckVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEZsb29yRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI3NDMzMTY1MDI1NzEyODAwMzdMOwotCi0JcHJvdGVjdGVkIEZsb29yRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0dyaWRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0dyaWRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjJkZTQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9HcmlkRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5DaGFydENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuR3JpZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBHcmlkRWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgR3JpZEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkwMTU4NTUzOTA0Mzg5OTg3NDhMOwotCi0JcHJvdGVjdGVkIEdyaWRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0Q2xhc3MoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfQ0xBU1MpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfQ0xBU1MpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL0xlZ2VuZEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvTGVnZW5kRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmODhiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvTGVnZW5kRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5DaGFydENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuTGVnZW5kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLlNWR0NvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIExlZ2VuZEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIExlZ2VuZEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI1NTIyOTIwNTUzNTk0NDUwMDdMOwotCi0JcHJvdGVjdGVkIExlZ2VuZEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnRMZWdlbmRQb3NpdGlvbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9MRUdFTkRfUE9TSVRJT04pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfTEVHRU5EX1BPU0lUSU9OKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnWCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwgU1ZHQ29uc3RhbnRzLkFUVFJfWCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCQlTVkdDb25zdGFudHMuQVRUUl9YKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnWSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwgU1ZHQ29uc3RhbnRzLkFUVFJfWSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCQlTVkdDb25zdGFudHMuQVRUUl9ZKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9QbG90QXJlYUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvUGxvdEFyZWFFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjZmNDgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9QbG90QXJlYUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkNoYXJ0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5QbG90QXJlYUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyM2QuRHIzZENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLlNWR0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBQbG90QXJlYUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVBsb3RBcmVhRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQyMDE3NTYwMzMxMjY4NDI5OTJMOwotCi0JcHJvdGVjdGVkIFBsb3RBcmVhRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZUNlbGxSYW5nZUFkZHJlc3MoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfQ0VMTF9SQU5HRV9BRERSRVNTKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX0NFTExfUkFOR0VfQUREUkVTUyk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0RGF0YVNvdXJjZUhhc0xhYmVscygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9EQVRBX1NPVVJDRV9IQVNfTEFCRUxTKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0RBVEFfU09VUkNFX0hBU19MQUJFTFMpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydFRhYmxlTnVtYmVyTGlzdCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9UQUJMRV9OVU1CRVJfTElTVCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9UQUJMRV9OVU1CRVJfTElTVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1goKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksIFNWR0NvbnN0YW50cy5BVFRSX1gpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfWCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1koKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksIFNWR0NvbnN0YW50cy5BVFRSX1kpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfWSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1dpZHRoKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCVNWR0NvbnN0YW50cy5BVFRSX1dJRFRIKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJCVNWR0NvbnN0YW50cy5BVFRSX1dJRFRIKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnSGVpZ2h0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCVNWR0NvbnN0YW50cy5BVFRSX0hFSUdIVCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCQlTVkdDb25zdGFudHMuQVRUUl9IRUlHSFQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkVnJwKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJRHIzZENvbnN0YW50cy5BVFRSX1ZSUCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9WUlApOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkVnBuKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJRHIzZENvbnN0YW50cy5BVFRSX1ZQTikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9WUE4pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkVnVwKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJRHIzZENvbnN0YW50cy5BVFRSX1ZVUCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9WVVApOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkUHJvamVjdGlvbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyM2RDb25zdGFudHMuRFIzRF9OQU1FU1BBQ0VfVVJJLAotCQkJCURyM2RDb25zdGFudHMuQVRUUl9QUk9KRUNUSU9OKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHIzZENvbnN0YW50cy5BVFRSX1BST0pFQ1RJT04pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkRGlzdGFuY2UoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfRElTVEFOQ0UpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyM2RDb25zdGFudHMuRFIzRF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfRElTVEFOQ0UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkRm9jYWxMZW5ndGgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfRk9DQUxfTEVOR1RIKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHIzZENvbnN0YW50cy5BVFRSX0ZPQ0FMX0xFTkdUSCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckRyM2RTaGFkb3dTbGFudCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyM2RDb25zdGFudHMuRFIzRF9OQU1FU1BBQ0VfVVJJLAotCQkJCURyM2RDb25zdGFudHMuQVRUUl9TSEFET1dfU0xBTlQpKSB7Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9TSEFET1dfU0xBTlQpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcjNkU2hhZGVNb2RlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJRHIzZENvbnN0YW50cy5BVFRSX1NIQURFX01PREUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyM2RDb25zdGFudHMuRFIzRF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfU0hBREVfTU9ERSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyM2RBbWJpZW50Q29sb3IoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfQU1CSUVOVF9DT0xPUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9BTUJJRU5UX0NPTE9SKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckRyM2RMaWdodGluZ01vZGUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfTElHSFRJTkdfTU9ERSkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHIzZENvbnN0YW50cy5BVFRSX0xJR0hUSU5HX01PREUpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9TZXJpZXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL1Nlcmllc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZWI2NGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL1Nlcmllc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuQ2hhcnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LlNlcmllc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBTZXJpZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBTZXJpZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4ODk1ODU5OTI0MjA3MDYxNDg5TDsKLQotCXByb3RlY3RlZCBTZXJpZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0QXR0YWNoZWRBeGlzKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0FUVEFDSEVEX0FYSVMpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfQVRUQUNIRURfQVhJUyk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvU3RvY2tHYWluTWFya2VyRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9TdG9ja0dhaW5NYXJrZXJFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTVkMTE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9TdG9ja0dhaW5NYXJrZXJFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LlN0b2NrR2Fpbk1hcmtlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBTdG9ja0dhaW5NYXJrZXJFbGVtZW50SW1wbCBleHRlbmRzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlTdG9ja0dhaW5NYXJrZXJFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA5NDYyODA5NDUwMTA4Mjg5MEw7Ci0KLQlwcm90ZWN0ZWQgU3RvY2tHYWluTWFya2VyRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL1N0b2NrTG9zc01hcmtlckVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvU3RvY2tMb3NzTWFya2VyRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzOWYwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvU3RvY2tMb3NzTWFya2VyRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5TdG9ja0xvc3NNYXJrZXJFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgU3RvY2tMb3NzTWFya2VyRWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJU3RvY2tMb3NzTWFya2VyRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc2NTIwODYxOTQ3Mzg4OTMwNzhMOwotCi0JcHJvdGVjdGVkIFN0b2NrTG9zc01hcmtlckVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9TdG9ja1JhbmdlTGluZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvU3RvY2tSYW5nZUxpbmVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTQ3YWZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9TdG9ja1JhbmdlTGluZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuU3RvY2tSYW5nZUxpbmVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgU3RvY2tSYW5nZUxpbmVFbGVtZW50SW1wbCBleHRlbmRzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlTdG9ja1JhbmdlTGluZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYzMjgyMzc0NTc2NjQ2Njc2NzJMOwotCi0JcHJvdGVjdGVkIFN0b2NrUmFuZ2VMaW5lRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL1RpdGxlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY2hhcnQvaW1wbC9UaXRsZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMzFmYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL1RpdGxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5UaXRsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN2Zy5TVkdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBUaXRsZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRpdGxlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDcyMjk3NTQ4Nzc2MTE4NTQwMkw7Ci0KLQlwcm90ZWN0ZWQgVGl0bGVFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1goKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksIFNWR0NvbnN0YW50cy5BVFRSX1gpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfWCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1koKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksIFNWR0NvbnN0YW50cy5BVFRSX1kpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfWSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnQoSUVkaXRhYmxlIGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRWRpdExpc3RlbmVyKElFZGl0TGlzdGVuZXIgb2JzZXJ2ZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvV2FsbEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NoYXJ0L2ltcGwvV2FsbEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTU4MWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jaGFydC9pbXBsL1dhbGxFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LldhbGxFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgV2FsbEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFdhbGxFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODY4OTY2MDkzNDk5OTUzOTEzNUw7Ci0KLQlwcm90ZWN0ZWQgV2FsbEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY29udGVudC9JRWRpdExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NvbnRlbnQvSUVkaXRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWYwMDcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY29udGVudC9JRWRpdExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudDsKLQotLyoqCi0gKiBMaXN0ZW5lciBjbGFzcyB0byBkZXRlY3QgT0RGIGNvbnRlbnQgY2hhbmdlIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiBDdXJyZW50bHkgdGhpcyBpbnRlcmZhY2UgaXMgbm90IGltcGxlbWVudGVkIHlldC4KLSAqLyAKLXB1YmxpYyBpbnRlcmZhY2UgSUVkaXRMaXN0ZW5lciB7Ci0JcHVibGljIHZvaWQgb25FZGl0KElFZGl0YWJsZSB0YXJnZXQsIFN0cmluZyB0b3BpYyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jb250ZW50L0lFZGl0YWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jb250ZW50L0lFZGl0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzk2MGVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY29udGVudC9JRWRpdGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50OwotCi0vKioKLSAqIE9ERiBlbGVtZW50cyB0aGF0IGhhdmUgdGV4dCBjb250ZW50cyBzaG91bGQgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRWRpdGFibGUgewotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKTsKLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCBkYXRhKTsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpOwotCi0JcHVibGljIHZvaWQgaW5zZXJ0KElFZGl0YWJsZSBkYXRhKTsKLQotCXB1YmxpYyB2b2lkIGFkZEVkaXRMaXN0ZW5lcihJRWRpdExpc3RlbmVyIG9ic2VydmVyLCBTdHJpbmcgdG9waWMpOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlRWRpdExpc3RlbmVyKElFZGl0TGlzdGVuZXIgb2JzZXJ2ZXIsIFN0cmluZyB0b3BpYyk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NvbnRlbnQvSVN0eWxhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2NvbnRlbnQvSVN0eWxhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YTJlZTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jb250ZW50L0lTdHlsYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVFbGVtZW50OwotCi0vKioKLSAqIE9ERiBlbGVtZW50cyB0aGF0IHJlZmVycyBzdHlsZSBlbGVtZW50cyBzaG91bGQgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGFibGUgewotCXB1YmxpYyB2b2lkIHNldFN0eWxlKFN0eWxlRWxlbWVudCBzdHlsZSk7Ci0KLQlwdWJsaWMgU3R5bGVFbGVtZW50IGdldFN0eWxlKCk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHlsZUxpc3RlbmVyKElTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBTdHJpbmcgdG9waWMpOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3R5bGVMaXN0ZW5lcihJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHRvcGljKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvY29udGVudC9JU3R5bGVMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jb250ZW50L0lTdHlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMTk1NDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9jb250ZW50L0lTdHlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudDsKLQotLyoqCi0gKiBMaXN0ZW5lciBjbGFzcyB0byBkZXRlY3QgT0RGIHN0eWxlIGNoYW5nZSBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICogQ3VycmVudGx5IHRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlTGlzdGVuZXIgewotCXB1YmxpYyB2b2lkIG9uU3R5bGUoSVN0eWxhYmxlIHRhcmdldCwgU3RyaW5nIHRvcGljKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyM2QvRHIzZENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL0RyM2RDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYxZmI1OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyM2QvRHIzZENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyM2Q7Ci0KLS8qKgotICogRHIzZENvbnN0YW50cyBkZWZpbmVzIHRoZSBjb25zdGFudCB2YWx1ZXMgdXNlZCBieSBkcjNkIG5hbWVzcGFjZSBvZiBPREYgRE9NIEFQSQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRHIzZENvbnN0YW50cyB7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRFIzRF9OQU1FU1BBQ0VfVVJJID0gInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6ZHIzZDoxLjAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MSUdIVCA9ICJsaWdodCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1NDRU5FID0gInNjZW5lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRElGRlVTRV9DT0xPUiA9ICJkaWZmdXNlLWNvbG9yIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRElSRUNUSU9OID0gImRpcmVjdGlvbiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0VOQUJMRUQgPSAiZW5hYmxlZCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NQRUNVTEFSID0gInNwZWN1bGFyIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVlJQID0gInZycCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1ZQTiA9ICJ2cG4iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9WVVAgPSAidnVwIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPSkVDVElPTiA9ICJwcm9qZWN0aW9uIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRElTVEFOQ0UgPSAiZGlzdGFuY2UiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GT0NBTF9MRU5HVEggPSAiZm9jYWwtbGVuZ3RoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfU0hBRE9XX1NMQU5UID0gInNoYWRvdy1zbGFudCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NIQURFX01PREUgPSAic2hhZGUtbW9kZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0FNQklFTlRfQ09MT1IgPSAiYW1iaWVudC1jb2xvciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0xJR0hUSU5HX01PREUgPSAibGlnaHRpbmctbW9kZSI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL0xpZ2h0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL0xpZ2h0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjg0YmI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHIzZC9MaWdodEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxkcjNkOmxpZ2h0PiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpZ2h0RWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyM2REaWZmdXNlQ29sb3IoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyM2REaXJlY3Rpb24oKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJEcjNkRW5hYmxlZCgpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckRyM2RTcGVjdWxhcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHIzZC9TY2VuZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHIzZC9TY2VuZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwODk3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyM2QvU2NlbmVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHIzZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGRyM2Q6c2NlbmU+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NlbmVFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHIzZC9pbXBsL0RyM2ROb2RlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL2ltcGwvRHIzZE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YmNhMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL2ltcGwvRHIzZE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHIzZC5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5BYnN0cmFjdE9ERk5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkLkRyM2RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgRHIzZE5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPREZOb2RlRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M+IHRhZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0KLQlzdGF0aWMgewotCQl0YWdNYXAucHV0KERyM2RDb25zdGFudHMuRUxFTUVOVF9MSUdIVCwgTGlnaHRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHIzZENvbnN0YW50cy5FTEVNRU5UX1NDRU5FLCBTY2VuZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChPREZEb2N1bWVudCBvZGZEb2MsIFN0cmluZyB0YWdOYW1lLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNsYXNzIGNzID0gKENsYXNzKSB0YWdNYXAuZ2V0KHRhZ05hbWUpOwotCQlpZiAobnVsbCA9PSBjcykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIChFbGVtZW50KSBmaW5kRWxlbWVudENvbnN0cmFjdG9yKGNzKS5uZXdJbnN0YW5jZSgKLQkJCQkJbmV3IE9iamVjdFtdIHsgb2RmRG9jLCBlbGVtZW50IH0pOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL2ltcGwvTGlnaHRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL2ltcGwvTGlnaHRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTllY2EzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHIzZC9pbXBsL0xpZ2h0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkLkRyM2RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyM2QuTGlnaHRFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTGlnaHRFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgTGlnaHRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjI2NTYzMTk4MjQyMzgzMTI3NUw7Ci0KLQlwcm90ZWN0ZWQgTGlnaHRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyM2REaWZmdXNlQ29sb3IoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfRElGRlVTRV9DT0xPUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9ESUZGVVNFX0NPTE9SKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHIzZERpcmVjdGlvbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyM2RDb25zdGFudHMuRFIzRF9OQU1FU1BBQ0VfVVJJLAotCQkJCURyM2RDb25zdGFudHMuQVRUUl9ESVJFQ1RJT04pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyM2RDb25zdGFudHMuRFIzRF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfRElSRUNUSU9OKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckRyM2RFbmFibGVkKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJRHIzZENvbnN0YW50cy5BVFRSX0VOQUJMRUQpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9FTkFCTEVEKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJEcjNkU3BlY3VsYXIoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcjNkQ29uc3RhbnRzLkFUVFJfU1BFQ1VMQVIpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkksCi0JCQkJCURyM2RDb25zdGFudHMuQVRUUl9TUEVDVUxBUikpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL2ltcGwvU2NlbmVFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcjNkL2ltcGwvU2NlbmVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDM4MGQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHIzZC9pbXBsL1NjZW5lRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkRyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHIzZC5TY2VuZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBTY2VuZUVsZW1lbnRJbXBsIGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGltcGxlbWVudHMgU2NlbmVFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzA2MzIxNjIxNDQzODE1Mzk2NUw7Ci0KLQlwcm90ZWN0ZWQgU2NlbmVFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQXJlYUNpcmNsZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9BcmVhQ2lyY2xlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODNhMjg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9BcmVhQ2lyY2xlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8ZHJhdzphcmVhLWNpcmNsZT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBBcmVhQ2lyY2xlRWxlbWVudCBleHRlbmRzIEltYWdlTWFwQXJlYUVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9BcmVhUG9seWdvbkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9BcmVhUG9seWdvbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjMDdhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQXJlYVBvbHlnb25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxkcmF3OmFyZWEtcG9seWdvbj4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBBcmVhUG9seWdvbkVsZW1lbnQgZXh0ZW5kcyBJbWFnZU1hcEFyZWFFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQXJlYVJlY3RhbmdsZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9BcmVhUmVjdGFuZ2xlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTk3OTQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9BcmVhUmVjdGFuZ2xlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8ZHJhdzphcmVhLXJlY3RhbmdsZT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBBcmVhUmVjdGFuZ2xlRWxlbWVudCBleHRlbmRzIEltYWdlTWFwQXJlYUVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9DYXB0aW9uRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0NhcHRpb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyY2I3YjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0NhcHRpb25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGRyYXc6Y2FwdGlvbj4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDYXB0aW9uRWxlbWVudCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQ2lyY2xlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0NpcmNsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4MGRiMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQ2lyY2xlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0RWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxkcmF3OmNpcmNsZT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDaXJjbGVFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9Db25uZWN0b3JFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQ29ubmVjdG9yRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzVkODAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9Db25uZWN0b3JFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGRyYXc6Y29ubmVjdG9yPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3RvckVsZW1lbnQgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0NvbnRyb2xFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQ29udHJvbEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjOTdiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQ29udHJvbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRml4ZWRUZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5Gb3JtQ29udHJvbEVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8ZHJhdzpjb250cm9sPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRyb2xFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdDb250cm9sKCk7Ci0KLQlwdWJsaWMgRm9ybUNvbnRyb2xFbGVtZW50IGdldEZvcm1Db250cm9sRWxlbWVudCgpOwotCi0JcHVibGljIEZpeGVkVGV4dEVsZW1lbnQgZ2V0Rm9ybUxhYmVsRml4ZWRUZXh0RWxlbWVudCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9DdXN0b21TaGFwZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9DdXN0b21TaGFwZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE5MTM4MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvQ3VzdG9tU2hhcGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGRyYXc6Y3VzdG9tLXNoYXBlPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEN1c3RvbVNoYXBlRWxlbWVudCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvRHJhd0NvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0RyYXdDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlhYjQ2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvRHJhd0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi0vKioKLSAqIERyYXdDb25zdGFudHMgZGVmaW5lcyB0aGUgY29uc3RhbnQgdmFsdWVzIHVzZWQgYnkgZHJhd2luZyBuYW1lc3BhY2Ugb2YgT0RGIERPTSBBUEkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERyYXdDb25zdGFudHMgewotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIERSQVdfTkFNRVNQQUNFX1VSSSA9ICJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOmRyYXdpbmc6MS4wIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUEFHRSA9ICJwYWdlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRlJBTUUgPSAiZnJhbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9PQkpFQ1QgPSAib2JqZWN0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfT0JKRUNUX09MRSA9ICJvYmplY3Qtb2xlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfSU1BR0UgPSAiaW1hZ2UiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9HUkFESUVOVCA9ICJncmFkaWVudCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0hBVENIID0gImhhdGNoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRklMTF9JTUFHRSA9ICJmaWxsLWltYWdlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfT1BBQ0lUWSA9ICJvcGFjaXR5IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfU1RST0tFX0RBU0ggPSAic3Ryb2tlLWRhc2giOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9JTUFHRV9NQVAgPSAiaW1hZ2UtbWFwIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQVJFQV9DSVJDTEUgPSAiYXJlYS1jaXJjbGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9BUkVBX1BPTFlHT04gPSAiYXJlYS1wb2x5Z29uIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQVJFQV9SRUNUQU5HTEUgPSAiYXJlYS1yZWN0YW5nbGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9SRUNUID0gInJlY3QiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MSU5FID0gImxpbmUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QT0xZTElORSA9ICJwb2x5bGluZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BPTFlHT04gPSAicG9seWdvbiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1JFR1VMQVJfUE9MWUdPTiA9ICJyZWd1bGFyLXBvbHlnb24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QQVRIID0gInBhdGgiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DSVJDTEUgPSAiY2lyY2xlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRUxMSVBTRSA9ICJlbGxpcHNlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRyA9ICJnIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUEFHRV9USFVNQk5BSUwgPSAicGFnZS10aHVtYm5haWwiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9NRUFTVVJFID0gIm1lYXN1cmUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DQVBUSU9OID0gImNhcHRpb24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DT05ORUNUT1IgPSAiY29ubmVjdG9yIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQ09OVFJPTCA9ICJjb250cm9sIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQ1VTVE9NX1NIQVBFID0gImN1c3RvbS1zaGFwZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RFWFRfQk9YID0gInRleHQtYm94IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfWl9JTkRFWCA9ICJ6LWluZGV4IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTk9USUZZX09OX1VQREFURV9PRl9SQU5HRVMgPSAibm90aWZ5LW9uLXVwZGF0ZS1vZi1yYW5nZXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVFJPS0UgPSAic3Ryb2tlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfU1RST0tFX0RBU0ggPSAic3Ryb2tlLWRhc2giOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9NQVJLRVJfU1RBUlRfV0lEVEggPSAibWFya2VyLXN0YXJ0LXdpZHRoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTUFSS0VSX0VORF9XSURUSCA9ICJtYXJrZXItZW5kLXdpZHRoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfT1BBQ0lUWSA9ICJvcGFjaXR5IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfT1BBQ0lUWV9OQU1FID0gIm9wYWNpdHktbmFtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZJTEwgPSAiZmlsbCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZJTExfQ09MT1IgPSAiZmlsbC1jb2xvciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZJTExfR1JBRElFTlRfTkFNRSA9ICJmaWxsLWdyYWRpZW50LW5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9HUkFESUVOVF9TVEVQX0NPVU5UID0gImdyYWRpZW50LXN0ZXAtY291bnQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GSUxMX0lNQUdFX05BTUUgPSAiZmlsbC1pbWFnZS1uYW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRklMTF9JTUFHRV9XSURUSCA9ICJmaWxsLWltYWdlLXdpZHRoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRklMTF9JTUFHRV9IRUlHSFQgPSAiZmlsbC1pbWFnZS1oZWlnaHQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GSUxMX0lNQUdFX1JFRl9QT0lOVF9YID0gImZpbGwtaW1hZ2UtcmVmLXBvaW50LXgiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GSUxMX0lNQUdFX1JFRl9QT0lOVF9ZID0gImZpbGwtaW1hZ2UtcmVmLXBvaW50LXkiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GSUxMX0lNQUdFX1JFRl9QT0lOVCA9ICJmaWxsLWltYWdlLXJlZi1wb2ludCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1RJTEVfUkVQRUFUX09GRlNFVCA9ICJ0aWxlLXJlcGVhdC1vZmZzZXQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RJU1BMQVlfTkFNRSA9ICJkaXNwbGF5LW5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVFlMRSA9ICJzdHlsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NUWUxFX05BTUUgPSAic3R5bGUtbmFtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX01BU1RFUl9QQUdFX05BTUUgPSAibWFzdGVyLXBhZ2UtbmFtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NUQVJUX0NPTE9SID0gInN0YXJ0LWNvbG9yIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRU5EX0NPTE9SID0gImVuZC1jb2xvciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NUQVJUX0lOVEVOU0lUWSA9ICJzdGFydC1pbnRlbnNpdHkiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9FTkRfSU5URU5TSVRZID0gImVuZC1pbnRlbnNpdHkiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTkdMRSA9ICJhbmdsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0JPUkRFUiA9ICJib3JkZXIiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT0xPUiA9ICJjb2xvciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RJU1RBTkNFID0gImRpc3RhbmNlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfUk9UQVRJT04gPSAicm90YXRpb24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVEFSVCA9ICJzdGFydCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0VORCA9ICJlbmQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ET1RTMSA9ICJkb3RzMSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RPVFMxX0xFTkdUSCA9ICJkb3RzMS1sZW5ndGgiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ET1RTMiA9ICJkb3RzMiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RPVFMyX0xFTkdUSCA9ICJkb3RzMi1sZW5ndGgiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9DWCA9ICJjeCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0NZID0gImN5IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQkFDS0dST1VORF9TSVpFID0gImJhY2tncm91bmQtc2l6ZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0NPTlRST0wgPSAiY29udHJvbCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0NBUFRJT05fSUQgPSAiY2FwdGlvbi1pZCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX05BVl9PUkRFUiA9ICJuYXYtb3JkZXIiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9FbGxpcHNlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0VsbGlwc2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1Y2FhOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0VsbGlwc2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGRyYXc6ZWxsaXBzZT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBFbGxpcHNlRWxlbWVudCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvRmlsbEltYWdlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0ZpbGxJbWFnZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxYTZlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvRmlsbEltYWdlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGRyYXc6ZmlsbC1pbWFnZT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBGaWxsSW1hZ2VFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd05hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clhMaW5rSHJlZigpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyWExpbmtUeXBlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJYTGlua1Nob3coKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clhMaW5rQWN0dWF0ZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9GcmFtZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9GcmFtZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2YjM5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvRnJhbWVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGRyYXc6ZnJhbWU+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRnJhbWVFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlRW5kQ2VsbEFkZHJlc3MoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlRW5kWCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVFbmRZKCk7Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJEcmF3WkluZGV4KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdXaWR0aCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnSGVpZ2h0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdYKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdZKCk7Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50U2l6ZSgpOwotCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkSXRlcmF0b3IoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvR0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9HRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjAxMTc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9HRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0RWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxkcmF3Omc+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR0VsZW1lbnQgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0dyYWRpZW50RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0dyYWRpZW50RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjgzZmNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9HcmFkaWVudEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxkcmF3OmdyYWRpZW50PiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYWRpZW50RWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RGlzcGxheU5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdHlsZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd1N0YXJ0Q29sb3IoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdFbmRDb2xvcigpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0N4KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3Q3koKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdGFydEludGVuc2l0eSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0VuZEludGVuc2l0eSgpOwotCi0JcHVibGljIGludCBnZXRBdHRyRHJhd0FuZ2xlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3Qm9yZGVyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0hhdGNoRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0hhdGNoRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmZhNGE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9IYXRjaEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxkcmF3OmhhdGNoPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhhdGNoRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RGlzcGxheU5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdHlsZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0NvbG9yKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RGlzdGFuY2UoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdSb3RhdGlvbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9JbWFnZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9JbWFnZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYwNjgzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvSW1hZ2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8ZHJhdzppbWFnZT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJbWFnZUVsZW1lbnQgZXh0ZW5kcyBFbWJlZERyYXdpbmdPYmplY3RFbGVtZW50IHsKLQlTdHJpbmcgZ2V0QXR0clhsaW5rSHJlZigpOwotCi0JU3RyaW5nIGdldEF0dHJYbGlua1R5cGUoKTsKLQotCVN0cmluZyBnZXRBdHRyWGxpbmtTaG93KCk7Ci0KLQlTdHJpbmcgZ2V0QXR0clhsaW5rQWN0dWF0ZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9JbWFnZU1hcEFyZWFFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvSW1hZ2VNYXBBcmVhRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzQ4ZTgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9JbWFnZU1hcEFyZWFFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotCi0vKioKLSAqIE9ERiBlbGVtZW50cyB0aGF0IGhhcyA8ZHJhdzppbWFnZS1tYXA+IGFzIHBhcmVudCBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEltYWdlTWFwQXJlYUVsZW1lbnQgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0ltYWdlTWFwRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L0ltYWdlTWFwRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDQ5YjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9JbWFnZU1hcEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxkcmF3OmltYWdlLW1hcD4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJbWFnZU1hcEVsZW1lbnQgZXh0ZW5kcyBFbWJlZERyYXdpbmdPYmplY3RFbGVtZW50IHsKLQlwdWJsaWMgSW1hZ2VFbGVtZW50IGdldEltYWdlRWxlbWVudHMoKTsKLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRBcmVhRWxlbWVudHMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvTGluZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9MaW5lRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2MzNmYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9MaW5lRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0RWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxkcmF3OmxpbmU+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGluZUVsZW1lbnQgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L01lYXN1cmVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvTWVhc3VyZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUwMTcwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvTWVhc3VyZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8ZHJhdzptZWFzdXJlPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lYXN1cmVFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9PYmplY3RFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvT2JqZWN0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDQ2YWZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9PYmplY3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8ZHJhdzpvYmplY3Q+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT2JqZWN0RWxlbWVudCBleHRlbmRzIEVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdOb3RpZnlPblVwZGF0ZU9mUmFuZ2VzKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyWGxpbmtIcmVmKFN0cmluZyBocmVmKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clhsaW5rSHJlZigpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyWGxpbmtUeXBlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJYbGlua1Nob3coKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clhsaW5rQWN0dWF0ZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNQcmVzZW50YXRpb25UYWJsZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9PYmplY3RPbGVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvT2JqZWN0T2xlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWNmZTNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9PYmplY3RPbGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8ZHJhdzpvYmplY3Qtb2xlPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9iamVjdE9sZUVsZW1lbnQgZXh0ZW5kcyBFbWJlZERyYXdpbmdPYmplY3RFbGVtZW50IHsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9PcGFjaXR5RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L09wYWNpdHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MDAyYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L09wYWNpdHlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8ZHJhdzpvcGFjaXR5PiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9wYWNpdHlFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd05hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdEaXNwbGF5TmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd1N0eWxlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3RhcnQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdFbmQoKTsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckRyYXdBbmdsZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0JvcmRlcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9QYWdlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BhZ2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMjc3Y2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BhZ2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucHJlc2VudGF0aW9uLk5vdGVzRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxkcmF3OnBhZ2U+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFnZUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgT0RGRWxlbWVudCBjcmVhdGVPYmplY3QobG9uZyB4LCBsb25nIHksIGxvbmcgd2lkdGgsIGxvbmcgaGVpZ2h0KTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3R5bGVOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3TWFzdGVyUGFnZU5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdOYXZPcmRlcigpOwotCi0JcHVibGljIGludCBnZXRQYWdlSW5kZXgoKTsKLQotCXB1YmxpYyBMaXN0PE9ERkVsZW1lbnQ+IGdldENoaWxkTm9kZXNJbk5hdk9yZGVyKCk7Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RHJhd2luZ09iamVjdEVsZW1lbnRzKCk7Ci0KLQlwdWJsaWMgTm90ZXNFbGVtZW50IGdldFByZXNlbnRhdGlvbk5vdGVzRWxlbWVudCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9QYWdlVGh1bWJuYWlsRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BhZ2VUaHVtYm5haWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZGQ0NDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BhZ2VUaHVtYm5haWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGRyYXc6cGFnZS10aHVtYm5haWw+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFnZVRodW1ibmFpbEVsZW1lbnQgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BhdGhFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvUGF0aEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1MzA1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvUGF0aEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8ZHJhdzpwYXRoPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhdGhFbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9Qb2x5Z29uRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BvbHlnb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YmNjYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BvbHlnb25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGRyYXc6cG9seWdvbj4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBQb2x5Z29uRWxlbWVudCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvUG9seWxpbmVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvUG9seWxpbmVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjIzODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1BvbHlsaW5lRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0RWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxkcmF3OnBvbHlsaW5lPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvbHlsaW5lRWxlbWVudCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvUmVjdEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9SZWN0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2YyY2Y5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9SZWN0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0RWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxkcmF3OnJlY3Q+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVjdEVsZW1lbnQgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1JlZ3VsYXJQb2x5Z29uRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1JlZ3VsYXJQb2x5Z29uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDc0ZjljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9SZWd1bGFyUG9seWdvbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8ZHJhdzpyZWd1bGFyLXBvbHlnb24+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVndWxhclBvbHlnb25FbGVtZW50IGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9TdHJva2VEYXNoRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1N0cm9rZURhc2hFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYWM3MzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L1N0cm9rZURhc2hFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8ZHJhdzpzdHJva2UtZGFzaD4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBTdHJva2VEYXNoRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RGlzcGxheU5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdHlsZSgpOwotCi0JcHVibGljIGludCBnZXRBdHRyRHJhd0RvdHMxKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RG90czFMZW5ndGgoKTsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckRyYXdEb3RzMigpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0RvdHMyTGVuZ3RoKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RGlzdGFuY2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvVGV4dEJveEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9UZXh0Qm94RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGI1MjZlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9UZXh0Qm94RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGRyYXc6dGV4dC1ib3g+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGV4dEJveEVsZW1lbnQgZXh0ZW5kcyBFbWJlZERyYXdpbmdPYmplY3RFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9BcmVhQ2lyY2xlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0FyZWFDaXJjbGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDAwYWRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0FyZWFDaXJjbGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkFyZWFDaXJjbGVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgQXJlYUNpcmNsZUVsZW1lbnRJbXBsIGV4dGVuZHMgSW1hZ2VNYXBBcmVhRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlBcmVhQ2lyY2xlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDk2MzgyMzc1Mjg3MzE5ODAxMEw7Ci0KLQlwcm90ZWN0ZWQgQXJlYUNpcmNsZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0FyZWFQb2x5Z29uRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0FyZWFQb2x5Z29uRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJiODllMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9BcmVhUG9seWdvbkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuQXJlYVBvbHlnb25FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgQXJlYVBvbHlnb25FbGVtZW50SW1wbCBleHRlbmRzIEltYWdlTWFwQXJlYUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQXJlYVBvbHlnb25FbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzc4Nzg1MjQwNjM2MDMzMDkxMUw7Ci0KLQlwcm90ZWN0ZWQgQXJlYVBvbHlnb25FbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9BcmVhUmVjdGFuZ2xlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0FyZWFSZWN0YW5nbGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjlhNDdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0FyZWFSZWN0YW5nbGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkFyZWFSZWN0YW5nbGVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgQXJlYVJlY3RhbmdsZUVsZW1lbnRJbXBsIGV4dGVuZHMgSW1hZ2VNYXBBcmVhRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlBcmVhUmVjdGFuZ2xlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjY0OTE0MTg3MzUzNzE2NjcwM0w7Ci0KLQlwcm90ZWN0ZWQgQXJlYVJlY3RhbmdsZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0NhcHRpb25FbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvQ2FwdGlvbkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNjJjNjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvQ2FwdGlvbkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5EcmF3aW5nT2JqZWN0RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuQ2FwdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBDYXB0aW9uRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlDYXB0aW9uRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTI3MzM0MjI5Njg3NzUwMDkxMkw7Ci0KLQlwcm90ZWN0ZWQgQ2FwdGlvbkVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0NpcmNsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9DaXJjbGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGIwMTNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0NpcmNsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5EcmF3aW5nT2JqZWN0RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuQ2lyY2xlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIENpcmNsZUVsZW1lbnRJbXBsIGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQ2lyY2xlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzI0NDY1MjMzODAzODk4NTY5MUw7Ci0KLQlwcm90ZWN0ZWQgQ2lyY2xlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvQ29ubmVjdG9yRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0Nvbm5lY3RvckVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNGM5NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvQ29ubmVjdG9yRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkRyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5Db25uZWN0b3JFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgQ29ubmVjdG9yRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlDb25uZWN0b3JFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzM2MTIzNzIwMDM4MDQ3Njc4TDsKLQotCXByb3RlY3RlZCBDb25uZWN0b3JFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9Db250cm9sRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0NvbnRyb2xFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTgzYmM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0NvbnRyb2xFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkNvbnRyb2xFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkRyYXdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRml4ZWRUZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5Gb3JtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkZvcm1Db250cm9sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLk9mZmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1jbGFzcyBDb250cm9sRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlDb250cm9sRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ0ODM1ODQ2NjkwNjQ5NjgxOTVMOwotCi0JcHJvdGVjdGVkIENvbnRyb2xFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdDb250cm9sKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0NPTlRST0wpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQ09OVFJPTCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBGb3JtQ29udHJvbEVsZW1lbnQgZ2V0Rm9ybUNvbnRyb2xFbGVtZW50KCkgewotCQlOb2RlTGlzdCBubCA9IFhQYXRoU2VydmljZUZhY3RvcnkubmV3U2VydmljZSgpLmV2YWxQYXRoRm9yTm9kZUxpc3QoCi0JCQkJImFuY2VzdG9yOjoqLypbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCQkrIE9mZmljZUNvbnN0YW50cy5PRkZJQ0VfTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciCi0JCQkJCQkrIE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX0ZPUk1TCi0JCQkJCQkrICInXS8qW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkJKyBGb3JtQ29uc3RhbnRzLkZPUk1fTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgRm9ybUNvbnN0YW50cy5FTEVNRU5UX0ZPUk0KLQkJCQkJCSsgIiddLypbYXR0cmlidXRlOjoqW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkJKyBGb3JtQ29uc3RhbnRzLkZPUk1fTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSdpZCddPSciICsgZ2V0QXR0ckRyYXdDb250cm9sKCkKLQkJCQkJCSsgIiddIiwgdGhpcyk7Ci0KLQkJaWYgKChubCAhPSBudWxsKSAmJiAobmwuZ2V0TGVuZ3RoKCkgPT0gMSkpIHsKLQkJCUVsZW1lbnQgY29udHJvbCA9IChFbGVtZW50KSBubC5pdGVtKDApOwotCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKEZvcm1Db250cm9sRWxlbWVudCkgY29udHJvbDsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV3IE9ERkV4Y2VwdGlvbigKLQkJCQkJCSJkcmF3OmlkIHNob3VsZCBzcGVjaWZ5IHRoZSBpZCBvZiBGb3JtQ29udHJvbEVsZW1lbnQiKQotCQkJCQkJLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigibmFtZXNwYWNlIDogIiArIGNvbnRyb2wuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigibG9jYWxuYW1lIDogIiArIGNvbnRyb2wuZ2V0TG9jYWxOYW1lKCkpOwotCQkJCVN5c3RlbS5lcnIKLQkJCQkJCS5wcmludGxuKCJ0ZXh0IGNvbnRlbnQgOiAiICsgY29udHJvbC5nZXRUZXh0Q29udGVudCgpKTsKLQkJCX0KLQkJfSBlbHNlIGlmICgobmwgIT0gbnVsbCkgJiYgKG5sLmdldExlbmd0aCgpID4gMSkpIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oCi0JCQkJCSJkcmF3OmNvbnRyb2wgc2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhhbnQgb25lIGZvcm06cHJvcGVydHkgZWxlbWVudCIpCi0JCQkJCS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRml4ZWRUZXh0RWxlbWVudCBnZXRGb3JtTGFiZWxGaXhlZFRleHRFbGVtZW50KCkgewotCQlTdHJpbmcgZHJhd0NvbnRyb2wgPSBnZXRBdHRyRHJhd0NvbnRyb2woKTsKLQkJTm9kZUxpc3QgbmwgPSBYUGF0aFNlcnZpY2VGYWN0b3J5Lm5ld1NlcnZpY2UoKS5ldmFsUGF0aEZvck5vZGVMaXN0KAotCQkJCSJhbmNlc3Rvcjo6Ki8qW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkJKyBPZmZpY2VDb25zdGFudHMuT0ZGSUNFX05BTUVTUEFDRV9VUkkKLQkJCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkJKyBPZmZpY2VDb25zdGFudHMuRUxFTUVOVF9GT1JNUwotCQkJCQkJKyAiJ10vKltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJCSsgRm9ybUNvbnN0YW50cy5GT1JNX05BTUVTUEFDRV9VUkkKLQkJCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIEZvcm1Db25zdGFudHMuRUxFTUVOVF9GT1JNCi0JCQkJCQkrICInXS8qW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkJKyBGb3JtQ29uc3RhbnRzLkZPUk1fTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciCi0JCQkJCQkrIEZvcm1Db25zdGFudHMuRUxFTUVOVF9GSVhFRF9URVhUCi0JCQkJCQkrICInXVthdHRyaWJ1dGU6OipbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCQkrIEZvcm1Db25zdGFudHMuRk9STV9OQU1FU1BBQ0VfVVJJCi0JCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBGb3JtQ29uc3RhbnRzLkFUVFJfRk9SCi0JCQkJCQkrICInXT0nIiArIGRyYXdDb250cm9sICsgIiddIiwgdGhpcyk7Ci0JCWlmICgobmwgIT0gbnVsbCkgJiYgKG5sLmdldExlbmd0aCgpID09IDEpKSB7Ci0JCQlFbGVtZW50IHRleHQgPSAoRWxlbWVudCkgbmwuaXRlbSgwKTsKLQkJCWlmICh0ZXh0IGluc3RhbmNlb2YgRml4ZWRUZXh0RWxlbWVudCkgewotCQkJCXJldHVybiAoRml4ZWRUZXh0RWxlbWVudCkgdGV4dDsKLQkJCX0KLQkJfSBlbHNlIGlmICgobmwgIT0gbnVsbCkgJiYgKG5sLmdldExlbmd0aCgpID4gMSkpIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oCi0JCQkJCSJkcmF3OmNvbnRyb2wgc2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhhbnQgb25lIGZvcm0gbGFiZWwgZmllbGQgZWxlbWVudCIpCi0JCQkJCS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvQ3VzdG9tU2hhcGVFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvQ3VzdG9tU2hhcGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTRkZGZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0N1c3RvbVNoYXBlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkRyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5DdXN0b21TaGFwZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBDdXN0b21TaGFwZUVsZW1lbnRJbXBsIGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQ3VzdG9tU2hhcGVFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMzU1NzA3OTY4MTkyMTUyMDg0TDsKLQotCXByb3RlY3RlZCBDdXN0b21TaGFwZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0RyYXdOb2RlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvRHJhd05vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2M2E1NzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvRHJhd05vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5BYnN0cmFjdE9ERk5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkRyYXdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgRHJhd05vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPREZOb2RlRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M+IHRhZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0KLQlzdGF0aWMgewotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9BUkVBX0NJUkNMRSwKLQkJCQlBcmVhQ2lyY2xlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9BUkVBX1BPTFlHT04sCi0JCQkJQXJlYVBvbHlnb25FbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX0FSRUFfUkVDVEFOR0xFLAotCQkJCUFyZWFSZWN0YW5nbGVFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX0NBUFRJT04sIENhcHRpb25FbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX0NJUkNMRSwgQ2lyY2xlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9DT05ORUNUT1IsIENvbm5lY3RvckVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfQ09OVFJPTCwgQ29udHJvbEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfQ1VTVE9NX1NIQVBFLAotCQkJCUN1c3RvbVNoYXBlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9FTExJUFNFLCBFbGxpcHNlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAKLQkJCQkucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9GSUxMX0lNQUdFLAotCQkJCQkJRmlsbEltYWdlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9GUkFNRSwgRnJhbWVFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX0csIEdFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX0dSQURJRU5ULCBHcmFkaWVudEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfSEFUQ0gsIEhhdGNoRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9JTUFHRSwgSW1hZ2VFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX0lNQUdFX01BUCwgSW1hZ2VNYXBFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX0xJTkUsIExpbmVFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX01FQVNVUkUsIE1lYXN1cmVFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX09CSkVDVCwgT2JqZWN0RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAKLQkJCQkucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9PQkpFQ1RfT0xFLAotCQkJCQkJT2JqZWN0T2xlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9PUEFDSVRZLCBPcGFjaXR5RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9QQUdFLCBQYWdlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9QQUdFX1RIVU1CTkFJTCwKLQkJCQlQYWdlVGh1bWJuYWlsRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9QQVRILCBQYXRoRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9QT0xZR09OLCBQb2x5Z29uRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KERyYXdDb25zdGFudHMuRUxFTUVOVF9QT0xZTElORSwgUG9seWxpbmVFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX1JFQ1QsIFJlY3RFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRHJhd0NvbnN0YW50cy5FTEVNRU5UX1JFR1VMQVJfUE9MWUdPTiwKLQkJCQlSZWd1bGFyUG9seWdvbkVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfU1RST0tFX0RBU0gsCi0JCQkJU3Ryb2tlRGFzaEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChEcmF3Q29uc3RhbnRzLkVMRU1FTlRfVEVYVF9CT1gsIFRleHRCb3hFbGVtZW50SW1wbC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoT0RGRG9jdW1lbnQgb2RmRG9jLCBTdHJpbmcgdGFnTmFtZSwKLQkJCUVsZW1lbnQgZWxlbWVudCkgewotCQlDbGFzcyBjcyA9IChDbGFzcykgdGFnTWFwLmdldCh0YWdOYW1lKTsKLQkJaWYgKG51bGwgPT0gY3MpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoRWxlbWVudCkgZmluZEVsZW1lbnRDb25zdHJhY3RvcihjcykubmV3SW5zdGFuY2UoCi0JCQkJCW5ldyBPYmplY3RbXSB7IG9kZkRvYywgZWxlbWVudCB9KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0VsbGlwc2VFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvRWxsaXBzZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MmY0ZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvRWxsaXBzZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5EcmF3aW5nT2JqZWN0RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRWxsaXBzZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBFbGxpcHNlRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlFbGxpcHNlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ0NjMwNTQzNjc4NTEwNjU1NEw7Ci0KLQlwcm90ZWN0ZWQgRWxsaXBzZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0ZpbGxJbWFnZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9GaWxsSW1hZ2VFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGZiYzJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0ZpbGxJbWFnZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5EcmF3Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkZpbGxJbWFnZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnhsaW5rLlhMaW5rQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgRmlsbEltYWdlRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEZpbGxJbWFnZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDU4NzQ4MDY1MzQzMzA2MjE2NjdMOwotCi0JcHJvdGVjdGVkIEZpbGxJbWFnZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd05hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0Rpc3BsYXlOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RJU1BMQVlfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9ESVNQTEFZX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJYTGlua0hyZWYoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfSFJFRikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQkJWExpbmtDb25zdGFudHMuQVRUUl9IUkVGKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyWExpbmtUeXBlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX1RZUEUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfVFlQRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clhMaW5rU2hvdygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJWExpbmtDb25zdGFudHMuQVRUUl9TSE9XKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX1NIT1cpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJYTGlua0FjdHVhdGUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfQUNUVUFURSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQkJWExpbmtDb25zdGFudHMuQVRUUl9BQ1RVQVRFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0ZyYW1lRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0ZyYW1lRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmZDY0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9GcmFtZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkRyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5EcmF3Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkZyYW1lRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLlNWR0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLWNsYXNzIEZyYW1lRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cyBGcmFtZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDEwMjI3Nzk0ODI2MDg3NTI0NDhMOwotCi0JcHJvdGVjdGVkIEZyYW1lRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZUVuZENlbGxBZGRyZXNzKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX0VORF9DRUxMX0FERFJFU1MpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfRU5EX0NFTExfQUREUkVTUyk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlRW5kWCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9FTkRfWCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9FTkRfWCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlRW5kWSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9FTkRfWSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9FTkRfWSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckRyYXdaSW5kZXgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfWl9JTkRFWCkpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX1pfSU5ERVgpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdXaWR0aCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQlTVkdDb25zdGFudHMuQVRUUl9XSURUSCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCQlTVkdDb25zdGFudHMuQVRUUl9XSURUSCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z0hlaWdodCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQlTVkdDb25zdGFudHMuQVRUUl9IRUlHSFQpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfSEVJR0hUKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnWCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwgU1ZHQ29uc3RhbnRzLkFUVFJfWCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCQlTVkdDb25zdGFudHMuQVRUUl9YKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnWSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwgU1ZHQ29uc3RhbnRzLkFUVFJfWSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCQlTVkdDb25zdGFudHMuQVRUUl9ZKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PE5vZGU+IGdldENoaWxkRWxlbWVudHMoKSB7Ci0JCUxpc3Q8Tm9kZT4gbGlzdCA9IG5ldyBWZWN0b3I8Tm9kZT4oKTsKLQkJTm9kZUxpc3QgbmwgPSB0aGlzLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gbmwuaXRlbShpKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE9ERkVsZW1lbnQpIHsKLQkJCQlsaXN0LmFkZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0Q29udGVudFNpemUoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEVsZW1lbnRzKCkuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0dFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvR0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkY2RkZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvR0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5EcmF3aW5nT2JqZWN0RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuR0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBHRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cyBHRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDk1ODQ4NjcwMDc0NjE3NjIwMkw7Ci0KLQlwcm90ZWN0ZWQgR0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0dyYWRpZW50RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0dyYWRpZW50RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQxNzNkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9HcmFkaWVudEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRHJhd0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5HcmFkaWVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBHcmFkaWVudEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBHcmFkaWVudEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYyMzIzNjEyNDEzOTgzMzIzMDNMOwotCi0JcHJvdGVjdGVkIEdyYWRpZW50RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3TmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RGlzcGxheU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRElTUExBWV9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RJU1BMQVlfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdHlsZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVFlMRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVFlMRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdGFydENvbG9yKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUQVJUX0NPTE9SKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUQVJUX0NPTE9SKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0VuZENvbG9yKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0VORF9DT0xPUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9FTkRfQ09MT1IpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3RhcnRJbnRlbnNpdHkoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfU1RBUlRfSU5URU5TSVRZKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUQVJUX0lOVEVOU0lUWSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdFbmRJbnRlbnNpdHkoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRU5EX0lOVEVOU0lUWSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9FTkRfSU5URU5TSVRZKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdHRyRHJhd0FuZ2xlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0FOR0xFKSkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQU5HTEUpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3Qm9yZGVyKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0JPUkRFUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9CT1JERVIpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3Q3goKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQ1gpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQ1gpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3Q3koKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQ1kpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQ1kpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvSGF0Y2hFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvSGF0Y2hFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTM3ZmU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0hhdGNoRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkRyYXdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuSGF0Y2hFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgSGF0Y2hFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgSGF0Y2hFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzg5ODU0NjQ2Nzk2NzcwMzY4TDsKLQotCXByb3RlY3RlZCBIYXRjaEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd05hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0Rpc3BsYXlOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RJU1BMQVlfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9ESVNQTEFZX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3R5bGUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfU1RZTEUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfU1RZTEUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3Q29sb3IoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQ09MT1IpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQ09MT1IpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RGlzdGFuY2UoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRElTVEFOQ0UpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRElTVEFOQ0UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3Um90YXRpb24oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfUk9UQVRJT04pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfUk9UQVRJT04pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvSW1hZ2VFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvSW1hZ2VFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGEyMzU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0ltYWdlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkltYWdlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYueGxpbmsuWExpbmtDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBJbWFnZUVsZW1lbnRJbXBsIGV4dGVuZHMgRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlJbWFnZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNTcyNzk0MDY4NzkzNzE4OTQ2TDsKLQotCXByb3RlY3RlZCBJbWFnZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyWGxpbmtIcmVmKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX0hSRUYpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfSFJFRik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clhsaW5rVHlwZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJWExpbmtDb25zdGFudHMuQVRUUl9UWVBFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX1RZUEUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJYbGlua1Nob3coKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfU0hPVykpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQkJWExpbmtDb25zdGFudHMuQVRUUl9TSE9XKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyWGxpbmtBY3R1YXRlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX0FDVFVBVEUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfQUNUVUFURSk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9JbWFnZU1hcEFyZWFFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvSW1hZ2VNYXBBcmVhRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyMGFhZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9JbWFnZU1hcEFyZWFFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkltYWdlTWFwQXJlYUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1hYnN0cmFjdCBjbGFzcyBJbWFnZU1hcEFyZWFFbGVtZW50SW1wbCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIEltYWdlTWFwQXJlYUVsZW1lbnQgewotCi0JcHJvdGVjdGVkIEltYWdlTWFwQXJlYUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0ltYWdlTWFwRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0ltYWdlTWFwRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxMjk2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9JbWFnZU1hcEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkRyYXdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRnJhbWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkltYWdlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5JbWFnZU1hcEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1jbGFzcyBJbWFnZU1hcEVsZW1lbnRJbXBsIGV4dGVuZHMgRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlJbWFnZU1hcEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04NzA2MTM1NzI5MzgzMzE3Njc2TDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhQYXRoU2VydmljZSB4cGF0aFNlcnZpY2UgPSBYUGF0aFNlcnZpY2VGYWN0b3J5Ci0JCQkubmV3U2VydmljZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBFWFAxID0geHBhdGhTZXJ2aWNlCi0JCQkuY29tcGlsZSgiLi8qW25hbWVzcGFjZS11cmkoKT0nIiArIERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJCi0JCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9JTUFHRQotCQkJCQkrICInXSIpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBFWFAyID0geHBhdGhTZXJ2aWNlLmNvbXBpbGUoIi4vKlsiCi0JCQkrICIobmFtZXNwYWNlLXVyaSgpPSciICsgRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkkKLQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9BUkVBX0NJUkNMRSArICInKSIKLQkJCSsgIiBvciAobmFtZXNwYWNlLXVyaSgpPSciICsgRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkkKLQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9BUkVBX1BPTFlHT04KLQkJCSsgIicpIiArICIgb3IgKG5hbWVzcGFjZS11cmkoKT0nIgotCQkJKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCSsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX0FSRUFfUkVDVEFOR0xFICsgIicpIiArICJdIik7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VNYXBFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBJbWFnZUVsZW1lbnQgZ2V0SW1hZ2VFbGVtZW50cygpIHsKLQkJRnJhbWVFbGVtZW50IGZyYW1lID0gZ2V0RnJhbWVFbGVtZW50KCk7Ci0JCWlmIChmcmFtZSAhPSBudWxsKSB7Ci0JCQlOb2RlTGlzdCBubCA9IHhwYXRoU2VydmljZS5ldmFsRm9yTm9kZUxpc3QoRVhQMSwgdGhpcyk7Ci0JCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSA9PSAxKSkKLQkJCQlyZXR1cm4gKEltYWdlRWxlbWVudCkgbmwuaXRlbSgwKTsKLQkJCWlmICgobmwgIT0gbnVsbCkgJiYgKG5sLmdldExlbmd0aCgpID4gMSkpIHsKLQkJCQluZXcgT0RGRXhjZXB0aW9uKAotCQkJCQkJImRyYXc6aW1hZ2UgaGFzIG1vcmUgdGhhbiBvbmUgdGV4dDpzZXF1ZW5jZSBlbGVtZW50cy4iKQotCQkJCQkJLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRBcmVhRWxlbWVudHMoKSB7Ci0JCXJldHVybiB4cGF0aFNlcnZpY2UuZXZhbEZvck5vZGVMaXN0KEVYUDIsIHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9MaW5lRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0xpbmVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTdmMWE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL0xpbmVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkxpbmVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTGluZUVsZW1lbnRJbXBsIGV4dGVuZHMgRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGltcGxlbWVudHMgTGluZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMDc5MTIxNjE4NjMzMTU5MzYyTDsKLQotCXByb3RlY3RlZCBMaW5lRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvTWVhc3VyZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9NZWFzdXJlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0MmFlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9NZWFzdXJlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkRyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5NZWFzdXJlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIE1lYXN1cmVFbGVtZW50SW1wbCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU1lYXN1cmVFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzAwNzQwMTg1NjI5ODczNzYwM0w7Ci0KLQlwcm90ZWN0ZWQgTWVhc3VyZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL09iamVjdEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9PYmplY3RFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA2NjJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL09iamVjdEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERlBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzLkNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkNvbnRlbnRCYXNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkRyYXdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuT2JqZWN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkJvZHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuRG9jdW1lbnRDb250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYueGxpbmsuWExpbmtDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBPYmplY3RFbGVtZW50SW1wbCBleHRlbmRzIEVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJT2JqZWN0RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzcxMzUxMTE1MjQ2NTAzMjkxOUw7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyWGxpbmtIcmVmKFN0cmluZyBocmVmKSB7Ci0JCWlmIChocmVmID09IG51bGwpIHsKLQkJCXJlbW92ZUF0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfSFJFRik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0QXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX0hSRUYsIGhyZWYudHJpbSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3Tm90aWZ5T25VcGRhdGVPZlJhbmdlcygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9OT1RJRllfT05fVVBEQVRFX09GX1JBTkdFUykpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9OT1RJRllfT05fVVBEQVRFX09GX1JBTkdFUyk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clhsaW5rSHJlZigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJWExpbmtDb25zdGFudHMuQVRUUl9IUkVGKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX0hSRUYpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJYbGlua1R5cGUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfVFlQRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQkJWExpbmtDb25zdGFudHMuQVRUUl9UWVBFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyWGxpbmtTaG93KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX1NIT1cpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfU0hPVyk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clhsaW5rQWN0dWF0ZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJWExpbmtDb25zdGFudHMuQVRUUl9BQ1RVQVRFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX0FDVFVBVEUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnRhdGlvblRhYmxlKCkgewotCQlPREZEb2N1bWVudCBkb2MgPSAoT0RGRG9jdW1lbnQpIHRoaXMuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlEb2N1bWVudENvbnRlbnRFbGVtZW50IGNvbnRlbnQgPSAoRG9jdW1lbnRDb250ZW50RWxlbWVudCkgZG9jCi0JCQkJLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlDb250ZW50VHlwZSB0eXBlID0gY29udGVudC5nZXRCb2R5RWxlbWVudCgpLmdldENvbnRlbnQoKQotCQkJCS5nZXRDb250ZW50VHlwZSgpOwotCQlpZiAodHlwZSAhPSBDb250ZW50VHlwZS5QUkVTRU5UQVRJT04pCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIGZpbGVVcmwgPSBkb2MuZ2V0VVJMKCk7Ci0JCVN0cmluZyBvYmpVcmwgPSB0aGlzLmdldEF0dHJYbGlua0hyZWYoKTsKLQkJaWYgKG9ialVybC5zdGFydHNXaXRoKCIuLyIpKSB7Ci0JCQlvYmpVcmwgPSBvYmpVcmwuc3Vic3RyaW5nKDIpOwotCQl9Ci0JCW9ialVybCA9IG9ialVybCArICIvIiArIE9ERkNvbnN0YW50cy5PREZfQ09OVEVOVF9GSUxFTkFNRTsKLQotCQlPREZQYXJzZXIgcGFyc2VyID0gbmV3IE9ERlBhcnNlcigpOwotCQlEb2N1bWVudCBvYmpEb2MgPSBwYXJzZXIuZ2V0RG9jdW1lbnQoZmlsZVVybCwgb2JqVXJsKTsKLQkJaWYgKG9iakRvYyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUVsZW1lbnQgb2JqUm9vdCA9IG9iakRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJaWYgKCEob2JqUm9vdCBpbnN0YW5jZW9mIERvY3VtZW50Q29udGVudEVsZW1lbnQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlCb2R5RWxlbWVudCBvYmpCb2R5ID0gKChEb2N1bWVudENvbnRlbnRFbGVtZW50KSBvYmpSb290KQotCQkJCS5nZXRCb2R5RWxlbWVudCgpOwotCQlpZiAob2JqQm9keSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDb250ZW50QmFzZUVsZW1lbnQgb2JqQ29udGVudEJhc2UgPSBvYmpCb2R5LmdldENvbnRlbnQoKTsKLQkJaWYgKChvYmpDb250ZW50QmFzZSAhPSBudWxsKQotCQkJCSYmIChvYmpDb250ZW50QmFzZS5nZXRDb250ZW50VHlwZSgpID09IENvbnRlbnRUeXBlLlNQUkVBRFNIRUVUKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvT2JqZWN0T2xlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL09iamVjdE9sZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NGMwZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvT2JqZWN0T2xlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3Lk9iamVjdE9sZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgT2JqZWN0T2xlRWxlbWVudEltcGwgZXh0ZW5kcyBFbWJlZERyYXdpbmdPYmplY3RFbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIE9iamVjdE9sZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04NTM1OTc5NjU4OTA4MDk1NTA3TDsKLQotCXByb3RlY3RlZCBPYmplY3RPbGVFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL09wYWNpdHlFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvT3BhY2l0eUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNTViNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvT3BhY2l0eUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5EcmF3Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3Lk9wYWNpdHlFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgT3BhY2l0eUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBPcGFjaXR5RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU2OTU1MjY1MzU4NTkwMTk5NDhMOwotCi0JcHJvdGVjdGVkIE9wYWNpdHlFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdEaXNwbGF5TmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9ESVNQTEFZX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRElTUExBWV9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd1N0eWxlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUWUxFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUWUxFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd1N0YXJ0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUQVJUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUQVJUKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0VuZCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9FTkQpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRU5EKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdHRyRHJhd0FuZ2xlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0FOR0xFKSkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQU5HTEUpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3Qm9yZGVyKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0JPUkRFUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9CT1JERVIpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUGFnZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9QYWdlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2M2E5YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9QYWdlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkNvbnRlbnRCYXNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyM2QuRHIzZENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5EcmF3Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LlBhZ2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuQm9keUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5Eb2N1bWVudENvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5wcmVzZW50YXRpb24uTm90ZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5wcmVzZW50YXRpb24uUHJlc2VudGF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC54cGF0aC5YUGF0aFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1jbGFzcyBQYWdlRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFBhZ2VFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MTk4ODQxMzYyMjIzNzk1NDkwTDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhQYXRoU2VydmljZSB4cGF0aFNlcnZpY2UgPSBYUGF0aFNlcnZpY2VGYWN0b3J5Ci0JCQkubmV3U2VydmljZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEVYUDEgPSB4cGF0aFNlcnZpY2UKLQkJCS5jb21waWxlKCIuLypbKG5hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkrIERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJICsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9SRUNUICsgIicpIG9yIgotCQkJCQkrICIobmFtZXNwYWNlLXVyaSgpPSciICsgRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkkKLQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX0xJTkUKLQkJCQkJKyAiJykgb3IiICsgIihuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUE9MWUxJTkUgKyAiJykgb3IiCi0JCQkJCSsgIihuYW1lc3BhY2UtdXJpKCk9JyIgKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSQotCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUE9MWUdPTgotCQkJCQkrICInKSBvciIgKyAiKG5hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkrIERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJICsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9SRUdVTEFSX1BPTFlHT04gKyAiJykgb3IiCi0JCQkJCSsgIihuYW1lc3BhY2UtdXJpKCk9JyIgKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSQotCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUEFUSAotCQkJCQkrICInKSBvciIgKyAiKG5hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkrIERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJICsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9DSVJDTEUgKyAiJykgb3IiCi0JCQkJCSsgIihuYW1lc3BhY2UtdXJpKCk9JyIgKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSQotCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIgKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfRUxMSVBTRQotCQkJCQkrICInKSBvciIgKyAiKG5hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkrIERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJICsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9HICsgIicpIG9yIiArICIobmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCSsgRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkkgKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciCi0JCQkJCSsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX1BBR0VfVEhVTUJOQUlMICsgIicpIG9yIgotCQkJCQkrICIobmFtZXNwYWNlLXVyaSgpPSciICsgRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkkKLQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX01FQVNVUkUKLQkJCQkJKyAiJykgb3IiICsgIihuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfQ0FQVElPTiArICInKSBvciIKLQkJCQkJKyAiKG5hbWVzcGFjZS11cmkoKT0nIiArIERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJCi0JCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9DT05ORUNUT1IKLQkJCQkJKyAiJykgb3IiICsgIihuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfQ1VTVE9NX1NIQVBFICsgIicpIG9yIgotCQkJCQkrICIobmFtZXNwYWNlLXVyaSgpPSciICsgRHIzZENvbnN0YW50cy5EUjNEX05BTUVTUEFDRV9VUkkKLQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgRHIzZENvbnN0YW50cy5FTEVNRU5UX1NDRU5FCi0JCQkJCSsgIicpXSIpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBFWFAyID0geHBhdGhTZXJ2aWNlCi0JCQkuY29tcGlsZSgiLi8qW25hbWVzcGFjZS11cmkoKT0nIiArIERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJCi0JCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9QQUdFCi0JCQkJCSsgIiddIik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEVYUDMgPSB4cGF0aFNlcnZpY2UKLQkJCS5jb21waWxlKCIuLypbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCSsgUHJlc2VudGF0aW9uQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9OQU1FU1BBQ0VfVVJJCi0JCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkrIFByZXNlbnRhdGlvbkNvbnN0YW50cy5FTEVNRU5UX05PVEVTICsgIiddIik7Ci0KLQlwcml2YXRlIENvbnRlbnRCYXNlRWxlbWVudCBjb250ZW50RWxlbWVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgUGFnZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIE9ERkVsZW1lbnQgY3JlYXRlT2JqZWN0KGxvbmcgeCwgbG9uZyB5LCBsb25nIHdpZHRoLCBsb25nIGhlaWdodCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UGFnZUluZGV4KCkgewotCQlpZiAob2RmRG9jID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJRWxlbWVudCByb290ID0gb2RmRG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlpZiAocm9vdCBpbnN0YW5jZW9mIERvY3VtZW50Q29udGVudEVsZW1lbnQpIHsKLQkJCUJvZHlFbGVtZW50IGJvZHkgPSAoKERvY3VtZW50Q29udGVudEVsZW1lbnQpIHJvb3QpLmdldEJvZHlFbGVtZW50KCk7Ci0JCQljb250ZW50RWxlbWVudCA9IGJvZHkuZ2V0Q29udGVudCgpOwotCQl9Ci0KLQkJaWYgKGNvbnRlbnRFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJTm9kZUxpc3QgbGlzdCA9IFhQYXRoU2VydmljZUZhY3RvcnkubmV3U2VydmljZSgpLmV2YWxGb3JOb2RlTGlzdChFWFAyLAotCQkJCWNvbnRlbnRFbGVtZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChsaXN0Lml0ZW0oaSkuZXF1YWxzKHRoaXMpKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd05hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd1N0eWxlTmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVFlMRV9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUWUxFX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3TWFzdGVyUGFnZU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTUFTVEVSX1BBR0VfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9NQVNURVJfUEFHRV9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd05hdk9yZGVyKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX05BVl9PUkRFUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9OQVZfT1JERVIpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIE5hdk9yZGVyQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8T0RGRWxlbWVudD4gewotCQkvKgotCQkgKiBwcml2YXRlIGJvb2xlYW4gaXNUaXRsZVNoYXBlKE9ERkVsZW1lbnQgc2hhcGUpIHsgdHJ5IHsgaWYoCi0JCSAqICJ0aXRsZSI9PXNoYXBlLmdldEF0dHJpYnV0ZU5TKFByZXNlbnRhdGlvbkNvbnN0YW50cy5QUkVTRU5UQVRJT05fTkFNRVNQQUNFX1VSSSwKLQkJICogUHJlc2VudGF0aW9uQ29uc3RhbnRzLkFUVFJfQ0xBU1MpICkgeyByZXR1cm4gdHJ1ZTsgfSB9Ci0JCSAqIGNhdGNoKEV4Y2VwdGlvbiBlKSB7fSByZXR1cm4gZmFsc2U7IH0KLQkJICovCi0KLQkJcHJpdmF0ZSBpbnQgZ2V0TmF2T3JkZXIoT0RGRWxlbWVudCBzaGFwZSwgU3RyaW5nIG5hdk9yZGVycykgewotCQkJU3RyaW5nIGlkID0gc2hhcGUuZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9JRCk7Ci0JCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCWludCBpbmRleCA9IG5hdk9yZGVycy5pbmRleE9mKGlkKTsKLQkJCQlpZiAoaW5kZXggPj0gMCkgewotCQkJCQlyZXR1cm4gaW5kZXg7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5hdk9yZGVycy5sZW5ndGgoKTsKLQkJfQotCi0JCXByaXZhdGUgaW50IGdldFpPcmRlcihPREZFbGVtZW50IHNoYXBlKSB7Ci0JCQlOb2RlIHBhcmVudCA9IHNoYXBlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmICghKHBhcmVudCBpbnN0YW5jZW9mIFBhZ2VFbGVtZW50KSkKLQkJCQlyZXR1cm4gLTE7Ci0KLQkJCWludCBpbmRleCA9IDA7Ci0JCQlOb2RlIHByZVNpYiA9IHNoYXBlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJd2hpbGUgKHByZVNpYiAhPSBudWxsKSB7Ci0JCQkJaWYgKHByZVNpYiBpbnN0YW5jZW9mIE9ERkVsZW1lbnQpCi0JCQkJCWluZGV4Kys7Ci0JCQkJcHJlU2liID0gcHJlU2liLmdldFByZXZpb3VzU2libGluZygpOwotCQkJfQotCQkJcmV0dXJuIGluZGV4OwotCQl9Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9ERkVsZW1lbnQgYSwgT0RGRWxlbWVudCBiKSB7Ci0JCQkvKgotCQkJICogaWYoIGlzVGl0bGVTaGFwZShhKSApIHsgcmV0dXJuIC0xOyB9Ci0JCQkgKi8KLQkJCVN0cmluZyBuYXZPcmRlcnMgPSBnZXRBdHRyRHJhd05hdk9yZGVyKCk7Ci0JCQlpZiAobmF2T3JkZXJzICE9IG51bGwpIHsKLQkJCQlpbnQgb0RlbHRhID0gZ2V0TmF2T3JkZXIoYSwgbmF2T3JkZXJzKQotCQkJCQkJLSBnZXROYXZPcmRlcihiLCBuYXZPcmRlcnMpOwotCQkJCWlmIChvRGVsdGEgIT0gMCkgewotCQkJCQlyZXR1cm4gb0RlbHRhOwotCQkJCX0KLQkJCX0KLQkJCWludCBvRGVsdGEgPSBnZXRaT3JkZXIoYSkgLSBnZXRaT3JkZXIoYik7Ci0JCQlpZiAob0RlbHRhICE9IDApIHsKLQkJCQlyZXR1cm4gb0RlbHRhOwotCQkJfQotCi0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXB1YmxpYyBMaXN0PE9ERkVsZW1lbnQ+IGdldENoaWxkTm9kZXNJbk5hdk9yZGVyKCkgewotCQlMaXN0PE9ERkVsZW1lbnQ+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPREZFbGVtZW50PigpOwotCQlOb2RlTGlzdCBubCA9IGdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAobmwuaXRlbShpKSBpbnN0YW5jZW9mIE9ERkVsZW1lbnQpIHsKLQkJCQljaGlsZHJlbi5hZGQoKE9ERkVsZW1lbnQpIG5sLml0ZW0oaSkpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBuYXZPcmRlciA9IGdldEF0dHJEcmF3TmF2T3JkZXIoKTsKLQkJaWYgKG5hdk9yZGVyID09IG51bGwpCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgbmV3IE5hdk9yZGVyQ29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogZ2V0IGRyYXdpbmcgZWxlbWVudHMgbGlzdGVkIGJlbG93ICJkcmF3OnJlY3QiICJkcmF3OmxpbmUiICJkcmF3OnBvbHlsaW5lIgotCSAqICJkcmF3OnBvbHlnb24iICJkcmF3OnJlZ3VsYXItcG9seWdvbiIgImRyYXc6cGF0aCIgImRyYXc6Y2lyY2xlIgotCSAqICJkcmF3OmVsbGlwc2UiICJkcmF3OmciICJkcmF3OnBhZ2UtdGh1bWJuYWlsIiAiZHJhdzptZWFzdXJlIgotCSAqICJkcmF3OmNhcHRpb24iICJkcmF3OmNvbm5lY3RvciIgImRyYXc6Y3VzdG9tLXNoYXBlIiAiZHIzZDpzY2VuZSIKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RHJhd2luZ09iamVjdEVsZW1lbnRzKCkgewotCQlyZXR1cm4geHBhdGhTZXJ2aWNlLmV2YWxGb3JOb2RlTGlzdChFWFAxLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgTm90ZXNFbGVtZW50IGdldFByZXNlbnRhdGlvbk5vdGVzRWxlbWVudCgpIHsKLQkJTm9kZUxpc3QgbmwgPSB4cGF0aFNlcnZpY2UuZXZhbEZvck5vZGVMaXN0KEVYUDMsIHRoaXMpOwotCQlpZiAoKG5sICE9IG51bGwpICYmIChubC5nZXRMZW5ndGgoKSA9PSAxKSkKLQkJCXJldHVybiAoTm90ZXNFbGVtZW50KSBubC5pdGVtKDApOwotCQllbHNlIGlmICgobmwgIT0gbnVsbCkgJiYgKG5sLmdldExlbmd0aCgpID4gMSkpIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oCi0JCQkJCSJkcmF3OnBhZ2UgaGFzIG1vcmUgdGhhbiBvbmUgcHJlc2VudGF0aW9uOm5vdGVzIGVsZW1lbnQiKQotCQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL1BhZ2VUaHVtYm5haWxFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUGFnZVRodW1ibmFpbEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNTg2NzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUGFnZVRodW1ibmFpbEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5EcmF3aW5nT2JqZWN0RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuUGFnZVRodW1ibmFpbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBQYWdlVGh1bWJuYWlsRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQYWdlVGh1bWJuYWlsRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzEzNzM5MjEyODkwOTk0NDU0TDsKLQotCXByb3RlY3RlZCBQYWdlVGh1bWJuYWlsRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUGF0aEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9QYXRoRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyNDdiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9QYXRoRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkRyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5QYXRoRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFBhdGhFbGVtZW50SW1wbCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFBhdGhFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjUzOTQ5MjQ5MTU1MTk1ODc2MUw7Ci0KLQlwcm90ZWN0ZWQgUGF0aEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL1BvbHlnb25FbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUG9seWdvbkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZWM2MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUG9seWdvbkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5EcmF3aW5nT2JqZWN0RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuUG9seWdvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBQb2x5Z29uRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQb2x5Z29uRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDQyMTAyNDM0NDE2MzQ1MzY2Mkw7Ci0KLQlwcm90ZWN0ZWQgUG9seWdvbkVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL1BvbHlsaW5lRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL1BvbHlsaW5lRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgwY2RjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9Qb2x5bGluZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5EcmF3aW5nT2JqZWN0RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuUG9seWxpbmVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgUG9seWxpbmVFbGVtZW50SW1wbCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVBvbHlsaW5lRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgyMjYzODcwNTgyMDI2ODQxMDdMOwotCi0JcHJvdGVjdGVkIFBvbHlsaW5lRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUmVjdEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9SZWN0RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhMzYwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9SZWN0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkRyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5SZWN0RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFJlY3RFbGVtZW50SW1wbCBleHRlbmRzIERyYXdpbmdPYmplY3RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFJlY3RFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTk5MzEzMTc2MTQ4MzkyMjFMOwotCi0JcHJvdGVjdGVkIFJlY3RFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9SZWd1bGFyUG9seWdvbkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9SZWd1bGFyUG9seWdvbkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YTI4YWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvUmVndWxhclBvbHlnb25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LlJlZ3VsYXJQb2x5Z29uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFJlZ3VsYXJQb2x5Z29uRWxlbWVudEltcGwgZXh0ZW5kcyBEcmF3aW5nT2JqZWN0RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlSZWd1bGFyUG9seWdvbkVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDEyNDAyNTExMzU2NjU3Mzc1MTlMOwotCi0JcHJvdGVjdGVkIFJlZ3VsYXJQb2x5Z29uRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvU3Ryb2tlRGFzaEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9TdHJva2VEYXNoRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3ZjE3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2RyYXcvaW1wbC9TdHJva2VEYXNoRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkRyYXdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuU3Ryb2tlRGFzaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBTdHJva2VEYXNoRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFN0cm9rZURhc2hFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MjEwMDM3NTMyODM1NDgwNTU3TDsKLQotCXByb3RlY3RlZCBTdHJva2VEYXNoRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3TmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RGlzcGxheU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRElTUExBWV9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RJU1BMQVlfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdHlsZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVFlMRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVFlMRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckRyYXdEb3RzMSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9ET1RTMSkpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RPVFMxKSkuaW50VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0RvdHMxTGVuZ3RoKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RPVFMxX0xFTkdUSCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9ET1RTMV9MRU5HVEgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJEcmF3RG90czIoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRE9UUzIpKSB7Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9ET1RTMikpLmludFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdEb3RzMkxlbmd0aCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9ET1RTMl9MRU5HVEgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRE9UUzJfTEVOR1RIKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0Rpc3RhbmNlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RJU1RBTkNFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0RJU1RBTkNFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZHJhdy9pbXBsL1RleHRCb3hFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvVGV4dEJveEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNWIyODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9kcmF3L2ltcGwvVGV4dEJveEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5UZXh0Qm94RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFRleHRCb3hFbGVtZW50SW1wbCBleHRlbmRzIEVtYmVkRHJhd2luZ09iamVjdEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGV4dEJveEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMzE4MzIzMzk1OTEwODYxMjE4TDsKLQotCXByb3RlY3RlZCBUZXh0Qm94RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0J1dHRvbkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9CdXR0b25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNDY4ODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0J1dHRvbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGZvcm06YnV0dG9uPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJ1dHRvbkVsZW1lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9DaGVja2JveEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9DaGVja2JveEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxZjA3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vQ2hlY2tib3hFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxmb3JtOmNoZWNrYm94PiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENoZWNrYm94RWxlbWVudCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0NvbHVtbkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9Db2x1bW5FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMWIzMTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0NvbHVtbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGZvcm06Y29sdW1uPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbHVtbkVsZW1lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9Db21ib2JveEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9Db21ib2JveEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhN2M4Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vQ29tYm9ib3hFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxmb3JtOmNvbWJvYm94PiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbWJvYm94RWxlbWVudCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0RhdGVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRGF0ZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwNTAzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRGF0ZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxmb3JtOmRhdGU+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGF0ZUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRml4ZWRUZXh0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0ZpeGVkVGV4dEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5NGQ1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRml4ZWRUZXh0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm07Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8Zm9ybTpmaXhlZC10ZXh0PiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpeGVkVGV4dEVsZW1lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1Gb3IoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRm9ybUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0Zvcm1Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjYzJmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRm9ybUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm07Ci0KLS8qKgotICogRm9ybUNvbnN0YW50cyBkZWZpbmVzIHRoZSBjb25zdGFudCB2YWx1ZXMgdXNlZCBieSBmb3JtIG5hbWVzcGFjZSBvZiBPREYgRE9NIEFQSQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRm9ybUNvbnN0YW50cyB7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRk9STV9OQU1FU1BBQ0VfVVJJID0gInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6Zm9ybToxLjAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9CVVRUT04gPSAiYnV0dG9uIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQ0hFQ0tCT1ggPSAiY2hlY2tib3giOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DT0xVTU4gPSAiY29sdW1uIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQ09NQk9CT1ggPSAiY29tYm9ib3giOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9EQVRFID0gImRhdGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9GSVhFRF9URVhUID0gImZpeGVkLXRleHQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9GT1JNQVRURURfVEVYVCA9ICJmb3JtYXR0ZWQtdGV4dCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0ZPUk0gPSAiZm9ybSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0ZSQU1FID0gImZyYW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfSVRFTSA9ICJpdGVtIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTElTVEJPWCA9ICJsaXN0Ym94IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTlVNQkVSID0gIm51bWJlciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX09QVElPTiA9ICJvcHRpb24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QUk9QRVJUWSA9ICJwcm9wZXJ0eSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1JBRElPID0gInJhZGlvIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEVYVEFSRUEgPSAidGV4dGFyZWEiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9URVhUID0gInRleHQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9BVVRPTUFUSUNfRk9DVVMgPSAiYXV0b21hdGljLWZvY3VzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQVBQTFlfREVTSUdOX01PREUgPSAiYXBwbHktZGVzaWduLW1vZGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9MQUJFTCA9ICJsYWJlbCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1RBQl9JTkRFWCA9ICJ0YWItaW5kZXgiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9UQUJfU1RPUCA9ICJ0YWItc3RvcCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZPUiA9ICJmb3IiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT05UUk9MX0lNUExFTUVOVEFUSU9OID0gImNvbnRyb2wtaW1wbGVtZW50YXRpb24iOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9Gb3JtQ29udHJvbEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9Gb3JtQ29udHJvbEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5NjRmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRm9ybUNvbnRyb2xFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLS8qKgotICogT0RGIGVsZW1lbnRzIHJlcHJlc2VudGluZyBmb3JtIGNvbnRyb2xzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRm9ybUNvbnRyb2xFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybUxhYmVsKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtVGFiSW5kZXgoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJGb3JtVGFiU3RvcCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybUNvbnRyb2xJbXBsZW1lbnRhdGlvbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9Gb3JtRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0Zvcm1FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MzFjZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0Zvcm1FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8Zm9ybTpmb3JtPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZvcm1FbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0Zvcm1hdHRlZFRleHRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRm9ybWF0dGVkVGV4dEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyNDJiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRm9ybWF0dGVkVGV4dEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGZvcm06Zm9ybWF0dGVkLXRleHQ+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRm9ybWF0dGVkVGV4dEVsZW1lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9GcmFtZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9GcmFtZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhMGJhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vRnJhbWVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxmb3JtOmZyYW1lPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZyYW1lRWxlbWVudCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0l0ZW1FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vSXRlbUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0YWY5Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vSXRlbUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGZvcm06aXRlbT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJdGVtRWxlbWVudCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL0xpc3Rib3hFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vTGlzdGJveEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBmZDBhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vTGlzdGJveEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGZvcm06bGlzdGJveD4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBMaXN0Ym94RWxlbWVudCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL051bWJlckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9OdW1iZXJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjUzNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL051bWJlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGZvcm06bnVtYmVyPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE51bWJlckVsZW1lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9PcHRpb25FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vT3B0aW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDdlODAzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9PcHRpb25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxmb3JtOm9wdGlvbj4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcHRpb25FbGVtZW50IGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vUHJvcGVydHlFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vUHJvcGVydHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTMyODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL1Byb3BlcnR5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGZvcm06cHJvcGVydHk+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL1JhZGlvRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL1JhZGlvRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDQ1MDIxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9SYWRpb0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPGZvcm06cmFkaW8+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmFkaW9FbGVtZW50IGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vVGV4dEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9UZXh0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjY4NGM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9UZXh0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm07Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8Zm9ybTp0ZXh0PiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRleHRFbGVtZW50IGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vVGV4dGFyZWFFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vVGV4dGFyZWFFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Y2QxMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL1RleHRhcmVhRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm07Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8Zm9ybTp0ZXh0YXJlYT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBUZXh0YXJlYUVsZW1lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0J1dHRvbkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9CdXR0b25FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODg0MjI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0J1dHRvbkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uQnV0dG9uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEJ1dHRvbkVsZW1lbnRJbXBsIGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEJ1dHRvbkVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04OTc1NTUyOTI0NzQ0MzcyNDA2TDsKLQotCXByb3RlY3RlZCBCdXR0b25FbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9DaGVja2JveEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9DaGVja2JveEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYWMwMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvQ2hlY2tib3hFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkNoZWNrYm94RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIENoZWNrYm94RWxlbWVudEltcGwgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQ2hlY2tib3hFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzM3MDU1ODY0MTIzODA2OTAxNUw7Ci0KLQlwcm90ZWN0ZWQgQ2hlY2tib3hFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9Db2x1bW5FbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvQ29sdW1uRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjZGJkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9Db2x1bW5FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkNvbHVtbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBDb2x1bW5FbGVtZW50SW1wbCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudEltcGwgaW1wbGVtZW50cyBDb2x1bW5FbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODgyNTE0Mzk0OTc2MTkyNTMwM0w7Ci0KLQlwcm90ZWN0ZWQgQ29sdW1uRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvQ29tYm9ib3hFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvQ29tYm9ib3hFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjYzNjZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0NvbWJvYm94RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5Db21ib2JveEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBDb21ib2JveEVsZW1lbnRJbXBsIGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUNvbWJvYm94RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzIwMzExMjYxODk1MzM2MTYzNkw7Ci0KLQlwcm90ZWN0ZWQgQ29tYm9ib3hFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9EYXRlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0RhdGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmUxNTE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0RhdGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRGF0ZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBEYXRlRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIERhdGVFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3NjYzNTc1NTcyMTIxOTkwMTE5TDsKLQotCXByb3RlY3RlZCBEYXRlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvRml4ZWRUZXh0RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0ZpeGVkVGV4dEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMmYxYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvRml4ZWRUZXh0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5GaXhlZFRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkZvcm1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBGaXhlZFRleHRFbGVtZW50SW1wbCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlGaXhlZFRleHRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDY4NjQ3NjI1MDAwNTYzODI5NEw7Ci0KLQlwcm90ZWN0ZWQgRml4ZWRUZXh0RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtRm9yKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybUNvbnN0YW50cy5GT1JNX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybUNvbnN0YW50cy5BVFRSX0ZPUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybUNvbnN0YW50cy5GT1JNX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1Db25zdGFudHMuQVRUUl9GT1IpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvRm9ybUNvbnRyb2xFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvRm9ybUNvbnRyb2xFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmFmNzkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0Zvcm1Db250cm9sRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkZvcm1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRm9ybUNvbnRyb2xFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotYWJzdHJhY3QgY2xhc3MgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJRm9ybUNvbnRyb2xFbGVtZW50IHsKLQlwcm90ZWN0ZWQgRm9ybUNvbnRyb2xFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1MYWJlbCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1Db25zdGFudHMuRk9STV9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1Db25zdGFudHMuQVRUUl9MQUJFTCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybUNvbnN0YW50cy5GT1JNX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1Db25zdGFudHMuQVRUUl9MQUJFTCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1UYWJJbmRleCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1Db25zdGFudHMuRk9STV9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1Db25zdGFudHMuQVRUUl9UQUJfSU5ERVgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1Db25zdGFudHMuRk9STV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtQ29uc3RhbnRzLkFUVFJfVEFCX0lOREVYKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckZvcm1UYWJTdG9wKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybUNvbnN0YW50cy5GT1JNX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybUNvbnN0YW50cy5BVFRSX1RBQl9JTkRFWCkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUyhGb3JtQ29uc3RhbnRzLkZPUk1fTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybUNvbnN0YW50cy5BVFRSX1RBQl9TVE9QKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1Db250cm9sSW1wbGVtZW50YXRpb24oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtQ29uc3RhbnRzLkZPUk1fTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtQ29uc3RhbnRzLkFUVFJfQ09OVFJPTF9JTVBMRU1FTlRBVElPTikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybUNvbnN0YW50cy5GT1JNX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1Db25zdGFudHMuQVRUUl9DT05UUk9MX0lNUExFTUVOVEFUSU9OKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0Zvcm1FbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvRm9ybUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxODVlNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvRm9ybUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5Gb3JtRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEZvcm1FbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgRm9ybUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02ODQ2NTQ0NTQzMzczMjM2MjU3TDsKLQotCXByb3RlY3RlZCBGb3JtRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvRm9ybU5vZGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9Gb3JtTm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3YzgyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9Gb3JtTm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkFic3RyYWN0T0RGTm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRm9ybUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBGb3JtTm9kZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE9ERk5vZGVGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzcz4gdGFnTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTsKLQotCXN0YXRpYyB7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX0JVVFRPTiwgQnV0dG9uRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KEZvcm1Db25zdGFudHMuRUxFTUVOVF9DSEVDS0JPWCwgQ2hlY2tib3hFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX0NPTFVNTiwgQ29sdW1uRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KEZvcm1Db25zdGFudHMuRUxFTUVOVF9DT01CT0JPWCwgQ29tYm9ib3hFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX0RBVEUsIERhdGVFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcAotCQkJCS5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX0ZJWEVEX1RFWFQsCi0JCQkJCQlGaXhlZFRleHRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX0ZPUk1BVFRFRF9URVhULAotCQkJCUZvcm1hdHRlZFRleHRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX0ZPUk0sIEZvcm1FbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX0ZSQU1FLCBGcmFtZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChGb3JtQ29uc3RhbnRzLkVMRU1FTlRfSVRFTSwgSXRlbUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChGb3JtQ29uc3RhbnRzLkVMRU1FTlRfTElTVEJPWCwgTGlzdGJveEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChGb3JtQ29uc3RhbnRzLkVMRU1FTlRfTlVNQkVSLCBOdW1iZXJFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX09QVElPTiwgT3B0aW9uRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KEZvcm1Db25zdGFudHMuRUxFTUVOVF9QUk9QRVJUWSwgUHJvcGVydHlFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoRm9ybUNvbnN0YW50cy5FTEVNRU5UX1JBRElPLCBSYWRpb0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChGb3JtQ29uc3RhbnRzLkVMRU1FTlRfVEVYVEFSRUEsIFRleHRhcmVhRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KEZvcm1Db25zdGFudHMuRUxFTUVOVF9URVhULCBUZXh0RWxlbWVudEltcGwuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KE9ERkRvY3VtZW50IG9kZkRvYywgU3RyaW5nIHRhZ05hbWUsCi0JCQlFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ2xhc3MgY3MgPSAoQ2xhc3MpIHRhZ01hcC5nZXQodGFnTmFtZSk7Ci0JCWlmIChudWxsID09IGNzKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKEVsZW1lbnQpIGZpbmRFbGVtZW50Q29uc3RyYWN0b3IoY3MpLm5ld0luc3RhbmNlKAotCQkJCQluZXcgT2JqZWN0W10geyBvZGZEb2MsIGVsZW1lbnQgfSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9Gb3JtYXR0ZWRUZXh0RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0Zvcm1hdHRlZFRleHRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWIzOWU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0Zvcm1hdHRlZFRleHRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkZvcm1hdHRlZFRleHRFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgRm9ybWF0dGVkVGV4dEVsZW1lbnRJbXBsIGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUZvcm1hdHRlZFRleHRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTEzMDk5NTE5OTQ4Mzc1MjkyMkw7Ci0KLQlwcm90ZWN0ZWQgRm9ybWF0dGVkVGV4dEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0ZyYW1lRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0ZyYW1lRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxNzgxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9GcmFtZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRnJhbWVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgRnJhbWVFbGVtZW50SW1wbCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudEltcGwgaW1wbGVtZW50cyBGcmFtZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xOTI3Mjg2NDIxNDc5NTMwMTNMOwotCi0JcHJvdGVjdGVkIEZyYW1lRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvSXRlbUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9JdGVtRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2MDdkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9JdGVtRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5JdGVtRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEl0ZW1FbGVtZW50SW1wbCBleHRlbmRzIEZvcm1Db250cm9sRWxlbWVudEltcGwgaW1wbGVtZW50cyBJdGVtRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ1MDIyMDY5ODkyNzY0MjI0NTlMOwotCi0JcHJvdGVjdGVkIEl0ZW1FbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9MaXN0Ym94RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0xpc3Rib3hFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTVjZTAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL0xpc3Rib3hFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkxpc3Rib3hFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTGlzdGJveEVsZW1lbnRJbXBsIGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUxpc3Rib3hFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMTU1MDU3MjUyMzA1NDg3NTQ3TDsKLQotCXByb3RlY3RlZCBMaXN0Ym94RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvTnVtYmVyRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL051bWJlckVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNzE1ZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvTnVtYmVyRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5OdW1iZXJFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTnVtYmVyRWxlbWVudEltcGwgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnRJbXBsIGltcGxlbWVudHMgTnVtYmVyRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQzMzE3MDY1NTA3Njk0MDIxNTZMOwotCi0JcHJvdGVjdGVkIE51bWJlckVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL09wdGlvbkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9PcHRpb25FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmNkZjE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL09wdGlvbkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uT3B0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIE9wdGlvbkVsZW1lbnRJbXBsIGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE9wdGlvbkVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDk5NTY3OTQ0NjEyMjUyNDc1MEw7Ci0KLQlwcm90ZWN0ZWQgT3B0aW9uRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvUHJvcGVydHlFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvUHJvcGVydHlFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmIyNGFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL1Byb3BlcnR5RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLlByb3BlcnR5RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFByb3BlcnR5RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFByb3BlcnR5RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTkzOTYwNjAzMDYxODU0NTQ0Mkw7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9SYWRpb0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9SYWRpb0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MGRkMWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvUmFkaW9FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLlJhZGlvRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFJhZGlvRWxlbWVudEltcGwgZXh0ZW5kcyBGb3JtQ29udHJvbEVsZW1lbnRJbXBsIGltcGxlbWVudHMgUmFkaW9FbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjczNDI4NTkxODcxNDI4MTQ1NEw7Ci0KLQlwcm90ZWN0ZWQgUmFkaW9FbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm0vaW1wbC9UZXh0RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjFhMjFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgVGV4dEVsZW1lbnRJbXBsIGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRleHRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMjk1NDYxMzIzMjAyMzYyNDkxTDsKLQotCXByb3RlY3RlZCBUZXh0RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvVGV4dGFyZWFFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9mb3JtL2ltcGwvVGV4dGFyZWFFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmFjOTdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybS9pbXBsL1RleHRhcmVhRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5UZXh0YXJlYUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBUZXh0YXJlYUVsZW1lbnRJbXBsIGV4dGVuZHMgRm9ybUNvbnRyb2xFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVRleHRhcmVhRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTE5NDI3MDc5ODc5NjE4MTI1MEw7Ci0KLQlwcm90ZWN0ZWQgVGV4dGFyZWFFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL2Zvcm1hdC9Gb3JtYXRDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybWF0L0Zvcm1hdENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjNlZTU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvZm9ybWF0L0Zvcm1hdENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm1hdDsKLQotLyoqCi0gKiBGb3JtYXRDb25zdGFudHMgZGVmaW5lcyB0aGUgY29uc3RhbnQgdmFsdWVzIHVzZWQgYnkgWFNMIGZvcm1hdCBuYW1lc3BhY2Ugb2YgT0RGIERPTSBBUEkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZvcm1hdENvbnN0YW50cyB7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRk9STUFUX05BTUVTUEFDRV9VUkkgPSAidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczp4c2wtZm8tY29tcGF0aWJsZToxLjAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9CQUNLR1JPVU5EX0NPTE9SID0gImJhY2tncm91bmQtY29sb3IiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9CUkVBS19CRUZPUkUgPSAiYnJlYWstYmVmb3JlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9GQU1JTFkgPSAiZm9udC1mYW1pbHkiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GT05UX1NJWkUgPSAiZm9udC1zaXplIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9TVFlMRSA9ICJmb250LXN0eWxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9XRUlHSFQgPSAiZm9udC13ZWlnaHQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT0xPUiA9ICJjb2xvciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX01BUkdJTl9UT1AgPSAibWFyZ2luLXRvcCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX01BUkdJTl9CT1RUT00gPSAibWFyZ2luLWJvdHRvbSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX01BUkdJTl9MRUZUID0gIm1hcmdpbi1sZWZ0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTUFSR0lOX1JJR0hUID0gIm1hcmdpbi1yaWdodCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1BBR0VfV0lEVEggPSAicGFnZS13aWR0aCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1BBR0VfSEVJR0hUID0gInBhZ2UtaGVpZ2h0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQk9SREVSID0gImJvcmRlciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0JPUkRFUl9UT1AgPSAiYm9yZGVyLXRvcCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0JPUkRFUl9CT1RUT00gPSAiYm9yZGVyLWJvdHRvbSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0JPUkRFUl9MRUZUID0gImJvcmRlci1sZWZ0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQk9SREVSX1JJR0hUID0gImJvcmRlci1yaWdodCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1BBRERJTkcgPSAicGFkZGluZyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1RFWFRfQUxJR04gPSAidGV4dC1hbGlnbiI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9tYW5pZmVzdC9NYW5pZmVzdENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9tYW5pZmVzdC9NYW5pZmVzdENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDdhMGFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbWFuaWZlc3QvTWFuaWZlc3RDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5tYW5pZmVzdDsKLQotLyoqCi0gKiBNYW5pZmVzdENvbnN0YW50cyBkZWZpbmVzIHRoZSBjb25zdGFudCB2YWx1ZXMgdXNlZCBieSBtYW5pZmVzdCBuYW1lc3BhY2Ugb2YgT0RGIERPTSBBUEkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1hbmlmZXN0Q29uc3RhbnRzIHsKLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVF9OQU1FU1BBQ0VfVVJJID0gInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6bWFuaWZlc3Q6MS4wIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRU5DUllQVElPTl9EQVRBID0gImVuY3J5cHRpb24tZGF0YSI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9udW1iZXIvTnVtYmVyQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9OdW1iZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2ZGIzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9OdW1iZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5udW1iZXI7Ci0KLS8qKgotICogTnVtYmVyQ29uc3RhbnRzIGRlZmluZXMgdGhlIGNvbnN0YW50IHZhbHVlcyB1c2VkIGJ5IGRhdGEgc3R5bGUgbmFtZXNwYWNlIG9mIE9ERiBET00gQVBJCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdW1iZXJDb25zdGFudHMgewotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIE5VTUJFUl9OQU1FU1BBQ0VfVVJJID0gInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6ZGF0YXN0eWxlOjEuMCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX05VTUJFUiA9ICJudW1iZXIiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9URVhUID0gInRleHQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9OVU1CRVJfU1RZTEUgPSAibnVtYmVyLXN0eWxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTUlOX0lOVEVHRVJfRElHSVRTID0gIm1pbi1pbnRlZ2VyLWRpZ2l0cyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RFQ0lNQUxfUExBQ0VTID0gImRlY2ltYWwtcGxhY2VzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfR1JPVVBJTkcgPSAiZ3JvdXBpbmciOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL051bWJlckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL051bWJlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxYzUyYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9OdW1iZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYubnVtYmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxudW1iZXI6bnVtYmVyPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE51bWJlckVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgaW50IGdldEF0dHJOdW1iZXJNaW5JbnRlZ2VyRGlnaXRzKCk7Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJOdW1iZXJEZWNpbWFsUGxhY2VzKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyTnVtYmVyR3JvdXBpbmcoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9OdW1iZXJTdHlsZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL051bWJlclN0eWxlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjlkZjVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL051bWJlclN0eWxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm51bWJlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8bnVtYmVyOm51bWJlci1zdHlsZT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBOdW1iZXJTdHlsZUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZU5hbWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9UZXh0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9udW1iZXIvVGV4dEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiM2IwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9UZXh0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm51bWJlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8bnVtYmVyOnRleHQ+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGV4dEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9pbXBsL051bWJlckVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9pbXBsL051bWJlckVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNTZjZGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9udW1iZXIvaW1wbC9OdW1iZXJFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm51bWJlci5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYubnVtYmVyLk51bWJlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYubnVtYmVyLk51bWJlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBOdW1iZXJFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgTnVtYmVyRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc3MTI2MzI5Njc0MDMwNTE0ODlMOwotCi0JcHJvdGVjdGVkIE51bWJlckVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdHRyTnVtYmVyTWluSW50ZWdlckRpZ2l0cygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKE51bWJlckNvbnN0YW50cy5OVU1CRVJfTkFNRVNQQUNFX1VSSSwKLQkJCQlOdW1iZXJDb25zdGFudHMuQVRUUl9NSU5fSU5URUdFUl9ESUdJVFMpKSB7Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoCi0JCQkJCU51bWJlckNvbnN0YW50cy5OVU1CRVJfTkFNRVNQQUNFX1VSSSwKLQkJCQkJTnVtYmVyQ29uc3RhbnRzLkFUVFJfTUlOX0lOVEVHRVJfRElHSVRTKSkuaW50VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdHRyTnVtYmVyRGVjaW1hbFBsYWNlcygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKE51bWJlckNvbnN0YW50cy5OVU1CRVJfTkFNRVNQQUNFX1VSSSwKLQkJCQlOdW1iZXJDb25zdGFudHMuQVRUUl9ERUNJTUFMX1BMQUNFUykpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJTnVtYmVyQ29uc3RhbnRzLk5VTUJFUl9OQU1FU1BBQ0VfVVJJLAotCQkJCQlOdW1iZXJDb25zdGFudHMuQVRUUl9ERUNJTUFMX1BMQUNFUykpLmludFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJOdW1iZXJHcm91cGluZygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKE51bWJlckNvbnN0YW50cy5OVU1CRVJfTkFNRVNQQUNFX1VSSSwKLQkJCQlOdW1iZXJDb25zdGFudHMuQVRUUl9HUk9VUElORykpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJTnVtYmVyQ29uc3RhbnRzLk5VTUJFUl9OQU1FU1BBQ0VfVVJJLAotCQkJCQlOdW1iZXJDb25zdGFudHMuQVRUUl9HUk9VUElORykpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9udW1iZXIvaW1wbC9OdW1iZXJOb2RlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9udW1iZXIvaW1wbC9OdW1iZXJOb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDY3OTJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvbnVtYmVyL2ltcGwvTnVtYmVyTm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5udW1iZXIuaW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuQWJzdHJhY3RPREZOb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYubnVtYmVyLk51bWJlckNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBOdW1iZXJOb2RlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0T0RGTm9kZUZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPiB0YWdNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPigpOwotCi0Jc3RhdGljIHsKLQkJdGFnTWFwLnB1dChOdW1iZXJDb25zdGFudHMuRUxFTUVOVF9OVU1CRVIsIE51bWJlckVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChOdW1iZXJDb25zdGFudHMuRUxFTUVOVF9URVhULCBUZXh0RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KE51bWJlckNvbnN0YW50cy5FTEVNRU5UX05VTUJFUl9TVFlMRSwKLQkJCQlOdW1iZXJTdHlsZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChPREZEb2N1bWVudCBvZGZEb2MsIFN0cmluZyB0YWdOYW1lLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNsYXNzIGNzID0gKENsYXNzKSB0YWdNYXAuZ2V0KHRhZ05hbWUpOwotCQlpZiAobnVsbCA9PSBjcykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIChFbGVtZW50KSBmaW5kRWxlbWVudENvbnN0cmFjdG9yKGNzKS5uZXdJbnN0YW5jZSgKLQkJCQkJbmV3IE9iamVjdFtdIHsgb2RmRG9jLCBlbGVtZW50IH0pOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9udW1iZXIvaW1wbC9OdW1iZXJTdHlsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9pbXBsL051bWJlclN0eWxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwZDk3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9pbXBsL051bWJlclN0eWxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5udW1iZXIuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm51bWJlci5OdW1iZXJTdHlsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTnVtYmVyU3R5bGVFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTnVtYmVyU3R5bGVFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjk5NjE5MjAxNzQ0MjE0ODA5OEw7Ci0KLQlwcm90ZWN0ZWQgTnVtYmVyU3R5bGVFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlTmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9udW1iZXIvaW1wbC9UZXh0RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkZjk5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL251bWJlci9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm51bWJlci5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYubnVtYmVyLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgVGV4dEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBUZXh0RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjQ0MDUwMjU4Njc2MTcyMjU5M0w7Ci0KLQlwcm90ZWN0ZWQgVGV4dEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0F1dG9tYXRpY1N0eWxlc0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0F1dG9tYXRpY1N0eWxlc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2YTc2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9BdXRvbWF0aWNTdHlsZXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPG9mZmljZTphdXRvbWF0aWMtc3R5bGVzPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF1dG9tYXRpY1N0eWxlc0VsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgU3R5bGVFbGVtZW50IGdldFN0eWxlRWxlbWVudEJ5TmFtZShTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgbG9uZyBnZXRTdHlsZUVsZW1lbnRTaXplKCk7Ci0KLQlwdWJsaWMgU3R5bGVFbGVtZW50IGdldFN0eWxlRWxlbWVudChsb25nIGluZGV4KTsKLQotCXB1YmxpYyB2b2lkIGFkZFN0eWxlRWxlbWVudChTdHlsZUVsZW1lbnQgZWxlbWVudCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvQm9keUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0JvZHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNWZiZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvQm9keUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5Db250ZW50QmFzZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxvZmZpY2U6Ym9keT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBCb2R5RWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBDb250ZW50QmFzZUVsZW1lbnQgZ2V0Q29udGVudCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0NoYXJ0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvQ2hhcnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NTdkN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvQ2hhcnRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuTGVnZW5kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuUGxvdEFyZWFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5UaXRsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxvZmZpY2U6Y2hhcnQ+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hhcnRFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5DaGFydEVsZW1lbnQgZ2V0Q2hhcnRDaGFydEVsZW1lbnQoKTsKLQotCXB1YmxpYyBUaXRsZUVsZW1lbnQgZ2V0Q2hhcnRUaXRsZUVsZW1lbnQoKTsKLQotCXB1YmxpYyBQbG90QXJlYUVsZW1lbnQgZ2V0Q2hhcnRQbG90QXJlYUVsZW1lbnQoKTsKLQotCXB1YmxpYyBMZWdlbmRFbGVtZW50IGdldENoYXJ0TGVnZW5kRWxlbWVudCgpOwotCi0JcHVibGljIFRhYmxlRWxlbWVudCBnZXRDaGFydFRhYmxlRWxlbWVudCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0RvY3VtZW50Q29udGVudEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0RvY3VtZW50Q29udGVudEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmMjljYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9Eb2N1bWVudENvbnRlbnRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPG9mZmljZTpkb2N1bWVudC1jb250ZW50PiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50Q29udGVudEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgZG91YmxlIGdldEF0dHJPZmZpY2VWZXJzaW9uKCk7Ci0KLQlwdWJsaWMgQm9keUVsZW1lbnQgZ2V0Qm9keUVsZW1lbnQoKTsKLQotCXB1YmxpYyB2b2lkIHNhdmUoU3RyaW5nIHVyaSk7Ci0KLQlwdWJsaWMgU3R5bGVFbGVtZW50IGNyZWF0ZVN0eWxlKFN0cmluZyBmYW1pbHkpOwotCi0JcHVibGljIEZvbnRGYWNlRGVjbHNFbGVtZW50IGdldEZvbnRGYWNlRGVjbHNFbGVtZW50KCk7Ci0KLQlwdWJsaWMgQXV0b21hdGljU3R5bGVzRWxlbWVudCBnZXRBdXRvbWF0aWNTdHlsZXNFbGVtZW50KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvRG9jdW1lbnRTdHlsZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9Eb2N1bWVudFN0eWxlc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEzM2NiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9Eb2N1bWVudFN0eWxlc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPG9mZmljZTpkb2N1bWVudC1zdHlsZXM+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRTdHlsZXNFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JZG91YmxlIGdldEF0dHJPZmZpY2VWZXJzaW9uKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvRHJhd2luZ0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0RyYXdpbmdFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYjUyZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvRHJhd2luZ0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5Db250ZW50QmFzZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuUGFnZUVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8b2ZmaWNlOmRyYXdpbmc+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRHJhd2luZ0VsZW1lbnQgZXh0ZW5kcyBDb250ZW50QmFzZUVsZW1lbnQgewotCXB1YmxpYyBQYWdlRWxlbWVudCBnZXRQYWdlKGxvbmcgaWR4KTsKLQotCXB1YmxpYyBsb25nIGdldFBhZ2VTaXplKCk7Ci0KLQlwdWJsaWMgUGFnZUVsZW1lbnQgY3JlYXRlUGFnZShsb25nIGlkeCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9Gb250RmFjZURlY2xzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvRm9udEZhY2VEZWNsc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwN2UwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9Gb250RmFjZURlY2xzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8b2ZmaWNlOmZvbnQtZmFjZS1kZWNscz4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBGb250RmFjZURlY2xzRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL0Zvcm1zRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvRm9ybXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZGU2NDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvRm9ybXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxvZmZpY2U6Zm9ybXM+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRm9ybXNFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9NYXN0ZXJTdHlsZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9NYXN0ZXJTdHlsZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOWZhMTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvTWFzdGVyU3R5bGVzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8b2ZmaWNlOm1hc3Rlci1zdHlsZXM+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFzdGVyU3R5bGVzRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvT2ZmaWNlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9PZmZpY2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4YTUyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9PZmZpY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2U7Ci0KLS8qKgotICogT2ZmaWNlQ29uc3RhbnRzIGRlZmluZXMgdGhlIGNvbnN0YW50IHZhbHVlcyB1c2VkIGJ5IG9mZmljZSBuYW1lc3BhY2Ugb2YgT0RGIERPTSBBUEkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE9mZmljZUNvbnN0YW50cyB7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgT0ZGSUNFX05BTUVTUEFDRV9VUkkgPSAidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpvZmZpY2U6MS4wIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRE9DVU1FTlRfQ09OVEVOVCA9ICJkb2N1bWVudC1jb250ZW50IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRE9DVU1FTlRfU1RZTEVTID0gImRvY3VtZW50LXN0eWxlcyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0FVVE9NQVRJQ19TVFlMRVMgPSAiYXV0b21hdGljLXN0eWxlcyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0JPRFkgPSAiYm9keSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RFWFQgPSAidGV4dCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BSRVNFTlRBVElPTiA9ICJwcmVzZW50YXRpb24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TUFJFQURTSEVFVCA9ICJzcHJlYWRzaGVldCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0RSQVdJTkcgPSAiZHJhd2luZyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NIQVJUID0gImNoYXJ0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRk9OVF9GQUNFX0RFQ0xTID0gImZvbnQtZmFjZS1kZWNscyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0ZPUk1TID0gImZvcm1zIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTUFTVEVSX1NUWUxFUyA9ICJtYXN0ZXItc3R5bGVzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVFlQRSA9ICJ2YWx1ZS10eXBlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUUgPSAidmFsdWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVFlMRV9TT1VSQ0UgPSAic3R5bGUtc291cmNlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTUVOVUJBUl9WSVNJQkxFID0gIm1lbnViYXItdmlzaWJsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX09CSkVDVEJBUl9WSVNJQkxFID0gIm9iamVjdGJhci12aXNpYmxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVE9PTEJBUl9WSVNJQkxFID0gInRvb2xiYXItdmlzaWJsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZVTkNUSU9OQkFSX1ZJU0lCTEUgPSAiZnVuY3Rpb25iYXItdmlzaWJsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NUQVRVU0JBUl9WSVNJQkxFID0gInN0YXR1c2Jhci12aXNpYmxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfUk9XX0NPTFVNTl9IRUFERVJfVklTSUJMRSA9ICJyb3ctY29sdW1uLWhlYWRlci12aXNpYmxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9STVVMQUJBUl9UT0dHTEUgPSAiZm9ybXVsYWJhci10b2dnbGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9IWVBFUkxJTktCQVJfVE9HR0xFID0gImh5cGVybGlua2Jhci10b2dnbGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9USVRMRSA9ICJ0aXRsZSI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvUHJlc2VudGF0aW9uRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvUHJlc2VudGF0aW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzM4YzAxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL1ByZXNlbnRhdGlvbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2U7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8b2ZmaWNlOnByZXNlbnRhdGlvbj4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcmVzZW50YXRpb25FbGVtZW50IGV4dGVuZHMgRHJhd2luZ0VsZW1lbnQgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvU3ByZWFkU2hlZXRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9TcHJlYWRTaGVldEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0YThiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9TcHJlYWRTaGVldEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5Db250ZW50QmFzZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxvZmZpY2U6c3ByZWFkc2hlZXQ+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3ByZWFkU2hlZXRFbGVtZW50IGV4dGVuZHMgQ29udGVudEJhc2VFbGVtZW50IHsKLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyVGFibGVTdHJ1Y3R1cmVQcm90ZWN0ZWQoKTsKLQotCXB1YmxpYyBUYWJsZUVsZW1lbnQgZ2V0VGFibGUobG9uZyBpZHgpOwotCi0JcHVibGljIFRhYmxlRWxlbWVudCBnZXRUYWJsZUJ5TmFtZShTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgbG9uZyBnZXRUYWJsZVNpemUoKTsKLQotCXB1YmxpYyBUYWJsZUVsZW1lbnQgY3JlYXRlVGFibGUobG9uZyBpZHgsIFN0cmluZyBuYW1lKTsKLQotCXB1YmxpYyBUYWJsZUVsZW1lbnQgZ2V0QWN0aXZlVGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL1RleHRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9UZXh0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWEyMTZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL1RleHRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuQ29udGVudEJhc2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5JVGV4dEVsZW1lbnRDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLlRleHRSYW5nZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxvZmZpY2U6dGV4dD4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBUZXh0RWxlbWVudCBleHRlbmRzIENvbnRlbnRCYXNlRWxlbWVudCwgSVRleHRFbGVtZW50Q29udGFpbmVyIHsKLQlUZXh0UmFuZ2Ugc2VsZWN0KGxvbmcgc2VsdG9weCwgbG9uZyBzZWx0b3B5LCBsb25nIHNlbGVuZHgsIGxvbmcgc2VsZW5keSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0F1dG9tYXRpY1N0eWxlc0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0F1dG9tYXRpY1N0eWxlc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZDg3YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9BdXRvbWF0aWNTdHlsZXNFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkF1dG9tYXRpY1N0eWxlc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEF1dG9tYXRpY1N0eWxlc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlBdXRvbWF0aWNTdHlsZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMzg5MjY4MDcxNTAyNzM3ODI2TDsKLQotCXByb3RlY3RlZCBBdXRvbWF0aWNTdHlsZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHlsZUVsZW1lbnQgZ2V0U3R5bGVFbGVtZW50QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0U3R5bGVFbGVtZW50U2l6ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgU3R5bGVFbGVtZW50IGdldFN0eWxlRWxlbWVudChsb25nIGluZGV4KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3R5bGVFbGVtZW50KFN0eWxlRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0JvZHlFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9Cb2R5RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzljN2Y1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0JvZHlFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkNvbnRlbnRCYXNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuQm9keUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1jbGFzcyBCb2R5RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEJvZHlFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzg0NzkzNzAzMDA4Njk5OTY1M0w7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMaXN0PENsYXNzPiB2YWxpZEJvZHlSb290RWxlbWVudCA9IG5ldyBWZWN0b3I8Q2xhc3M+KCk7Ci0Jc3RhdGljIHsKLQkJdmFsaWRCb2R5Um9vdEVsZW1lbnQuYWRkKERyYXdpbmdFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXZhbGlkQm9keVJvb3RFbGVtZW50LmFkZChTcHJlYWRTaGVldEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdmFsaWRCb2R5Um9vdEVsZW1lbnQuYWRkKENoYXJ0RWxlbWVudEltcGwuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBCb2R5RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQ29udGVudEJhc2VFbGVtZW50IGdldENvbnRlbnQoKSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoKGNoaWxkcmVuICE9IG51bGwpICYmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSAhPSAwKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkgaW5zdGFuY2VvZiBDb250ZW50QmFzZUVsZW1lbnQpCi0JCQkJCXJldHVybiAoQ29udGVudEJhc2VFbGVtZW50KSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0NoYXJ0RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvQ2hhcnRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2NlZDM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvQ2hhcnRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHMuQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuTGVnZW5kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuUGxvdEFyZWFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5UaXRsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5DaGFydEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklDb250ZW50UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLWNsYXNzIENoYXJ0RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIENoYXJ0RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODUzNzcxNzM3ODI1MTA3MTUxNUw7Ci0KLQlwcm90ZWN0ZWQgQ2hhcnRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuQ2hhcnRFbGVtZW50IGdldENoYXJ0Q2hhcnRFbGVtZW50KCkgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkTm9kZXMoKTsKLQkJaWYgKChjaGlsZHJlbiAhPSBudWxsKSAmJiAoY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgIT0gMCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWlmIChjaGlsZHJlbi5pdGVtKGkpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkNoYXJ0RWxlbWVudCkKLQkJCQkJcmV0dXJuIChvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuQ2hhcnRFbGVtZW50KSBjaGlsZHJlbgotCQkJCQkJCS5pdGVtKGkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUaXRsZUVsZW1lbnQgZ2V0Q2hhcnRUaXRsZUVsZW1lbnQoKSB7Ci0JCW9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5DaGFydEVsZW1lbnQgY2hhcnRDaGFydEVsZW1udCA9IGdldENoYXJ0Q2hhcnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gY2hhcnRDaGFydEVsZW1udC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmICgoY2hpbGRyZW4gIT0gbnVsbCkgJiYgKGNoaWxkcmVuLmdldExlbmd0aCgpICE9IDApKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoY2hpbGRyZW4uaXRlbShpKSBpbnN0YW5jZW9mIFRpdGxlRWxlbWVudCkKLQkJCQkJcmV0dXJuIChUaXRsZUVsZW1lbnQpIGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFBsb3RBcmVhRWxlbWVudCBnZXRDaGFydFBsb3RBcmVhRWxlbWVudCgpIHsKLQkJb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNoYXJ0LkNoYXJ0RWxlbWVudCBjaGFydENoYXJ0RWxlbW50ID0gZ2V0Q2hhcnRDaGFydEVsZW1lbnQoKTsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBjaGFydENoYXJ0RWxlbW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKChjaGlsZHJlbiAhPSBudWxsKSAmJiAoY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgIT0gMCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWlmIChjaGlsZHJlbi5pdGVtKGkpIGluc3RhbmNlb2YgUGxvdEFyZWFFbGVtZW50KQotCQkJCQlyZXR1cm4gKFBsb3RBcmVhRWxlbWVudCkgY2hpbGRyZW4uaXRlbShpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGVnZW5kRWxlbWVudCBnZXRDaGFydExlZ2VuZEVsZW1lbnQoKSB7Ci0JCW9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jaGFydC5DaGFydEVsZW1lbnQgY2hhcnRDaGFydEVsZW1udCA9IGdldENoYXJ0Q2hhcnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gY2hhcnRDaGFydEVsZW1udC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmICgoY2hpbGRyZW4gIT0gbnVsbCkgJiYgKGNoaWxkcmVuLmdldExlbmd0aCgpICE9IDApKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoY2hpbGRyZW4uaXRlbShpKSBpbnN0YW5jZW9mIExlZ2VuZEVsZW1lbnQpCi0JCQkJCXJldHVybiAoTGVnZW5kRWxlbWVudCkgY2hpbGRyZW4uaXRlbShpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGdldENoYXJ0VGFibGVFbGVtZW50KCkgewotCQlvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuQ2hhcnRFbGVtZW50IGNoYXJ0Q2hhcnRFbGVtbnQgPSBnZXRDaGFydENoYXJ0RWxlbWVudCgpOwotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGNoYXJ0Q2hhcnRFbGVtbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoKGNoaWxkcmVuICE9IG51bGwpICYmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSAhPSAwKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpCi0JCQkJCXJldHVybiAoVGFibGVFbGVtZW50KSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENvbnRlbnRUeXBlLkNIQVJUOwotCX0KLQotCXB1YmxpYyBJQ29udGVudFJhbmdlIGNyZWF0ZVJhbmdlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0RvY3VtZW50Q29udGVudEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0RvY3VtZW50Q29udGVudEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZTA3MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9Eb2N1bWVudENvbnRlbnRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuQXV0b21hdGljU3R5bGVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkJvZHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuRG9jdW1lbnRDb250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkZvbnRGYWNlRGVjbHNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuT2ZmaWNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1jbGFzcyBEb2N1bWVudENvbnRlbnRFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJRG9jdW1lbnRDb250ZW50RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYwMTA5NzQ5NzU0MDU2MTE2NjRMOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgWFBhdGhTZXJ2aWNlIHhwYXRoU2VydmljZSA9IFhQYXRoU2VydmljZUZhY3RvcnkKLQkJCS5uZXdTZXJ2aWNlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEVYUDEgPSB4cGF0aFNlcnZpY2UKLQkJCS5jb21waWxlKCIuLypbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCSsgT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJCi0JCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX0JPRFkKLQkJCQkJKyAiJ10iKTsKLQotCXByb3RlY3RlZCBEb2N1bWVudENvbnRlbnRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ck9mZmljZVZlcnNpb24oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhPZmZpY2VDb25zdGFudHMuT0ZGSUNFX05BTUVTUEFDRV9VUkksCi0JCQkJT2ZmaWNlQ29uc3RhbnRzLkFUVFJfVkVSU0lPTikpIHsKLQkJCXJldHVybiBuZXcgRG91YmxlKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlPZmZpY2VDb25zdGFudHMuT0ZGSUNFX05BTUVTUEFDRV9VUkksCi0JCQkJCU9mZmljZUNvbnN0YW50cy5BVFRSX1ZFUlNJT04pKS5kb3VibGVWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMS4wOwotCX0KLQotCXB1YmxpYyBGb250RmFjZURlY2xzRWxlbWVudCBnZXRGb250RmFjZURlY2xzRWxlbWVudCgpIHsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCWlmICgoY2hpbGRyZW4gIT0gbnVsbCkgJiYgKGNoaWxkcmVuLmdldExlbmd0aCgpICE9IDApKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoY2hpbGRyZW4uaXRlbShpKSBpbnN0YW5jZW9mIEZvbnRGYWNlRGVjbHNFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoRm9udEZhY2VEZWNsc0VsZW1lbnQpIGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBdXRvbWF0aWNTdHlsZXNFbGVtZW50IGdldEF1dG9tYXRpY1N0eWxlc0VsZW1lbnQoKSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoKGNoaWxkcmVuICE9IG51bGwpICYmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSAhPSAwKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkgaW5zdGFuY2VvZiBBdXRvbWF0aWNTdHlsZXNFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoQXV0b21hdGljU3R5bGVzRWxlbWVudCkgY2hpbGRyZW4uaXRlbShpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEJvZHlFbGVtZW50IGdldEJvZHlFbGVtZW50KCkgewotCQlOb2RlTGlzdCBib2R5ID0geHBhdGhTZXJ2aWNlLmV2YWxGb3JOb2RlTGlzdChFWFAxLCB0aGlzKTsKLQkJaWYgKChib2R5ID09IG51bGwpIHx8IChib2R5LmdldExlbmd0aCgpICE9IDEpKSB7Ci0JCQluZXcgT0RGRXhjZXB0aW9uKCJPREYgZG9jdW1lbnQgbXVzdCBoYXZlIG9uZSBvZmZpY2U6Ym9keSBlbGVtZW50IikKLQkJCQkJLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChCb2R5RWxlbWVudCkgYm9keS5pdGVtKDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoU3RyaW5nIHVyaSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgU3R5bGVFbGVtZW50IGNyZWF0ZVN0eWxlKFN0cmluZyBmYW1pbHkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9Eb2N1bWVudFN0eWxlc0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0RvY3VtZW50U3R5bGVzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI1OGEwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0RvY3VtZW50U3R5bGVzRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5Eb2N1bWVudFN0eWxlc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5PZmZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBEb2N1bWVudFN0eWxlc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlEb2N1bWVudFN0eWxlc0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUxMjU1ODcxMTI5MjMxNjgzMjBMOwotCi0JcHJvdGVjdGVkIERvY3VtZW50U3R5bGVzRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgZG91YmxlIGdldEF0dHJPZmZpY2VWZXJzaW9uKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJLAotCQkJCU9mZmljZUNvbnN0YW50cy5BVFRSX1ZFUlNJT04pKSB7Ci0JCQlyZXR1cm4gbmV3IERvdWJsZShnZXRBdHRyaWJ1dGVOUygKLQkJCQkJT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlPZmZpY2VDb25zdGFudHMuQVRUUl9WRVJTSU9OKSkuZG91YmxlVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTEuMDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9EcmF3aW5nRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvRHJhd2luZ0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OGZmM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9EcmF3aW5nRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkNvbnN0YW50cy5Db250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkRyYXdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuUGFnZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5EcmF3aW5nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSUNvbnRlbnRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC54cGF0aC5YUGF0aFNlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWNsYXNzIERyYXdpbmdFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgRHJhd2luZ0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMzI0MTYxOTc1MjU2Mzk1MTA5TDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhQYXRoU2VydmljZSB4cGF0aFNlcnZpY2UgPSBYUGF0aFNlcnZpY2VGYWN0b3J5Ci0JCQkubmV3U2VydmljZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBFWFAxID0geHBhdGhTZXJ2aWNlCi0JCQkuY29tcGlsZSgiLi8qW25hbWVzcGFjZS11cmkoKT0nIiArIERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJCi0JCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIERyYXdDb25zdGFudHMuRUxFTUVOVF9QQUdFCi0JCQkJCSsgIiddIik7Ci0KLQlwcm90ZWN0ZWQgRHJhd2luZ0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIENvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ29udGVudFR5cGUuRFJBVzsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRlbnRSYW5nZSBjcmVhdGVSYW5nZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUGFnZUVsZW1lbnQgZ2V0UGFnZShsb25nIGlkeCkgewotCQlOb2RlTGlzdCBubCA9IHhwYXRoU2VydmljZS5ldmFsRm9yTm9kZUxpc3QoRVhQMSwgdGhpcyk7Ci0JCWlmICgoaWR4IDwgMCkgfHwgKGlkeCA+PSBubC5nZXRMZW5ndGgoKSkpIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oImludmFsaWQgcGFnZSBpbmRleCIpLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChQYWdlRWxlbWVudCkgbmwuaXRlbSgoaW50KSBpZHgpOwotCX0KLQotCXB1YmxpYyBsb25nIGdldFBhZ2VTaXplKCkgewotCQlyZXR1cm4geHBhdGhTZXJ2aWNlLmV2YWxGb3JOb2RlTGlzdChFWFAxLCB0aGlzKS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgUGFnZUVsZW1lbnQgY3JlYXRlUGFnZShsb25nIGlkeCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0ZvbnRGYWNlRGVjbHNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9Gb250RmFjZURlY2xzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyYzc2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL0ZvbnRGYWNlRGVjbHNFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkZvbnRGYWNlRGVjbHNFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgRm9udEZhY2VEZWNsc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlGb250RmFjZURlY2xzRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTc3MzI4MjM0MDY3MzY3MzAxOUw7Ci0KLQlwcm90ZWN0ZWQgRm9udEZhY2VEZWNsc0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvRm9ybXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9Gb3Jtc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NWYyODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9Gb3Jtc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuRm9ybXNFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgRm9ybXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgRm9ybXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA5MDgwMjk4NjAzMjU1ODA4OTdMOwotCi0JcHJvdGVjdGVkIEZvcm1zRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9NYXN0ZXJTdHlsZXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9NYXN0ZXJTdHlsZXNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzIyODcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvTWFzdGVyU3R5bGVzRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5NYXN0ZXJTdHlsZXNFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgTWFzdGVyU3R5bGVzRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU1hc3RlclN0eWxlc0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNTUyODkyNTE2MjA1NzE1Mjk1TDsKLQotCXByb3RlY3RlZCBNYXN0ZXJTdHlsZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL09mZmljZU5vZGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL09mZmljZU5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMDU2N2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9PZmZpY2VOb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5BYnN0cmFjdE9ERk5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuT2ZmaWNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIE9mZmljZU5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPREZOb2RlRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M+IHRhZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0KLQlzdGF0aWMgewotCQl0YWdNYXAucHV0KE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX0FVVE9NQVRJQ19TVFlMRVMsCi0JCQkJQXV0b21hdGljU3R5bGVzRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX0JPRFksIEJvZHlFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoT2ZmaWNlQ29uc3RhbnRzLkVMRU1FTlRfQ0hBUlQsIENoYXJ0RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX0RPQ1VNRU5UX0NPTlRFTlQsCi0JCQkJRG9jdW1lbnRDb250ZW50RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX0RPQ1VNRU5UX1NUWUxFUywKLQkJCQlEb2N1bWVudFN0eWxlc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChPZmZpY2VDb25zdGFudHMuRUxFTUVOVF9EUkFXSU5HLCBEcmF3aW5nRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX0ZPTlRfRkFDRV9ERUNMUywKLQkJCQlGb250RmFjZURlY2xzRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX0ZPUk1TLCBGb3Jtc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChPZmZpY2VDb25zdGFudHMuRUxFTUVOVF9NQVNURVJfU1RZTEVTLAotCQkJCU1hc3RlclN0eWxlc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChPZmZpY2VDb25zdGFudHMuRUxFTUVOVF9QUkVTRU5UQVRJT04sCi0JCQkJUHJlc2VudGF0aW9uRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX1NQUkVBRFNIRUVULAotCQkJCVNwcmVhZFNoZWV0RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX1RFWFQsIFRleHRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoT0RGRG9jdW1lbnQgb2RmRG9jLCBTdHJpbmcgdGFnTmFtZSwKLQkJCUVsZW1lbnQgZWxlbWVudCkgewotCQlDbGFzcyBjcyA9IChDbGFzcykgdGFnTWFwLmdldCh0YWdOYW1lKTsKLQkJaWYgKG51bGwgPT0gY3MpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoRWxlbWVudCkgZmluZEVsZW1lbnRDb25zdHJhY3RvcihjcykubmV3SW5zdGFuY2UoCi0JCQkJCW5ldyBPYmplY3RbXSB7IG9kZkRvYywgZWxlbWVudCB9KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvUHJlc2VudGF0aW9uRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvUHJlc2VudGF0aW9uRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxOGQzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL1ByZXNlbnRhdGlvbkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzLkNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuUHJlc2VudGF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFByZXNlbnRhdGlvbkVsZW1lbnRJbXBsIGV4dGVuZHMgRHJhd2luZ0VsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJUHJlc2VudGF0aW9uRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIzMjY4ODYzMTcwMTM5MzkxNDFMOwotCi0JcHJvdGVjdGVkIFByZXNlbnRhdGlvbkVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIENvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ29udGVudFR5cGUuUFJFU0VOVEFUSU9OOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvb2ZmaWNlL2ltcGwvU3ByZWFkU2hlZXRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9TcHJlYWRTaGVldEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YjE1NWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9TcHJlYWRTaGVldEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzLkNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5TcHJlYWRTaGVldEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklDb250ZW50UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1jbGFzcyBTcHJlYWRTaGVldEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlTcHJlYWRTaGVldEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNjk4NjU5ODU0ODEwMDUyMzA1TDsKLQotCXByb3RlY3RlZCBTcHJlYWRTaGVldEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIENvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ29udGVudFR5cGUuU1BSRUFEU0hFRVQ7Ci0JfQotCi0JcHVibGljIElDb250ZW50UmFuZ2UgY3JlYXRlUmFuZ2UoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clRhYmxlU3RydWN0dXJlUHJvdGVjdGVkKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX1NUUlVDVFVSRV9QUk9URUNURUQpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfU1RSVUNUVVJFX1BST1RFQ1RFRCkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGdldFRhYmxlKGxvbmcgaWR4KSB7Ci0JCU5vZGVMaXN0IG5sID0gZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLQkJCQlUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEUpOwotCQlyZXR1cm4gKFRhYmxlRWxlbWVudCkgbmwuaXRlbSgoaW50KSBpZHgpOwotCX0KLQotCXB1YmxpYyBUYWJsZUVsZW1lbnQgZ2V0VGFibGVCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRUYWJsZVNpemUoKSB7Ci0JCU5vZGVMaXN0IG5sID0gZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLQkJCQlUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEUpOwotCQlyZXR1cm4gbmwuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIFRhYmxlRWxlbWVudCBjcmVhdGVUYWJsZShsb25nIGlkeCwgU3RyaW5nIG5hbWUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGdldEFjdGl2ZVRhYmxlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9vZmZpY2UvaW1wbC9UZXh0RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiNWNjYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL29mZmljZS9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkNvbnN0YW50cy5Db250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklDb250ZW50UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuaW1wbC5JVGV4dEVsZW1lbnRDb250YWluZXJVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgVGV4dEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBUZXh0RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc3Mjg5MTAwNzU5ODg0MzkxNjNMOwotCi0JcHJvdGVjdGVkIFRleHRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2Ugc2VsZWN0KGxvbmcgc2VsdG9weCwgbG9uZyBzZWx0b3B5LCBsb25nIHNlbGVuZHgsCi0JCQlsb25nIHNlbGVuZHkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDb250ZW50VHlwZS5XUklURTsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRlbnRSYW5nZSBjcmVhdGVSYW5nZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50U2l6ZSgpIHsKLQkJcmV0dXJuIElUZXh0RWxlbWVudENvbnRhaW5lclV0aWwuZ2V0Q29udGVudFNpemUodGhpcyk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiBJVGV4dEVsZW1lbnRDb250YWluZXJVdGlsLmdldENoaWxkSXRlcmF0b3IodGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcHJlc2VudGF0aW9uL05vdGVzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9wcmVzZW50YXRpb24vTm90ZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkM2NjMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9wcmVzZW50YXRpb24vTm90ZXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucHJlc2VudGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5JVGV4dEVsZW1lbnRDb250YWluZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8cHJlc2VudGF0aW9uOm5vdGVzPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vdGVzRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSwgSUVkaXRhYmxlLAotCQlJVGV4dEVsZW1lbnRDb250YWluZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcHJlc2VudGF0aW9uL1ByZXNlbnRhdGlvbkNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9wcmVzZW50YXRpb24vUHJlc2VudGF0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzhlMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9wcmVzZW50YXRpb24vUHJlc2VudGF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucHJlc2VudGF0aW9uOwotCi0vKioKLSAqIFByZXNlbnRhdGlvbkNvbnN0YW50cyBkZWZpbmVzIHRoZSBjb25zdGFudCB2YWx1ZXMgdXNlZCBieSBwcmVzZW50YXRpb24gbmFtZXNwYWNlIG9mIE9ERiBET00gQVBJCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcmVzZW50YXRpb25Db25zdGFudHMgewotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRVNFTlRBVElPTl9OQU1FU1BBQ0VfVVJJID0gInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6cHJlc2VudGF0aW9uOjEuMCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX05PVEVTID0gIm5vdGVzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRElTUExBWV9IRUFERVIgPSAiZGlzcGxheS1oZWFkZXIiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ESVNQTEFZX0ZPT1RFUiA9ICJkaXNwbGF5LWZvb3RlciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RJU1BMQVlfUEFHRV9OVU1CRVIgPSAiZGlzcGxheS1wYWdlLW51bWJlciI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RJU1BMQVlfREFURV9USU1FID0gImRpc3BsYXktZGF0ZS10aW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9DTEFTU19WQUxVRV9OT1RFUyA9ICJub3RlcyI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9wcmVzZW50YXRpb24vaW1wbC9Ob3Rlc0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3ByZXNlbnRhdGlvbi9pbXBsL05vdGVzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE4NzVlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3ByZXNlbnRhdGlvbi9pbXBsL05vdGVzRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5wcmVzZW50YXRpb24uaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucHJlc2VudGF0aW9uLk5vdGVzRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIE5vdGVzRWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgTm90ZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3ODEwMjkyNTA4ODg0NjA0MzIyTDsKLQotCXByb3RlY3RlZCBOb3Rlc0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgZGF0YSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydChJRWRpdGFibGUgZGF0YSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVkaXRMaXN0ZW5lcihJRWRpdExpc3RlbmVyIG9ic2VydmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIGxvbmcgZ2V0Q29udGVudFNpemUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkSXRlcmF0b3IoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcHJlc2VudGF0aW9uL2ltcGwvUHJlc2VudGF0aW9uTm9kZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcHJlc2VudGF0aW9uL2ltcGwvUHJlc2VudGF0aW9uTm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkZDNlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3ByZXNlbnRhdGlvbi9pbXBsL1ByZXNlbnRhdGlvbk5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucHJlc2VudGF0aW9uLmltcGw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkFic3RyYWN0T0RGTm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnByZXNlbnRhdGlvbi5QcmVzZW50YXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgUHJlc2VudGF0aW9uTm9kZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE9ERk5vZGVGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzcz4gdGFnTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTsKLQotCXN0YXRpYyB7Ci0JCXRhZ01hcC5wdXQoUHJlc2VudGF0aW9uQ29uc3RhbnRzLkVMRU1FTlRfTk9URVMsIE5vdGVzRWxlbWVudEltcGwuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KE9ERkRvY3VtZW50IG9kZkRvYywgU3RyaW5nIHRhZ05hbWUsCi0JCQlFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ2xhc3MgY3MgPSAoQ2xhc3MpIHRhZ01hcC5nZXQodGFnTmFtZSk7Ci0JCWlmIChudWxsID09IGNzKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKEVsZW1lbnQpIGZpbmRFbGVtZW50Q29uc3RyYWN0b3IoY3MpLm5ld0luc3RhbmNlKAotCQkJCQluZXcgT2JqZWN0W10geyBvZGZEb2MsIGVsZW1lbnQgfSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3JhbmdlL0NlbGxSYW5nZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9DZWxsUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzOTUzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3JhbmdlL0NlbGxSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ2VsbEVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ2VsbFJhbmdlIGV4dGVuZHMgSUNvbnRlbnRSYW5nZSB7Ci0JcHVibGljIHZvaWQgc2V0Q2VsbFJhbmdlKGxvbmcgbGVmdCwgbG9uZyB0b3AsIGxvbmcgcmlnaHQsIGxvbmcgYm90dG9tKTsKLQotCXB1YmxpYyBUYWJsZUNlbGxFbGVtZW50IGdldENlbGwobG9uZyBjb2x1bW4sIGxvbmcgcm93KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcmFuZ2UvSUNvbnRlbnRDdXJzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcmFuZ2UvSUNvbnRlbnRDdXJzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIwNmIyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3JhbmdlL0lDb250ZW50Q3Vyc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnRDdXJzb3IgewotCXB1YmxpYyB2b2lkIGZvY3VzKElDb250ZW50UmFuZ2UgcmFuZ2UpOwotCi0JcHVibGljIElDb250ZW50UmFuZ2UgZ2V0U2VsZWN0aW9uKCk7Ci0KLQlwdWJsaWMgdm9pZCBuZXh0KCk7Ci0KLQlwdWJsaWMgdm9pZCBwcmV2KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9JQ29udGVudFJhbmdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3JhbmdlL0lDb250ZW50UmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJjNTdmYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3JhbmdlL0lDb250ZW50UmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnRSYW5nZSBleHRlbmRzIElFZGl0YWJsZSwgSVN0eWxhYmxlIHsKLQlTdHJpbmcgZ2V0VHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9JVGV4dEVsZW1lbnRDb250YWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcmFuZ2UvSVRleHRFbGVtZW50Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZDA3YjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9JVGV4dEVsZW1lbnRDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGludGVyZmFjZSBJVGV4dEVsZW1lbnRDb250YWluZXIgewotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCk7Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9UYWJsZUNlbGxSYW5nZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9UYWJsZUNlbGxSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzBiYzY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcmFuZ2UvVGFibGVDZWxsUmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVDZWxsUmFuZ2UgZXh0ZW5kcyBDZWxsUmFuZ2UgewotCVRhYmxlRWxlbWVudCBnZXRUYWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9UZXh0UmFuZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvcmFuZ2UvVGV4dFJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiN2Q4OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9UZXh0UmFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZTsKLQotcHVibGljIGludGVyZmFjZSBUZXh0UmFuZ2UgZXh0ZW5kcyBJQ29udGVudFJhbmdlLCBJVGV4dEVsZW1lbnRDb250YWluZXIgewotCVRleHRSYW5nZSBzZWxlY3QobG9uZyBzZWx0b3B4LCBsb25nIHNlbHRvcHksIGxvbmcgc2VsZW5keCwgbG9uZyBzZWxlbmR5KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3JhbmdlL2ltcGwvSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9yYW5nZS9pbXBsL0lUZXh0RWxlbWVudENvbnRhaW5lclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliMDMxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3JhbmdlL2ltcGwvSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5JVGV4dEVsZW1lbnRDb250YWluZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBJVGV4dEVsZW1lbnRDb250YWluZXJVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0Q2hpbGRMaXN0KEVsZW1lbnQgZWwpIHsKLQkJTGlzdDxOb2RlPiBsaXN0ID0gbmV3IFZlY3RvcjxOb2RlPigpOwotCQlOb2RlTGlzdCBubCA9IGVsLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gbmwuaXRlbShpKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElUZXh0RWxlbWVudENvbnRhaW5lcikgewotCQkJCWxpc3QuYWRkKGNoaWxkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0Q29udGVudFNpemUoRWxlbWVudCBlbCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRMaXN0KGVsKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBnZXRDaGlsZEl0ZXJhdG9yKEVsZW1lbnQgZWwpIHsKLQkJcmV0dXJuIGdldENoaWxkTGlzdChlbCkuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9DaGFydFByb3BlcnRpZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0NoYXJ0UHJvcGVydGllc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2NWZlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0NoYXJ0UHJvcGVydGllc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxzdHlsZTpjaGFydC1wcm9wZXJ0aWVzPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENoYXJ0UHJvcGVydGllc0VsZW1lbnQgZXh0ZW5kcyBTdHlsZVByb3BlcnRpZXNCYXNlIHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZURpcmVjdGlvbigpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0SmFwYW5lc2VDYW5kbGVTdGljaygpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0U3RvY2tXaXRoVm9sdW1lKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRUaHJlZURpbWVuc2lvbmFsKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnREZWVwKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRMaW5lcygpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnRJbnRlcnBvbGF0aW9uKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydFN5bWJvbFR5cGUoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydFZlcnRpY2FsKCk7Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJDaGFydExpbmVzVXNlZCgpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0Q29ubmVjdEJhcnMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckNoYXJ0U2VyaWVzU291cmNlKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRNZWFuVmFsdWUoKTsKLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ckNoYXJ0RXJyb3JNYXJnaW4oKTsKLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ckNoYXJ0RXJyb3JMb3dlckxpbWl0KCk7Ci0KLQlwdWJsaWMgZG91YmxlIGdldEF0dHJDaGFydEVycm9yVXBwZXJMaW1pdCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnRFcnJvckNhdGVnb3J5KCk7Ci0KLQlwdWJsaWMgZG91YmxlIGdldEF0dHJDaGFydEVycm9yUGVyY2VudGFnZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnRSZWdyZXNzaW9uVHlwZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnREYXRhTGFiZWxOdW1iZXIoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydERhdGFMYWJlbFRleHQoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydERhdGFMYWJlbFN5bWJvbCgpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0RGlzcGxheUxhYmVsKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRUaWNrTWFya3NNYWpvcklubmVyKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRUaWNrTWFya3NNYWpvck91dGVyKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRMb2dhcml0aG1pYygpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0VGV4dE92ZXJsYXAoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJUZXh0TGluZUJyZWFrKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydExhYmVsQXJyYW5nZW1lbnQoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydFZpc2libGUoKTsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckNoYXJ0R2FwV2lkdGgoKTsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0ckNoYXJ0T3ZlcmxhcCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnRTb2xpZFR5cGUoKTsKLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ckNoYXJ0T3JpZ2luKCk7Ci0KLQlwdWJsaWMgZG91YmxlIGdldEF0dHJDaGFydE1pbmltdW0oKTsKLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ckNoYXJ0TWF4aW11bSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvRGVmYXVsdFN0eWxlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9EZWZhdWx0U3R5bGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Yjc0YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9EZWZhdWx0U3R5bGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8c3R5bGU6ZGVmYXVsdC1zdHlsZT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBEZWZhdWx0U3R5bGVFbGVtZW50IGV4dGVuZHMgU3R5bGVFbGVtZW50IHsKLQlTdHJpbmcgZ2V0QXR0clN0eWxlRmFtaWx5KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9EcmF3aW5nUGFnZVByb3BlcnRpZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0RyYXdpbmdQYWdlUHJvcGVydGllc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1NGU2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0RyYXdpbmdQYWdlUHJvcGVydGllc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxzdHlsZTpkcmF3aW5nLXBhZ2UtcHJvcGVydGllcz4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBEcmF3aW5nUGFnZVByb3BlcnRpZXNFbGVtZW50IGV4dGVuZHMgU3R5bGVQcm9wZXJ0aWVzQmFzZSB7Ci0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clByZXNlbnRhdGlvbkRpc3BsYXlIZWFkZXIoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJQcmVzZW50YXRpb25EaXNwbGF5Rm9vdGVyKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyUHJlc2VudGF0aW9uRGlzcGxheVBhZ2VOdW1iZXIoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJQcmVzZW50YXRpb25EaXNwbGF5RGF0ZVRpbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdCYWNrZ3JvdW5kU2l6ZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0ZpbGwoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0ZvbnRGYWNlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9Gb250RmFjZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFiMDY1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0ZvbnRGYWNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHN0eWxlOmZvbnQtZmFjZT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBGb250RmFjZUVsZW1lbnQgZXh0ZW5kcyBTdHlsZVByb3BlcnRpZXNCYXNlIHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZU5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z0ZvbnRGYW1pbHkoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z0ZvbnRGYW1pbHlHZW5lcmljKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUZvbnRQaXRjaCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvR3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0dyYXBoaWNQcm9wZXJ0aWVzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDZlMGJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvR3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5HcmFkaWVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuT3BhY2l0eUVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8c3R5bGU6Z3JhcGhpYy1wcm9wZXJ0aWVzPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYXBoaWNQcm9wZXJ0aWVzRWxlbWVudCBleHRlbmRzIFN0eWxlUHJvcGVydGllc0Jhc2UgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdHJva2UoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdHJva2VEYXNoKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdTdHJva2VXaWR0aCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnU3Ryb2tlQ29sb3IoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdNYXJrZXJTdGFydFdpZHRoKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3TWFya2VyRW5kV2lkdGgoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1N0cm9rZU9wYWNpdHkoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdPcGFjaXR5KCk7Ci0KLQlwdWJsaWMgT3BhY2l0eUVsZW1lbnQgZ2V0QXR0ckRyYXdPcGFjaXR5TmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0ZpbGwoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdGaWxsQ29sb3IoKTsKLQotCXB1YmxpYyBHcmFkaWVudEVsZW1lbnQgZ2V0QXR0ckRyYXdGaWxsR3JhZGllbnROYW1lKCk7Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJEcmF3R3JhZGllbnRTdGVwQ291bnQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdGaWxsSW1hZ2VOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RmlsbEltYWdlV2lkdGgoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdGaWxsSW1hZ2VIZWlnaHQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlUmVwZWF0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RmlsbEltYWdlUmVmUG9pbnRYKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RmlsbEltYWdlUmVmUG9pbnRZKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RmlsbEltYWdlUmVmUG9pbnQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdUaWxlUmVwZWF0T2Zmc2V0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUhvcml6b250YWxQb3MoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0xpc3RMZXZlbFByb3BlcnRpZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL0xpc3RMZXZlbFByb3BlcnRpZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNDczMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9MaXN0TGV2ZWxQcm9wZXJ0aWVzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHN0eWxlOmxpc3QtbGV2ZWwtcHJvcGVydGllcz4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBMaXN0TGV2ZWxQcm9wZXJ0aWVzRWxlbWVudCBleHRlbmRzIFN0eWxlUHJvcGVydGllc0Jhc2UgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clNwYWNlQmVmb3JlKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyU3BhY2VCZWZvcmUoU3RyaW5nIGxlbmd0aCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJMYWJlbFdpZHRoKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyTGFiZWxXaWR0aChTdHJpbmcgd2lkdGgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9NYXBFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL01hcEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkMDJmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL01hcEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8c3R5bGU6bWFwPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUNvbmRpdGlvbigpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVBcHBseVN0eWxlTmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVCYXNlQ2VsbEFkZHJlc3MoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL01hc3RlclBhZ2VFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL01hc3RlclBhZ2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTkzYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9NYXN0ZXJQYWdlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxzdHlsZTptYXN0ZXItcGFnZT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBNYXN0ZXJQYWdlRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlTmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVQYWdlTGF5b3V0TmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd1N0eWxlTmFtZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvUGFnZUxheW91dEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvUGFnZUxheW91dEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1MjM2Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1BhZ2VMYXlvdXRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHN0eWxlOnBhZ2UtbGF5b3V0PiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhZ2VMYXlvdXRFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVOYW1lKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9QYWdlTGF5b3V0UHJvcGVydGllc0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvUGFnZUxheW91dFByb3BlcnRpZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YmYyODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9QYWdlTGF5b3V0UHJvcGVydGllc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxzdHlsZTpwYWdlLWxheW91dC1wcm9wZXJ0aWVzPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhZ2VMYXlvdXRQcm9wZXJ0aWVzRWxlbWVudCBleHRlbmRzIFN0eWxlUHJvcGVydGllc0Jhc2UgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdE1hcmdpblRvcCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0TWFyZ2luQm90dG9tKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRNYXJnaW5MZWZ0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRNYXJnaW5SaWdodCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0UGFnZVdpZHRoKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRQYWdlSGVpZ2h0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZVByaW50T3JpZW50YXRpb24oKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1BhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1BhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZjZlMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9QYXJhZ3JhcGhQcm9wZXJ0aWVzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHN0eWxlOnBhcmFncmFwaC1wcm9wZXJ0aWVzPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50IGV4dGVuZHMgU3R5bGVQcm9wZXJ0aWVzQmFzZSB7Ci0JcHVibGljIFRhYlN0b3BzRWxlbWVudCBnZXRUYWJTdG9wc0VsZW1lbnQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdExpbmVIZWlnaHQoKTsKLQotCXB1YmxpYyB2b2lkIHNldEF0dHJGb3JtYXRMaW5lSGVpZ2h0KFN0cmluZyBoZWlnaHQpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVMaW5lSGVpZ2h0QXRMZWFzdCgpOwotCi0JcHVibGljIHZvaWQgc2V0QXR0clN0eWxlTGluZUhlaWdodEF0TGVhc3QoU3RyaW5nIGhlaWdodCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRUZXh0QWxpZ24oKTsKLQotCXB1YmxpYyB2b2lkIHNldEF0dHJGb3JtYXRUZXh0QWxpZ24oU3RyaW5nIGFsaWduKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlVmVydGljYWxBbGlnbigpOwotCi0JcHVibGljIHZvaWQgc2V0QXR0clN0eWxlVmVydGljYWxBbGlnbihTdHJpbmcgYWxpZ24pOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0TWFyZ2luTGVmdCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0TWFyZ2luUmlnaHQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdE1hcmdpblRvcCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0TWFyZ2luQm90dG9tKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCYWNrZ3JvdW5kQ29sb3IoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvU3R5bGVDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvU3R5bGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4N2NlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1N0eWxlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlOwotCi0vKioKLSAqIFN0eWxlQ29uc3RhbnRzIGRlZmluZXMgdGhlIGNvbnN0YW50IHZhbHVlcyB1c2VkIGJ5IHN0eWxlIG5hbWVzcGFjZSBvZiBPREYgRE9NIEFQSQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3R5bGVDb25zdGFudHMgewotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIFNUWUxFX05BTUVTUEFDRV9VUkkgPSAidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpzdHlsZToxLjAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9ERUZBVUxUX1NUWUxFID0gImRlZmF1bHQtc3R5bGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TVFlMRSA9ICJzdHlsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBQkxFX1BST1BFUlRJRVMgPSAidGFibGUtcHJvcGVydGllcyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTID0gInRhYmxlLWNvbHVtbi1wcm9wZXJ0aWVzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEFCTEVfUk9XX1BST1BFUlRJRVMgPSAidGFibGUtcm93LXByb3BlcnRpZXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUJMRV9DRUxMX1BST1BFUlRJRVMgPSAidGFibGUtY2VsbC1wcm9wZXJ0aWVzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfRk9OVF9GQUNFID0gImZvbnQtZmFjZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RFWFRfUFJPUEVSVElFUyA9ICJ0ZXh0LXByb3BlcnRpZXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DSEFSVF9QUk9QRVJUSUVTID0gImNoYXJ0LXByb3BlcnRpZXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9HUkFQSElDX1BST1BFUlRJRVMgPSAiZ3JhcGhpYy1wcm9wZXJ0aWVzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfUEFSQUdSQVBIX1BST1BFUlRJRVMgPSAicGFyYWdyYXBoLXByb3BlcnRpZXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QQUdFX0xBWU9VVCA9ICJwYWdlLWxheW91dCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BBR0VfTEFZT1VUX1BST1BFUlRJRVMgPSAicGFnZS1sYXlvdXQtcHJvcGVydGllcyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0RSQVdJTkdfUEFHRV9QUk9QRVJUSUVTID0gImRyYXdpbmctcGFnZS1wcm9wZXJ0aWVzIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTUFTVEVSX1BBR0UgPSAibWFzdGVyLXBhZ2UiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9NQVAgPSAibWFwIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRElSRUNUSU9OID0gImRpcmVjdGlvbiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZPTlRfUElUQ0ggPSAiZm9udC1waXRjaCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZBTUlMWSA9ICJmYW1pbHkiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9NQVNURVJfUEFHRV9OQU1FID0gIm1hc3Rlci1wYWdlLW5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9QQVJFTlRfU1RZTEVfTkFNRSA9ICJwYXJlbnQtc3R5bGUtbmFtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RBVEFfU1RZTEVfTkFNRSA9ICJkYXRhLXN0eWxlLW5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9QQUdFX0xBWU9VVF9OQU1FID0gInBhZ2UtbGF5b3V0LW5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT0xVTU5fV0lEVEggPSAiY29sdW1uLXdpZHRoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVVNFX09QVElNQUxfQ09MVU1OX1dJRFRIID0gInVzZS1vcHRpbWFsLWNvbHVtbi13aWR0aCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1dSSVRJTkdfTU9ERSA9ICJ3cml0aW5nLW1vZGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ST1dfSEVJR0hUID0gInJvdy1oZWlnaHQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9VU0VfT1BUSU1BTF9ST1dfSEVJR0hUID0gInVzZS1vcHRpbWFsLXJvdy1oZWlnaHQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GT05UX05BTUUgPSAiZm9udC1uYW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9GQU1JTFlfR0VORVJJQyA9ICJmb250LWZhbWlseS1nZW5lcmljIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9GQU1JTFlfQVNJQU4gPSAiZm9udC1mYW1pbHktYXNpYW4iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GT05UX1BJVENIX0FTSUFOID0gImZvbnQtcGl0Y2gtYXNpYW4iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9GT05UX1NJWkVfQVNJQU4gPSAiZm9udC1zaXplLWFzaWFuIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9GQU1JTFlfQ09NUExFWCA9ICJmb250LWZhbWlseS1jb21wbGV4IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9QSVRDSF9DT01QTEVYID0gImZvbnQtcGl0Y2gtY29tcGxleCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZPTlRfU0laRV9DT01QTEVYID0gImZvbnQtc2l6ZS1jb21wbGV4IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfUkVQRUFUID0gInJlcGVhdCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1BSSU5UX09SSUVOVEFUSU9OID0gInByaW50LW9yaWVudGF0aW9uIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfU0hBRE9XID0gInNoYWRvdyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0NPTkRJVElPTiA9ICJjb25kaXRpb24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9BUFBMWV9TVFlMRV9OQU1FID0gImFwcGx5LXN0eWxlLW5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9CQVNFX0NFTExfQUREUkVTUyA9ICJiYXNlLWNlbGwtYWRkcmVzcyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1RFWFRfVU5ERVJMSU5FX1NUWUxFID0gInRleHQtdW5kZXJsaW5lLXN0eWxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfVEVYVF9QT1NJVElPTiA9ICJ0ZXh0LXBvc2l0aW9uIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTlVNX0ZPUk1BVCA9ICJudW0tZm9ybWF0IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTlVNX1BSRUZJWCA9ICJudW0tcHJlZml4IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTlVNX1NVRkZJWCA9ICJudW0tc3VmZml4IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfV0lEVEggPSAid2lkdGgiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9WRVJUSUNBTF9BTElHTiA9ICJ2ZXJ0aWNhbC1hbGlnbiI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0hPUklaT05UQUxfUE9TID0gImhvcml6b250YWwtcG9zIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfQ0VMTF9QUk9URUNUID0gImNlbGwtcHJvdGVjdCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBDRUxMX1BST1RFQ1RfVkFMVUVfTk9UX0RFRklORUQgPSAwOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQ0VMTF9QUk9URUNUX1ZBTFVFX05PTkUgPSAxOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQ0VMTF9QUk9URUNUX1ZBTFVFX1BST1RFQ1RFRCA9IDI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBDRUxMX1BST1RFQ1RfVkFMVUVfSElEREVOID0gMzsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IENFTExfUFJPVEVDVF9WQUxVRV9ISURERU5fQU5EX1BST1RFQ1RFRCA9IDQ7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9TdHlsZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvU3R5bGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NDZhZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9TdHlsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxlTGlzdGVuZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8c3R5bGU6c3R5bGU+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3R5bGVFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVNYXN0ZXJQYWdlTmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVQYXJlbnRTdHlsZU5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRGF0YVN0eWxlTmFtZSgpOwotCi0JcHVibGljIFN0eWxlRWxlbWVudCBjcmVhdGVDaGlsZChTdHJpbmcgZmFtaWx5KTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFtaWx5KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCi0JcHVibGljIFN0eWxlUHJvcGVydGllc0Jhc2UgZ2V0UHJvcGVydHlFbGVtZW50KGxvbmcgaWR4KTsKLQotCXB1YmxpYyBsb25nIGdldFByb3BlcnR5U2l6ZSgpOwotCi0JcHVibGljIHZvaWQgcHV0UHJvcGVydHlFbGVtZW50KFN0eWxlUHJvcGVydGllc0Jhc2UgcHJvcGVydHkpOwotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIsIFN0cmluZyB0b3BpYyk7Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHRvcGljKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1N0eWxlUHJvcGVydGllc0Jhc2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvU3R5bGVQcm9wZXJ0aWVzQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2FmYTY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvU3R5bGVQcm9wZXJ0aWVzQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBPREYgZWxlbWVudHMgdGhhdCBoYXZlIHN0eWxlIHByb3BlcnR5IHZhbHVlcyBhcyBhdHRyaWJ1dGVzIAotICogYW5kIGhhdmUgPHN0eWxlOnN0eWxlPiBhcyBwYXJlbnQgc2hvdWxkIGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3R5bGVQcm9wZXJ0aWVzQmFzZSBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvVGFiU3RvcEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvVGFiU3RvcEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2MzRlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RhYlN0b3BFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8c3R5bGU6dGFiLXN0b3A+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFiU3RvcEVsZW1lbnQgZXh0ZW5kcyBTdHlsZVByb3BlcnRpZXNCYXNlIHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJQb3NpdGlvbigpOwotCi0JcHVibGljIHZvaWQgc2V0QXR0clBvc2l0aW9uKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9UYWJTdG9wc0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvVGFiU3RvcHNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MmYzZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9UYWJTdG9wc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxzdHlsZTp0YWItc3RvcHM+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFiU3RvcHNFbGVtZW50IGV4dGVuZHMgU3R5bGVQcm9wZXJ0aWVzQmFzZSB7Ci0JcHVibGljIGxvbmcgZ2V0U2l6ZSgpOwotCi0JcHVibGljIFRhYlN0b3BFbGVtZW50IGdldFRhYlN0b3BFbGVtZW50KGxvbmcgaWR4KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NjFkNjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9UYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHN0eWxlOnRhYmxlLWNlbGwtcHJvcGVydGllcz4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBUYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudCBleHRlbmRzIFN0eWxlUHJvcGVydGllc0Jhc2UgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEJhY2tncm91bmRDb2xvcigpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Qm9yZGVyKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCb3JkZXJUb3AoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEJvcmRlckJvdHRvbSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Qm9yZGVyTGVmdCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Qm9yZGVyUmlnaHQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdFBhZGRpbmcoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlU2hhZG93KCk7Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJTdHlsZUNlbGxQcm90ZWN0KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9UYWJsZUNvbHVtblByb3BlcnRpZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RhYmxlQ29sdW1uUHJvcGVydGllc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA0NGI3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RhYmxlQ29sdW1uUHJvcGVydGllc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxzdHlsZTp0YWJsZS1jb2x1bW4tcHJvcGVydGllcz4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBUYWJsZUNvbHVtblByb3BlcnRpZXNFbGVtZW50IGV4dGVuZHMgU3R5bGVQcm9wZXJ0aWVzQmFzZSB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0QnJlYWtCZWZvcmUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlQ29sdW1uV2lkdGgoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJTdHlsZVVzZU9wdGltYWxDb2x1bW5XaWR0aCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvVGFibGVQcm9wZXJ0aWVzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9UYWJsZVByb3BlcnRpZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODZjYzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9UYWJsZVByb3BlcnRpZXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8c3R5bGU6dGFibGUtcHJvcGVydGllcz4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBUYWJsZVByb3BlcnRpZXNFbGVtZW50IGV4dGVuZHMgU3R5bGVQcm9wZXJ0aWVzQmFzZSB7Ci0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clRhYmxlRGlzcGxheSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVXaWR0aCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVXcml0aW5nTW9kZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVCb3JkZXJNb2RlbCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvVGFibGVSb3dQcm9wZXJ0aWVzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9UYWJsZVJvd1Byb3BlcnRpZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MGZjOGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9UYWJsZVJvd1Byb3BlcnRpZXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8c3R5bGU6dGFibGUtcm93LXByb3BlcnRpZXM+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVSb3dQcm9wZXJ0aWVzRWxlbWVudCBleHRlbmRzIFN0eWxlUHJvcGVydGllc0Jhc2UgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlUm93SGVpZ2h0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCcmVha0JlZm9yZSgpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clN0eWxlVXNlT3B0aW1hbFJvd0hlaWdodCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvVGV4dFByb3BlcnRpZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL1RleHRQcm9wZXJ0aWVzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzYyYzA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvVGV4dFByb3BlcnRpZXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8c3R5bGU6dGV4dC1wcm9wZXJ0aWVzPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRleHRQcm9wZXJ0aWVzRWxlbWVudCBleHRlbmRzIFN0eWxlUHJvcGVydGllc0Jhc2UgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRm9udE5hbWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRm9udEZhbWlseUdlbmVyaWMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRm9udFBpdGNoKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUZvbnRGYW1pbHlBc2lhbigpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGb250UGl0Y2hBc2lhbigpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGb250U2l6ZUFzaWFuKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUZvbnRGYW1pbHlDb21wbGV4KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUZvbnRQaXRjaENvbXBsZXgoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRm9udFNpemVDb21wbGV4KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZVRleHRVbmRlcmxpbmVTdHlsZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVUZXh0UG9zaXRpb24oKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEZvbnRGYW1pbHkoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEZvbnRTaXplKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRGb250U3R5bGUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEZvbnRXZWlnaHQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdENvbG9yKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCYWNrZ3JvdW5kQ29sb3IoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvQ2hhcnRQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9DaGFydFByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk2MjExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9DaGFydFByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY2hhcnQuQ2hhcnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLkNoYXJ0UHJvcGVydGllc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlRleHRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBDaGFydFByb3BlcnRpZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQ2hhcnRQcm9wZXJ0aWVzRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTM4MTU1NzY0NDc3NTAzOTUzM0w7Ci0KLQlwcm90ZWN0ZWQgQ2hhcnRQcm9wZXJ0aWVzRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVEaXJlY3Rpb24oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRElSRUNUSU9OKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0RJUkVDVElPTik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydEphcGFuZXNlQ2FuZGxlU3RpY2soKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfSkFQQU5FU0VfQ0FORExFX1NUSUNLKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0pBUEFORVNFX0NBTkRMRV9TVElDSykpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRTdG9ja1dpdGhWb2x1bWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfU1RPQ0tfV0lUSF9WT0xVTUUpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfU1RPQ0tfV0lUSF9WT0xVTUUpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0VGhyZWVEaW1lbnNpb25hbCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9USFJFRV9ESU1FTlNJT05BTCkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9USFJFRV9ESU1FTlNJT05BTCkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnREZWVwKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0RFRVApKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfREVFUCkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRMaW5lcygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9MSU5FUykpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9MSU5FUykpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydEludGVycG9sYXRpb24oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfSU5URVJQT0xBVElPTikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9JTlRFUlBPTEFUSU9OKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnRTeW1ib2xUeXBlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX1NZTUJPTF9UWVBFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX1NZTUJPTF9UWVBFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0VmVydGljYWwoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfVkVSVElDQUwpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfVkVSVElDQUwpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdHRyQ2hhcnRMaW5lc1VzZWQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfTElORVNfVVNFRCkpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9MSU5FU19VU0VEKSkuaW50VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0Q29ubmVjdEJhcnMoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfQ09OTkVDVF9CQVJTKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0NPTk5FQ1RfQkFSUykpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydFNlcmllc1NvdXJjZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9TRVJJRVNfU09VUkNFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX1NFUklFU19TT1VSQ0UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRNZWFuVmFsdWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfTUVBTl9WQUxVRSkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9NRUFOX1ZBTFVFKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ckNoYXJ0RXJyb3JNYXJnaW4oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfRVJST1JfTUFSR0lOKSkgewotCQkJcmV0dXJuIG5ldyBEb3VibGUoZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfRVJST1JfTUFSR0lOKSkuZG91YmxlVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTEuMDsKLQl9Ci0KLQlwdWJsaWMgZG91YmxlIGdldEF0dHJDaGFydEVycm9yTG93ZXJMaW1pdCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9FUlJPUl9MT1dFUl9MSU1JVCkpIHsKLQkJCXJldHVybiBuZXcgRG91YmxlKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0VSUk9SX0xPV0VSX0xJTUlUKSkuZG91YmxlVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTEuMDsKLQl9Ci0KLQlwdWJsaWMgZG91YmxlIGdldEF0dHJDaGFydEVycm9yVXBwZXJMaW1pdCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9FUlJPUl9VUFBFUl9MSU1JVCkpIHsKLQkJCXJldHVybiBuZXcgRG91YmxlKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0VSUk9SX1VQUEVSX0xJTUlUKSkuZG91YmxlVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTEuMDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydEVycm9yQ2F0ZWdvcnkoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfRVJST1JfQ0FURUdPUlkpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfRVJST1JfQ0FURUdPUlkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgZG91YmxlIGdldEF0dHJDaGFydEVycm9yUGVyY2VudGFnZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9FUlJPUl9QRVJDRU5UQUdFKSkgewotCQkJcmV0dXJuIG5ldyBEb3VibGUoZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfRVJST1JfUEVSQ0VOVEFHRSkpLmRvdWJsZVZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIC0xLjA7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnRSZWdyZXNzaW9uVHlwZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9SRUdSRVNTSU9OX1RZUEUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfUkVHUkVTU0lPTl9UWVBFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnREYXRhTGFiZWxOdW1iZXIoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfREFUQV9MQUJFTF9OVU1CRVIpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfREFUQV9MQUJFTF9OVU1CRVIpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnREYXRhTGFiZWxUZXh0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0RBVEFfTEFCRUxfVEVYVCkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9EQVRBX0xBQkVMX1RFWFQpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0RGF0YUxhYmVsU3ltYm9sKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0RBVEFfTEFCRUxfU1lNQk9MKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0RBVEFfTEFCRUxfU1lNQk9MKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJDaGFydERpc3BsYXlMYWJlbCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9ESVNQTEFZX0xBQkVMKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0RJU1BMQVlfTEFCRUwpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0VGlja01hcmtzTWFqb3JJbm5lcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9USUNLX01BUktTX01BSk9SX0lOTkVSKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX1RJQ0tfTUFSS1NfTUFKT1JfSU5ORVIpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0VGlja01hcmtzTWFqb3JPdXRlcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9USUNLX01BUktTX01BSk9SX09VVEVSKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX1RJQ0tfTUFSS1NfTUFKT1JfT1VURVIpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0TG9nYXJpdGhtaWMoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfTE9HQVJJVEhNSUMpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfTE9HQVJJVEhNSUMpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0ckNoYXJ0VGV4dE92ZXJsYXAoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfVEVYVF9PVkVSTEFQKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX1RFWFRfT1ZFUkxBUCkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyVGV4dExpbmVCcmVhaygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCVRleHRDb25zdGFudHMuQVRUUl9MSU5FX0JSRUFLKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUZXh0Q29uc3RhbnRzLkFUVFJfTElORV9CUkVBSykpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJDaGFydExhYmVsQXJyYW5nZW1lbnQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfTEFCRUxfQVJSQU5HRU1FTlQpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfTEFCRUxfQVJSQU5HRU1FTlQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyQ2hhcnRWaXNpYmxlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX1ZJU0lCTEUpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfVklTSUJMRSkpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJDaGFydEdhcFdpZHRoKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQlDaGFydENvbnN0YW50cy5BVFRSX0dBUF9XSURUSCkpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9HQVBfV0lEVEgpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJDaGFydE92ZXJsYXAoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfT1ZFUkxBUCkpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9PVkVSTEFQKSkuaW50VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyQ2hhcnRTb2xpZFR5cGUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfU09MSURfVFlQRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoQ2hhcnRDb25zdGFudHMuQ0hBUlRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9TT0xJRF9UWVBFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGRvdWJsZSBnZXRBdHRyQ2hhcnRPcmlnaW4oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfT1JJR0lOKSkgewotCQkJcmV0dXJuIG5ldyBEb3VibGUoZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfT1JJR0lOKSkuZG91YmxlVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTEuMDsKLQl9Ci0KLQlwdWJsaWMgZG91YmxlIGdldEF0dHJDaGFydE1pbmltdW0oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfTUlOSU1VTSkpIHsKLQkJCXJldHVybiBuZXcgRG91YmxlKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlDaGFydENvbnN0YW50cy5DSEFSVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlDaGFydENvbnN0YW50cy5BVFRSX01JTklNVU0pKS5kb3VibGVWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMS4wOwotCX0KLQotCXB1YmxpYyBkb3VibGUgZ2V0QXR0ckNoYXJ0TWF4aW11bSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKENoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJQ2hhcnRDb25zdGFudHMuQVRUUl9NQVhJTVVNKSkgewotCQkJcmV0dXJuIG5ldyBEb3VibGUoZ2V0QXR0cmlidXRlTlMoCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkNIQVJUX05BTUVTUEFDRV9VUkksCi0JCQkJCUNoYXJ0Q29uc3RhbnRzLkFUVFJfTUFYSU1VTSkpLmRvdWJsZVZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIC0xLjA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9EZWZhdWx0U3R5bGVFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL0RlZmF1bHRTdHlsZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWM2YWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL0RlZmF1bHRTdHlsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5EZWZhdWx0U3R5bGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIERlZmF1bHRTdHlsZUVsZW1lbnRJbXBsIGV4dGVuZHMgU3R5bGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCURlZmF1bHRTdHlsZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDEyNjkyMzYxNjkwMDcxMTAzMzNMOwotCi0JcHJvdGVjdGVkIERlZmF1bHRTdHlsZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGYW1pbHkoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRkFNSUxZKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0ZBTUlMWSk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvRHJhd2luZ1BhZ2VQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9EcmF3aW5nUGFnZVByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2RiOWNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9EcmF3aW5nUGFnZVByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkRyYXdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnByZXNlbnRhdGlvbi5QcmVzZW50YXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLkRyYXdpbmdQYWdlUHJvcGVydGllc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBEcmF3aW5nUGFnZVByb3BlcnRpZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJRHJhd2luZ1BhZ2VQcm9wZXJ0aWVzRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM4MTI2MjA4Njg2NzY1NDkwMTFMOwotCi0JcHJvdGVjdGVkIERyYXdpbmdQYWdlUHJvcGVydGllc0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywKLQkJCUVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyUHJlc2VudGF0aW9uRGlzcGxheUhlYWRlcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFByZXNlbnRhdGlvbkNvbnN0YW50cy5QUkVTRU5UQVRJT05fTkFNRVNQQUNFX1VSSSwKLQkJCQlQcmVzZW50YXRpb25Db25zdGFudHMuQVRUUl9ESVNQTEFZX0hFQURFUikpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJUHJlc2VudGF0aW9uQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9OQU1FU1BBQ0VfVVJJLAotCQkJCQlQcmVzZW50YXRpb25Db25zdGFudHMuQVRUUl9ESVNQTEFZX0hFQURFUikpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyUHJlc2VudGF0aW9uRGlzcGxheUZvb3RlcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFByZXNlbnRhdGlvbkNvbnN0YW50cy5QUkVTRU5UQVRJT05fTkFNRVNQQUNFX1VSSSwKLQkJCQlQcmVzZW50YXRpb25Db25zdGFudHMuQVRUUl9ESVNQTEFZX0ZPT1RFUikpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJUHJlc2VudGF0aW9uQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9OQU1FU1BBQ0VfVVJJLAotCQkJCQlQcmVzZW50YXRpb25Db25zdGFudHMuQVRUUl9ESVNQTEFZX0ZPT1RFUikpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyUHJlc2VudGF0aW9uRGlzcGxheVBhZ2VOdW1iZXIoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhQcmVzZW50YXRpb25Db25zdGFudHMuUFJFU0VOVEFUSU9OX05BTUVTUEFDRV9VUkksCi0JCQkJUHJlc2VudGF0aW9uQ29uc3RhbnRzLkFUVFJfRElTUExBWV9QQUdFX05VTUJFUikpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJUHJlc2VudGF0aW9uQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9OQU1FU1BBQ0VfVVJJLAotCQkJCQlQcmVzZW50YXRpb25Db25zdGFudHMuQVRUUl9ESVNQTEFZX1BBR0VfTlVNQkVSKSkKLQkJCQkJLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyUHJlc2VudGF0aW9uRGlzcGxheURhdGVUaW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoUHJlc2VudGF0aW9uQ29uc3RhbnRzLlBSRVNFTlRBVElPTl9OQU1FU1BBQ0VfVVJJLAotCQkJCVByZXNlbnRhdGlvbkNvbnN0YW50cy5BVFRSX0RJU1BMQVlfREFURV9USU1FKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlQcmVzZW50YXRpb25Db25zdGFudHMuUFJFU0VOVEFUSU9OX05BTUVTUEFDRV9VUkksCi0JCQkJCVByZXNlbnRhdGlvbkNvbnN0YW50cy5BVFRSX0RJU1BMQVlfREFURV9USU1FKSkKLQkJCQkJLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3QmFja2dyb3VuZFNpemUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfQkFDS0dST1VORF9TSVpFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0JBQ0tHUk9VTkRfU0laRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdGaWxsKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0ZJTEwpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTCk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvRm9udEZhY2VFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL0ZvbnRGYWNlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1OGYwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvRm9udEZhY2VFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5Gb250RmFjZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuU1ZHQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgRm9udEZhY2VFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgRm9udEZhY2VFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2ODg2MjM2NjYzOTE5MDc3MDYxTDsKLQotCXByb3RlY3RlZCBGb250RmFjZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlTmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdGb250RmFtaWx5KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCVNWR0NvbnN0YW50cy5BVFRSX0ZPTlRfRkFNSUxZKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJCVNWR0NvbnN0YW50cy5BVFRSX0ZPTlRfRkFNSUxZKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3ZnRm9udEZhbWlseUdlbmVyaWMoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJU1ZHQ29uc3RhbnRzLkFUVFJfRk9OVF9GQU1JTFlfR0VORVJJQykpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCQlTVkdDb25zdGFudHMuQVRUUl9GT05UX0ZBTUlMWV9HRU5FUklDKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGb250UGl0Y2goKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRk9OVF9QSVRDSCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX1BJVENIKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9HcmFwaGljUHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvR3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDNiYTY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9HcmFwaGljUHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRHJhd0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5GaWxsSW1hZ2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkdyYWRpZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5PcGFjaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuR3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLlNWR0NvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEdyYXBoaWNQcm9wZXJ0aWVzRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUdyYXBoaWNQcm9wZXJ0aWVzRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTE1MDE3MTg3MDA4NzI5NzAyN0w7Ci0KLQlwcm90ZWN0ZWQgR3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3Ryb2tlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX1NUUk9LRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVFJPS0UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3U3Ryb2tlRGFzaCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVFJPS0VfREFTSCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVFJPS0VfREFTSCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN2Z1N0cm9rZVdpZHRoKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCVNWR0NvbnN0YW50cy5BVFRSX1NUUk9LRV9XSURUSCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCQlTVkdDb25zdGFudHMuQVRUUl9TVFJPS0VfV0lEVEgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdTdHJva2VDb2xvcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQlTVkdDb25zdGFudHMuQVRUUl9TVFJPS0VfQ09MT1IpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFNWR0NvbnN0YW50cy5TVkdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU1ZHQ29uc3RhbnRzLkFUVFJfU1RST0tFX0NPTE9SKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd01hcmtlclN0YXJ0V2lkdGgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTUFSS0VSX1NUQVJUX1dJRFRIKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX01BUktFUl9TVEFSVF9XSURUSCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdNYXJrZXJFbmRXaWR0aCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9NQVJLRVJfRU5EX1dJRFRIKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX01BUktFUl9FTkRfV0lEVEgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdmdTdHJva2VPcGFjaXR5KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJLAotCQkJCVNWR0NvbnN0YW50cy5BVFRSX1NUUk9LRV9PUEFDSVRZKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkksCi0JCQkJCVNWR0NvbnN0YW50cy5BVFRSX1NUUk9LRV9PUEFDSVRZKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd09wYWNpdHkoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfT1BBQ0lUWSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9PUEFDSVRZKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9wYWNpdHlFbGVtZW50IGdldEF0dHJEcmF3T3BhY2l0eU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfT1BBQ0lUWV9OQU1FKSkgewotCQkJU3RyaW5nIHN0ciA9IGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfT1BBQ0lUWV9OQU1FKTsKLQkJCU9ERkVsZW1lbnQgb3BhY2l0eUVsZW1lbnQgPSBmaW5kRWxlbWVudEJ5QXR0clZhbHVlRnJvbVN0eWxlRG9jKAotCQkJCQlEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5FTEVNRU5UX09QQUNJVFksCi0JCQkJCURyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLCBEcmF3Q29uc3RhbnRzLkFUVFJfTkFNRSwKLQkJCQkJc3RyKTsKLQkJCWlmICgob3BhY2l0eUVsZW1lbnQgIT0gbnVsbCkKLQkJCQkJJiYgKG9wYWNpdHlFbGVtZW50IGluc3RhbmNlb2YgT3BhY2l0eUVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIChPcGFjaXR5RWxlbWVudCkgb3BhY2l0eUVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0ZpbGwoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9GSUxMKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEdyYWRpZW50RWxlbWVudCBnZXRBdHRyRHJhd0ZpbGxHcmFkaWVudE5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTF9HUkFESUVOVF9OQU1FKSkgewotCQkJU3RyaW5nIHN0ciA9IGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTF9HUkFESUVOVF9OQU1FKTsKLQkJCU9ERkVsZW1lbnQgZmlsbEdyYWRpZW50RWxlbWVudCA9IGZpbmRFbGVtZW50QnlBdHRyVmFsdWVGcm9tU3R5bGVEb2MoCi0JCQkJCURyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkVMRU1FTlRfR1JBRElFTlQsCi0JCQkJCURyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLCBEcmF3Q29uc3RhbnRzLkFUVFJfTkFNRSwKLQkJCQkJc3RyKTsKLQkJCWlmICgoZmlsbEdyYWRpZW50RWxlbWVudCAhPSBudWxsKQotCQkJCQkmJiAoZmlsbEdyYWRpZW50RWxlbWVudCBpbnN0YW5jZW9mIEdyYWRpZW50RWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gKEdyYWRpZW50RWxlbWVudCkgZmlsbEdyYWRpZW50RWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJEcmF3R3JhZGllbnRTdGVwQ291bnQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfR1JBRElFTlRfU1RFUF9DT1VOVCkpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0dSQURJRU5UX1NURVBfQ09VTlQpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RmlsbENvbG9yKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0ZJTExfQ09MT1IpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTF9DT0xPUik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdGaWxsSW1hZ2VOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0ZJTExfSU1BR0VfTkFNRSkpIHsKLQkJCVN0cmluZyBzdHIgPSBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0ZJTExfSU1BR0VfTkFNRSk7Ci0JCQlPREZFbGVtZW50IGZpbGxJbWFnZUVsZW1lbnQgPSBmaW5kRWxlbWVudEJ5QXR0clZhbHVlRnJvbVN0eWxlRG9jKAotCQkJCQlEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5FTEVNRU5UX0ZJTExfSU1BR0UsCi0JCQkJCURyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLCBEcmF3Q29uc3RhbnRzLkFUVFJfTkFNRSwKLQkJCQkJc3RyKTsKLQkJCWlmICgoZmlsbEltYWdlRWxlbWVudCAhPSBudWxsKQotCQkJCQkmJiAoZmlsbEltYWdlRWxlbWVudCBpbnN0YW5jZW9mIEZpbGxJbWFnZUVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuICgoRmlsbEltYWdlRWxlbWVudCkgZmlsbEltYWdlRWxlbWVudCkuZ2V0QXR0clhMaW5rSHJlZigpCi0JCQkJCQkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RmlsbEltYWdlV2lkdGgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTF9JTUFHRV9XSURUSCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9GSUxMX0lNQUdFX1dJRFRIKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0ZpbGxJbWFnZUhlaWdodCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCURyYXdDb25zdGFudHMuQVRUUl9GSUxMX0lNQUdFX0hFSUdIVCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9GSUxMX0lNQUdFX0hFSUdIVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlUmVwZWF0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1JFUEVBVCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9SRVBFQVQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJEcmF3RmlsbEltYWdlUmVmUG9pbnRYKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0ZJTExfSU1BR0VfUkVGX1BPSU5UX1gpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTF9JTUFHRV9SRUZfUE9JTlRfWCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdGaWxsSW1hZ2VSZWZQb2ludFkoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfRklMTF9JTUFHRV9SRUZfUE9JTlRfWSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9GSUxMX0lNQUdFX1JFRl9QT0lOVF9ZKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd0ZpbGxJbWFnZVJlZlBvaW50KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5BVFRSX0ZJTExfSU1BR0VfUkVGX1BPSU5UKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX0ZJTExfSU1BR0VfUkVGX1BPSU5UKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRHJhd1RpbGVSZXBlYXRPZmZzZXQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfVElMRV9SRVBFQVRfT0ZGU0VUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX1RJTEVfUkVQRUFUX09GRlNFVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlSG9yaXpvbnRhbFBvcygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9IT1JJWk9OVEFMX1BPUykpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9IT1JJWk9OVEFMX1BPUyk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvTWFwRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9NYXBFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjZkZjNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9NYXBFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5NYXBFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIE1hcEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBNYXBFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODU5Njc4ODUyNzE2NTE5NjQxMEw7Ci0KLQlwcm90ZWN0ZWQgTWFwRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUNvbmRpdGlvbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9DT05ESVRJT04pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfQ09ORElUSU9OKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVBcHBseVN0eWxlTmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9BUFBMWV9TVFlMRV9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0FQUExZX1NUWUxFX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUJhc2VDZWxsQWRkcmVzcygpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9CQVNFX0NFTExfQUREUkVTUykpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9CQVNFX0NFTExfQUREUkVTUyk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvTWFzdGVyUGFnZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvTWFzdGVyUGFnZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYWNiMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL01hc3RlclBhZ2VFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkRyYXdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLk1hc3RlclBhZ2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIE1hc3RlclBhZ2VFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgTWFzdGVyUGFnZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY3MTk1ODQ3MzE4NjQ4OTU4NDhMOwotCi0JcHJvdGVjdGVkIE1hc3RlclBhZ2VFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlTmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZVBhZ2VMYXlvdXROYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1BBR0VfTEFZT1VUX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfUEFHRV9MQVlPVVRfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckRyYXdTdHlsZU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfU1RZTEVfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCURyYXdDb25zdGFudHMuQVRUUl9TVFlMRV9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9QYWdlTGF5b3V0RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9QYWdlTGF5b3V0RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3MjQwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvUGFnZUxheW91dEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlBhZ2VMYXlvdXRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFBhZ2VMYXlvdXRFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgUGFnZUxheW91dEVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIzNTM5NTI3MDc2OTg0NzMyNTBMOwotCi0JcHJvdGVjdGVkIFBhZ2VMYXlvdXRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlTmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1BhZ2VMYXlvdXRQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9QYWdlTGF5b3V0UHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjM1NTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1BhZ2VMYXlvdXRQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybWF0LkZvcm1hdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuUGFnZUxheW91dFByb3BlcnRpZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFBhZ2VMYXlvdXRQcm9wZXJ0aWVzRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVBhZ2VMYXlvdXRQcm9wZXJ0aWVzRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODkxMDc2NjY4Mzk2MjExOTc5MEw7Ci0KLQlwcm90ZWN0ZWQgUGFnZUxheW91dFByb3BlcnRpZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsCi0JCQlFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0TWFyZ2luVG9wKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX01BUkdJTl9UT1ApKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfTUFSR0lOX1RPUCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdE1hcmdpbkJvdHRvbSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9NQVJHSU5fQk9UVE9NKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX01BUkdJTl9CT1RUT00pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRNYXJnaW5MZWZ0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX01BUkdJTl9MRUZUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX01BUkdJTl9MRUZUKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0TWFyZ2luUmlnaHQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfTUFSR0lOX1JJR0hUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX01BUkdJTl9SSUdIVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdFBhZ2VXaWR0aCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9QQUdFX1dJRFRIKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX1BBR0VfV0lEVEgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRQYWdlSGVpZ2h0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX1BBR0VfSEVJR0hUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX1BBR0VfSEVJR0hUKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVQcmludE9yaWVudGF0aW9uKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1BSSU5UX09SSUVOVEFUSU9OKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1BSSU5UX09SSUVOVEFUSU9OKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9QYXJhZ3JhcGhQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9QYXJhZ3JhcGhQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlY2NkNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvUGFyYWdyYXBoUHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtYXQuRm9ybWF0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5QYXJhZ3JhcGhQcm9wZXJ0aWVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlRhYlN0b3BzRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFBhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJUGFyYWdyYXBoUHJvcGVydGllc0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01NjQ3Njg3Mjg1NTczMTk3ODkxTDsKLQotCXByb3RlY3RlZCBQYXJhZ3JhcGhQcm9wZXJ0aWVzRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRMaW5lSGVpZ2h0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlTGluZUhlaWdodEF0TGVhc3QoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0VGV4dEFsaWduKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX1RFWFRfQUxJR04pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfVEVYVF9BTElHTik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlVmVydGljYWxBbGlnbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9WRVJUSUNBTF9BTElHTikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9WRVJUSUNBTF9BTElHTik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUYWJTdG9wc0VsZW1lbnQgZ2V0VGFiU3RvcHNFbGVtZW50KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJGb3JtYXRMaW5lSGVpZ2h0KFN0cmluZyBoZWlnaHQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0clN0eWxlTGluZUhlaWdodEF0TGVhc3QoU3RyaW5nIGhlaWdodCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0ckZvcm1hdFRleHRBbGlnbihTdHJpbmcgYWxpZ24pIHsKLQkJaWYgKGFsaWduICE9IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1ZFUlRJQ0FMX0FMSUdOLCBhbGlnbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0clN0eWxlVmVydGljYWxBbGlnbihTdHJpbmcgYWxpZ24pIHsKLQkJaWYgKGFsaWduICE9IG51bGwpCi0JCQlzZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX1RFWFRfQUxJR04sIGFsaWduKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0TWFyZ2luTGVmdCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9NQVJHSU5fTEVGVCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9NQVJHSU5fTEVGVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdE1hcmdpblJpZ2h0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX01BUkdJTl9SSUdIVCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9NQVJHSU5fUklHSFQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRNYXJnaW5Ub3AoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfTUFSR0lOX1RPUCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9NQVJHSU5fVE9QKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0TWFyZ2luQm90dG9tKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX01BUkdJTl9CT1RUT00pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfTUFSR0lOX0JPVFRPTSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEJhY2tncm91bmRDb2xvcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9CQUNLR1JPVU5EX0NPTE9SKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JBQ0tHUk9VTkRfQ09MT1IpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1N0eWxlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9TdHlsZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOTU4MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1N0eWxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlUHJvcGVydGllc0Jhc2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBTdHlsZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBTdHlsZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkwNzU3NTQxMTkyNDgzNDY2NDVMOwotCi0JcHJvdGVjdGVkIFN0eWxlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3R5bGVFbGVtZW50IGNyZWF0ZUNoaWxkKFN0cmluZyBmYW1pbHkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZhbWlseSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GQU1JTFkpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRkFNSUxZKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUsIG5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHlsZVByb3BlcnRpZXNCYXNlIGdldFByb3BlcnR5RWxlbWVudChsb25nIGlkeCkgewotCQlpbnQgY291bnQgPSAwOwotCQlOb2RlTGlzdCBubCA9IGdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBubC5pdGVtKGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBTdHlsZVByb3BlcnRpZXNCYXNlKSB7Ci0JCQkJaWYgKGlkeCA9PSBjb3VudCkKLQkJCQkJcmV0dXJuIChTdHlsZVByb3BlcnRpZXNCYXNlKSBub2RlOwotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0UHJvcGVydHlTaXplKCkgewotCQlpbnQgY291bnQgPSAwOwotCQlOb2RlTGlzdCBubCA9IGdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBubC5pdGVtKGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBTdHlsZVByb3BlcnRpZXNCYXNlKSB7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0UHJvcGVydHlFbGVtZW50KFN0eWxlUHJvcGVydGllc0Jhc2UgcHJvcGVydHkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlTWFzdGVyUGFnZU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfTUFTVEVSX1BBR0VfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9NQVNURVJfUEFHRV9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVQYXJlbnRTdHlsZU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfUEFSRU5UX1NUWUxFX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfUEFSRU5UX1NUWUxFX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZURhdGFTdHlsZU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfREFUQV9TVFlMRV9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0RBVEFfU1RZTEVfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvU3R5bGVOb2RlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1N0eWxlTm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUyNzVhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvU3R5bGVOb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLkFic3RyYWN0T0RGTm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFN0eWxlTm9kZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdE9ERk5vZGVGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzcz4gdGFnTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTsKLQotCXN0YXRpYyB7Ci0JCXRhZ01hcC5wdXQoU3R5bGVDb25zdGFudHMuRUxFTUVOVF9ERUZBVUxUX1NUWUxFLAotCQkJCURlZmF1bHRTdHlsZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1NUWUxFLCBTdHlsZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1RBQkxFX1BST1BFUlRJRVMsCi0JCQkJVGFibGVQcm9wZXJ0aWVzRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfQ09MVU1OX1BST1BFUlRJRVMsCi0JCQkJVGFibGVDb2x1bW5Qcm9wZXJ0aWVzRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfUk9XX1BST1BFUlRJRVMsCi0JCQkJVGFibGVSb3dQcm9wZXJ0aWVzRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfQ0VMTF9QUk9QRVJUSUVTLAotCQkJCVRhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoU3R5bGVDb25zdGFudHMuRUxFTUVOVF9GT05UX0ZBQ0UsIEZvbnRGYWNlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfVEVYVF9QUk9QRVJUSUVTLAotCQkJCVRleHRQcm9wZXJ0aWVzRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfQ0hBUlRfUFJPUEVSVElFUywKLQkJCQlDaGFydFByb3BlcnRpZXNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoU3R5bGVDb25zdGFudHMuRUxFTUVOVF9HUkFQSElDX1BST1BFUlRJRVMsCi0JCQkJR3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoU3R5bGVDb25zdGFudHMuRUxFTUVOVF9QQVJBR1JBUEhfUFJPUEVSVElFUywKLQkJCQlQYXJhZ3JhcGhQcm9wZXJ0aWVzRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfUEFHRV9MQVlPVVQsCi0JCQkJUGFnZUxheW91dEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1BBR0VfTEFZT1VUX1BST1BFUlRJRVMsCi0JCQkJUGFnZUxheW91dFByb3BlcnRpZXNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoU3R5bGVDb25zdGFudHMuRUxFTUVOVF9EUkFXSU5HX1BBR0VfUFJPUEVSVElFUywKLQkJCQlEcmF3aW5nUGFnZVByb3BlcnRpZXNFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoU3R5bGVDb25zdGFudHMuRUxFTUVOVF9NQVNURVJfUEFHRSwKLQkJCQlNYXN0ZXJQYWdlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfTUFQLCBNYXBFbGVtZW50SW1wbC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoT0RGRG9jdW1lbnQgb2RmRG9jLCBTdHJpbmcgdGFnTmFtZSwKLQkJCUVsZW1lbnQgZWxlbWVudCkgewotCQlDbGFzcyBjcyA9IChDbGFzcykgdGFnTWFwLmdldCh0YWdOYW1lKTsKLQkJaWYgKG51bGwgPT0gY3MpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoRWxlbWVudCkgZmluZEVsZW1lbnRDb25zdHJhY3RvcihjcykubmV3SW5zdGFuY2UoCi0JCQkJCW5ldyBPYmplY3RbXSB7IG9kZkRvYywgZWxlbWVudCB9KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9UYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9UYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmODY2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvVGFibGVDZWxsUHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtYXQuRm9ybWF0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuVGFibGVDZWxsUHJvcGVydGllc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBUYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVRhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjU5ODA2MzE4OTg5OTE4MDIyMEw7Ci0KLQlwcm90ZWN0ZWQgVGFibGVDZWxsUHJvcGVydGllc0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEJhY2tncm91bmRDb2xvcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9CQUNLR1JPVU5EX0NPTE9SKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JBQ0tHUk9VTkRfQ09MT1IpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCb3JkZXIoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfQk9SREVSKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JPUkRFUik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEJvcmRlclRvcCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9CT1JERVJfVE9QKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JPUkRFUl9UT1ApOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCb3JkZXJCb3R0b20oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfQk9SREVSX0JPVFRPTSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9CT1JERVJfQk9UVE9NKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Qm9yZGVyTGVmdCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9CT1JERVJfTEVGVCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9CT1JERVJfTEVGVCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEJvcmRlclJpZ2h0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JPUkRFUl9SSUdIVCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9CT1JERVJfUklHSFQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRQYWRkaW5nKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX1BBRERJTkcpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfUEFERElORyk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlU2hhZG93KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1NIQURPVykpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9TSEFET1cpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ0VMTF9QUk9URUNUX1ZBTFVFX05PTkUgPSAibm9uZSI7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ0VMTF9QUk9URUNUX1ZBTFVFX1BST1RFQ1RFRCA9ICJwcm90ZWN0ZWQiOwotCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIENFTExfUFJPVEVDVF9WQUxVRV9GT1JNVUxBX0hJRERFTiA9ICJmb3JtdWxhLWhpZGRlbiI7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ0VMTF9QUk9URUNUX1ZBTFVFX0hJRERFTl9BTkRfUFJPVEVDVEVEID0gImhpZGRlbi1hbmQtcHJvdGVjdGVkIjsKLQotCXB1YmxpYyBpbnQgZ2V0QXR0clN0eWxlQ2VsbFByb3RlY3QoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfQ0VMTF9QUk9URUNUKSkgewotCQkJU3RyaW5nIHN0ciA9IGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfQ0VMTF9QUk9URUNUKTsKLQkJCWlmIChzdHIuZXF1YWxzKENFTExfUFJPVEVDVF9WQUxVRV9OT05FKSkgewotCQkJCXJldHVybiBTdHlsZUNvbnN0YW50cy5DRUxMX1BST1RFQ1RfVkFMVUVfTk9ORTsKLQkJCX0gZWxzZSBpZiAoc3RyLmVxdWFscyhDRUxMX1BST1RFQ1RfVkFMVUVfSElEREVOX0FORF9QUk9URUNURUQpKSB7Ci0JCQkJcmV0dXJuIFN0eWxlQ29uc3RhbnRzLkNFTExfUFJPVEVDVF9WQUxVRV9ISURERU5fQU5EX1BST1RFQ1RFRDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHZhbCA9IFN0eWxlQ29uc3RhbnRzLkNFTExfUFJPVEVDVF9WQUxVRV9OT1RfREVGSU5FRDsKLQkJCQlTdHJpbmdbXSB2YWx1ZXMgPSBzdHIuc3BsaXQoIiAiKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAodmFsdWVzW2ldLmVxdWFscyhDRUxMX1BST1RFQ1RfVkFMVUVfUFJPVEVDVEVEKSkgewotCQkJCQkJaWYgKHZhbCA9PSBTdHlsZUNvbnN0YW50cy5DRUxMX1BST1RFQ1RfVkFMVUVfSElEREVOKQotCQkJCQkJCXZhbCA9IFN0eWxlQ29uc3RhbnRzLkNFTExfUFJPVEVDVF9WQUxVRV9ISURERU5fQU5EX1BST1RFQ1RFRDsKLQkJCQkJCWVsc2UKLQkJCQkJCQl2YWwgPSBTdHlsZUNvbnN0YW50cy5DRUxMX1BST1RFQ1RfVkFMVUVfUFJPVEVDVEVEOwotCQkJCQl9IGVsc2UgaWYgKHZhbHVlc1tpXQotCQkJCQkJCS5lcXVhbHMoQ0VMTF9QUk9URUNUX1ZBTFVFX0ZPUk1VTEFfSElEREVOKSkgewotCQkJCQkJaWYgKHZhbCA9PSBTdHlsZUNvbnN0YW50cy5DRUxMX1BST1RFQ1RfVkFMVUVfUFJPVEVDVEVEKQotCQkJCQkJCXZhbCA9IFN0eWxlQ29uc3RhbnRzLkNFTExfUFJPVEVDVF9WQUxVRV9ISURERU5fQU5EX1BST1RFQ1RFRDsKLQkJCQkJCWVsc2UKLQkJCQkJCQl2YWwgPSBTdHlsZUNvbnN0YW50cy5DRUxMX1BST1RFQ1RfVkFMVUVfSElEREVOOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB2YWw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0eWxlQ29uc3RhbnRzLkNFTExfUFJPVEVDVF9WQUxVRV9OT1RfREVGSU5FRDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1RhYmxlQ29sdW1uUHJvcGVydGllc0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvVGFibGVDb2x1bW5Qcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjMzBjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvVGFibGVDb2x1bW5Qcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybWF0LkZvcm1hdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlRhYmxlQ29sdW1uUHJvcGVydGllc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBUYWJsZUNvbHVtblByb3BlcnRpZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGFibGVDb2x1bW5Qcm9wZXJ0aWVzRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ2OTE5ODIyNzgzNjM4Mzc2MTBMOwotCi0JcHJvdGVjdGVkIFRhYmxlQ29sdW1uUHJvcGVydGllc0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywKLQkJCUVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCcmVha0JlZm9yZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9CUkVBS19CRUZPUkUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfQlJFQUtfQkVGT1JFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVDb2x1bW5XaWR0aCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9DT0xVTU5fV0lEVEgpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfQ09MVU1OX1dJRFRIKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clN0eWxlVXNlT3B0aW1hbENvbHVtbldpZHRoKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1VTRV9PUFRJTUFMX0NPTFVNTl9XSURUSCkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9VU0VfT1BUSU1BTF9DT0xVTU5fV0lEVEgpKQotCQkJCQkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvVGFibGVQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9UYWJsZVByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhjNDYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9UYWJsZVByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuVGFibGVQcm9wZXJ0aWVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBUYWJsZVByb3BlcnRpZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGFibGVQcm9wZXJ0aWVzRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjY4MzM4MTExOTEzNTE2NUw7Ci0KLQlwcm90ZWN0ZWQgVGFibGVQcm9wZXJ0aWVzRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clRhYmxlRGlzcGxheSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9ESVNQTEFZKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX0RJU1BMQVkpKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVXaWR0aCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9XSURUSCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9XSURUSCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlV3JpdGluZ01vZGUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfV1JJVElOR19NT0RFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1dSSVRJTkdfTU9ERSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlQm9yZGVyTW9kZWwoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfQk9SREVSX01PREVMKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX0JPUkRFUl9NT0RFTCk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvVGFibGVSb3dQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9UYWJsZVJvd1Byb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDdkNTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3R5bGUvaW1wbC9UYWJsZVJvd1Byb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtYXQuRm9ybWF0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuVGFibGVSb3dQcm9wZXJ0aWVzRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFRhYmxlUm93UHJvcGVydGllc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlUYWJsZVJvd1Byb3BlcnRpZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTM1MTIxNzg4MjM5NDMwMDk2MUw7Ci0KLQlwcm90ZWN0ZWQgVGFibGVSb3dQcm9wZXJ0aWVzRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVSb3dIZWlnaHQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfUk9XX0hFSUdIVCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9ST1dfSEVJR0hUKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0QnJlYWtCZWZvcmUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfQlJFQUtfQkVGT1JFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0JSRUFLX0JFRk9SRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJTdHlsZVVzZU9wdGltYWxSb3dIZWlnaHQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfVVNFX09QVElNQUxfUk9XX0hFSUdIVCkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9VU0VfT1BUSU1BTF9ST1dfSEVJR0hUKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvVGV4dFByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdHlsZS9pbXBsL1RleHRQcm9wZXJ0aWVzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQyZmRjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N0eWxlL2ltcGwvVGV4dFByb3BlcnRpZXNFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybWF0LkZvcm1hdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlRleHRQcm9wZXJ0aWVzRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFRleHRQcm9wZXJ0aWVzRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVRleHRQcm9wZXJ0aWVzRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTUyNDg3NjUwNDkxMDczNjgyNzlMOwotCi0JcHJvdGVjdGVkIFRleHRQcm9wZXJ0aWVzRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGb250TmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRk9OVF9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Rm9udFNpemUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfRk9OVF9TSVpFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0ZPTlRfU0laRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1hdEZvbnRTdHlsZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9GT05UX1NUWUxFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0ZPTlRfU1RZTEUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRGb250V2VpZ2h0KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0ZPTlRfV0VJR0hUKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJCUZvcm1hdENvbnN0YW50cy5BVFRSX0ZPTlRfV0VJR0hUKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Q29sb3IoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfQ09MT1IpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfQ09MT1IpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJGb3JtYXRCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhGb3JtYXRDb25zdGFudHMuRk9STUFUX05BTUVTUEFDRV9VUkksCi0JCQkJRm9ybWF0Q29uc3RhbnRzLkFUVFJfQkFDS0dST1VORF9DT0xPUikpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9CQUNLR1JPVU5EX0NPTE9SKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybWF0Rm9udEZhbWlseSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKEZvcm1hdENvbnN0YW50cy5GT1JNQVRfTkFNRVNQQUNFX1VSSSwKLQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9GT05UX0ZBTUlMWSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoRm9ybWF0Q29uc3RhbnRzLkZPUk1BVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtYXRDb25zdGFudHMuQVRUUl9GT05UX0ZBTUlMWSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRm9udEZhbWlseUdlbmVyaWMoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRk9OVF9GQU1JTFlfR0VORVJJQykpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX0ZBTUlMWV9HRU5FUklDKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGb250UGl0Y2goKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRk9OVF9QSVRDSCkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX1BJVENIKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGb250RmFtaWx5QXNpYW4oKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRk9OVF9GQU1JTFlfQVNJQU4pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRk9OVF9GQU1JTFlfQVNJQU4pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUZvbnRQaXRjaEFzaWFuKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0ZPTlRfUElUQ0hfQVNJQU4pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRk9OVF9QSVRDSF9BU0lBTik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRm9udFNpemVBc2lhbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX1NJWkVfQVNJQU4pKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRk9OVF9TSVpFX0FTSUFOKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVGb250RmFtaWx5Q29tcGxleCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9GT05UX0ZBTUlMWV9DT01QTEVYKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0ZPTlRfRkFNSUxZX0NPTVBMRVgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZUZvbnRQaXRjaENvbXBsZXgoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfRk9OVF9QSVRDSF9DT01QTEVYKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0ZPTlRfUElUQ0hfQ09NUExFWCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clN0eWxlRm9udFNpemVDb21wbGV4KCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0ZPTlRfU0laRV9DT01QTEVYKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX0ZPTlRfU0laRV9DT01QTEVYKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyU3R5bGVUZXh0VW5kZXJsaW5lU3R5bGUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfVEVYVF9VTkRFUkxJTkVfU1RZTEUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfVEVYVF9VTkRFUkxJTkVfU1RZTEUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJTdHlsZVRleHRQb3NpdGlvbigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9URVhUX1BPU0lUSU9OKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX1RFWFRfUE9TSVRJT04pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvRGVzY0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3ZnL0Rlc2NFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OGQ0YjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvRGVzY0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxzdmc6ZGVzYz4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElFZGl0YWJsZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvU1ZHQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9TVkdDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjNzMxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9TVkdDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmc7Ci0KLS8qKgotICogU1ZHQ29uc3RhbnRzIGRlZmluZXMgdGhlIGNvbnN0YW50IHZhbHVlcyB1c2VkIGJ5IFNWRyBuYW1lc3BhY2Ugb2YgT0RGIERPTSBBUEkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNWR0NvbnN0YW50cyB7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgU1ZHX05BTUVTUEFDRV9VUkkgPSAidXJuOm9hc2lzOm5hbWVzOnRjOm9wZW5kb2N1bWVudDp4bWxuczpzdmctY29tcGF0aWJsZToxLjAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9USVRMRSA9ICJ0aXRsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0RFU0MgPSAiZGVzYyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1dJRFRIID0gIndpZHRoIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfSEVJR0hUID0gImhlaWdodCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1ggPSAieCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1kgPSAieSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZPTlRfRkFNSUxZID0gImZvbnQtZmFtaWx5IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRk9OVF9GQU1JTFlfR0VORVJJQyA9ICJmb250LWZhbWlseS1nZW5lcmljIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfU1RST0tFX1dJRFRIID0gInN0cm9rZS13aWR0aCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NUUk9LRV9DT0xPUiA9ICJzdHJva2UtY29sb3IiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVFJPS0VfT1BBQ0lUWSA9ICJzdHJva2Utb3BhY2l0eSI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvVGl0bGVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9UaXRsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhMDBkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9UaXRsZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDxzdmc6dGl0bGU+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGl0bGVFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCwgSUVkaXRhYmxlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9pbXBsL0Rlc2NFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvaW1wbC9EZXNjRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxYTg5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9pbXBsL0Rlc2NFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN2Zy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLkRlc2NFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLWNsYXNzIERlc2NFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgRGVzY0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MTAyMjUzNTM3MDIwMDc4NzU3TDsKLQotCXByb3RlY3RlZCBEZXNjRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlyZXR1cm4gKChUZXh0KSBjaGlsZCkuZ2V0RGF0YSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCBkYXRhKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0KElFZGl0YWJsZSBkYXRhKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVkaXRMaXN0ZW5lcihJRWRpdExpc3RlbmVyIG9ic2VydmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRWRpdExpc3RlbmVyKElFZGl0TGlzdGVuZXIgb2JzZXJ2ZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvaW1wbC9TVkdOb2RlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvaW1wbC9TVkdOb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWYyOWY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvc3ZnL2ltcGwvU1ZHTm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuaW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuQWJzdHJhY3RPREZOb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3ZnLlNWR0NvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBTVkdOb2RlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0T0RGTm9kZUZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPiB0YWdNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPigpOwotCi0Jc3RhdGljIHsKLQkJdGFnTWFwLnB1dChTVkdDb25zdGFudHMuRUxFTUVOVF9USVRMRSwgVGl0bGVFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoU1ZHQ29uc3RhbnRzLkVMRU1FTlRfREVTQywgRGVzY0VsZW1lbnRJbXBsLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChPREZEb2N1bWVudCBvZGZEb2MsIFN0cmluZyB0YWdOYW1lLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNsYXNzIGNzID0gKENsYXNzKSB0YWdNYXAuZ2V0KHRhZ05hbWUpOwotCQlpZiAobnVsbCA9PSBjcykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIChFbGVtZW50KSBmaW5kRWxlbWVudENvbnN0cmFjdG9yKGNzKS5uZXdJbnN0YW5jZSgKLQkJCQkJbmV3IE9iamVjdFtdIHsgb2RmRG9jLCBlbGVtZW50IH0pOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi9zdmcvaW1wbC9UaXRsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9pbXBsL1RpdGxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBjOWVjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3N2Zy9pbXBsL1RpdGxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN2Zy5UaXRsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotY2xhc3MgVGl0bGVFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgVGl0bGVFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODc3MDYwODg2NDQxMTcyODY4MEw7Ci0KLQlwcm90ZWN0ZWQgVGl0bGVFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCXJldHVybiAoKFRleHQpIGNoaWxkKS5nZXREYXRhKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnQoSUVkaXRhYmxlIGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRWRpdExpc3RlbmVyKElFZGl0TGlzdGVuZXIgb2JzZXJ2ZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL0NvdmVyZWRUYWJsZUNlbGxFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL0NvdmVyZWRUYWJsZUNlbGxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ODdjMzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9Db3ZlcmVkVGFibGVDZWxsRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDx0YWJsZTpjb3ZlcmVkLXRhYmxlLWNlbGw+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ292ZXJlZFRhYmxlQ2VsbEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUsCi0JCUlUZXh0RWxlbWVudENvbnRhaW5lciB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVDZWxsRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZUNlbGxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OGI2MGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZUNlbGxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSVRleHRFbGVtZW50Q29udGFpbmVyOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHRhYmxlOnRhYmxlLWNlbGw+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVDZWxsRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSwKLQkJSVRleHRFbGVtZW50Q29udGFpbmVyIHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZVN0eWxlTmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyT2ZmaWNlVmFsdWUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck9mZmljZVZhbHVlVHlwZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVGb3JtdWxhKCk7Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJUYWJsZU51bWJlckNvbHVtbnNSZXBlYXRlZCgpOwotCi0JcHVibGljIGludCBnZXRBdHRyVGFibGVOdW1iZXJDb2x1bW5zU3Bhbm5lZCgpOwotCi0JcHVibGljIGludCBnZXRUYWJsZUluZGV4KCk7Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGdldFRhYmxlRWxlbWVudCgpOwotCi0JcHVibGljIGludCBnZXRUYWJsZUNvbEluZGV4KCk7Ci0KLQlwdWJsaWMgaW50IGdldFRhYmxlUm93SW5kZXgoKTsKLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVDb2xTaXplKCk7Ci0KLQlwdWJsaWMgaW50IGdldFRhYmxlUm93U2l6ZSgpOwotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVDb2x1bW5FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlQ29sdW1uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTA0ZDUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVDb2x1bW5FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDx0YWJsZTp0YWJsZS1jb2x1bW4+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVDb2x1bW5FbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCwgSVN0eWxhYmxlIHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZVN0eWxlTmFtZSgpOwotCi0JcHVibGljIGludCBnZXRBdHRyVGFibGVOdW1iZXJDb2x1bW5zUmVwZWF0ZWQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlRGVmYXVsdENlbGxTdHlsZU5hbWUoKTsKLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVJbmRleCgpOwotCi0JcHVibGljIFRhYmxlRWxlbWVudCBnZXRUYWJsZUVsZW1lbnQoKTsKLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVDb2x1bW5JbmRleCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVDb2x1bW5zRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZUNvbHVtbnNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDNhYzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZUNvbHVtbnNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHRhYmxlOnRhYmxlLWNvbHVtbnM+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVDb2x1bW5zRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlZjExMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGU7Ci0KLS8qKgotICogVGFibGVDb25zdGFudHMgZGVmaW5lcyB0aGUgY29uc3RhbnQgdmFsdWVzIHVzZWQgYnkgdGFibGUgbmFtZXNwYWNlIG9mIE9ERiBET00gQVBJCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYWJsZUNvbnN0YW50cyB7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRVNQQUNFX1VSSSA9ICJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOnRhYmxlOjEuMCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBQkxFID0gInRhYmxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEFCTEVfUk9XID0gInRhYmxlLXJvdyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBQkxFX0NPTFVNTiA9ICJ0YWJsZS1jb2x1bW4iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUJMRV9DRUxMID0gInRhYmxlLWNlbGwiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DT1ZFUkVEX1RBQkxFX0NFTEwgPSAiY292ZXJlZC10YWJsZS1jZWxsIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEFCTEVfSEVBREVSX0NPTFVNTlMgPSAidGFibGUtaGVhZGVyLWNvbHVtbnMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUJMRV9IRUFERVJfUk9XUyA9ICJ0YWJsZS1oZWFkZXItcm93cyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBQkxFX1JPV1MgPSAidGFibGUtcm93cyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBQkxFX0NPTFVNTlMgPSAidGFibGUtY29sdW1ucyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NUWUxFX05BTUUgPSAic3R5bGUtbmFtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0NFTExfUkFOR0VfQUREUkVTUyA9ICJjZWxsLXJhbmdlLWFkZHJlc3MiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9FTkRfQ0VMTF9BRERSRVNTID0gImVuZC1jZWxsLWFkZHJlc3MiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9FTkRfWCA9ICJlbmQtY2VsbC14IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfRU5EX1kgPSAiZW5kLWNlbGwteSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RJU1BMQVkgPSAiZGlzcGxheSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZPUk1VTEEgPSAiZm9ybXVsYSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX05VTUJFUl9ST1dTX1JFUEVBVEVEID0gIm51bWJlci1yb3dzLXJlcGVhdGVkIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTlVNQkVSX0NPTFVNTlNfUkVQRUFURUQgPSAibnVtYmVyLWNvbHVtbnMtcmVwZWF0ZWQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9OVU1CRVJfQ09MVU1OU19TUEFOTkVEID0gIm51bWJlci1jb2x1bW5zLXNwYW5uZWQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX0NFTExfU1RZTEVfTkFNRSA9ICJkZWZhdWx0LWNlbGwtc3R5bGUtbmFtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUUgPSAibmFtZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0FUVFJfUFJJTlQgPSAiYXR0ci1wcmludCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0JPUkRFUl9NT0RFTCA9ICJib3JkZXItbW9kZWwiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVFJVQ1RVUkVfUFJPVEVDVEVEID0gInN0cnVjdHVyZS1wcm90ZWN0ZWQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9URUNURUQgPSAicHJvdGVjdGVkIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFjZDIzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5Db250ZW50QmFzZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5TZXF1ZW5jZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8dGFibGU6dGFibGU+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCwgSVN0eWxhYmxlLAotCQlJVGV4dEVsZW1lbnRDb250YWluZXIgewotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlU3R5bGVOYW1lKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZU5hbWUoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJUYWJsZUF0dHJQcmludCgpOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clRhYmxlUHJvdGVjdGVkKCk7Ci0KLQlwdWJsaWMgQ29udGVudEJhc2VFbGVtZW50IGdldENvbnRlbnQoKTsKLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVJbmRleCgpOwotCi0JcHVibGljIFRhYmxlQ29sdW1uRWxlbWVudCBnZXRUYWJsZUNvbHVtbkNoaWxkKGludCBjb2x1bW4pOwotCi0JcHVibGljIFRhYmxlUm93RWxlbWVudCBnZXRUYWJsZVJvd0NoaWxkKGludCByb3cpOwotCi0JcHVibGljIGludCBnZXRUYWJsZUNvbHVtblNpemUoKTsKLQotCXB1YmxpYyBMaXN0IGdldFRhYmxlQ29sdW1uQ2hpbGRyZW4oKTsKLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVSb3dTaXplKCk7Ci0KLQlwdWJsaWMgTGlzdCBnZXRUYWJsZVJvd0NoaWxkcmVuKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNUYWJsZUNlbGxTdHlsZShpbnQgY29sdW1uLCBpbnQgcm93KTsKLQotCXB1YmxpYyBUYWJsZVJvd0VsZW1lbnQgYXBwZW5kTmV3VGFibGVSb3dFbGVtZW50KCk7Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0VGFibGVIZWFkZXJDb2x1bW5zKCk7Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0VGFibGVIZWFkZXJSb3dzKCk7Ci0KLQlwdWJsaWMgU2VxdWVuY2VFbGVtZW50IGdldFRleHRTZXF1ZW5jZUVsZW1lbnQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlSGVhZGVyQ29sdW1uc0VsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVIZWFkZXJDb2x1bW5zRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQ3YmVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVIZWFkZXJDb2x1bW5zRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHRhYmxlOnRhYmxlLWhlYWRlci1jb2x1bW5zPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlSGVhZGVyQ29sdW1uc0VsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgaW50IGdldFRhYmxlSW5kZXgoKTsKLQotCXB1YmxpYyBUYWJsZUVsZW1lbnQgZ2V0VGFibGVFbGVtZW50KCk7Ci0KLQlwdWJsaWMgTGlzdCBnZXRUYWJsZUNvbHVtQ2hpbGRyZW4oKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVIZWFkZXJSb3dzRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZUhlYWRlclJvd3NFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YTliYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZUhlYWRlclJvd3NFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8dGFibGU6dGFibGUtaGVhZGVyLXJvd3M+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVIZWFkZXJSb3dzRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBpbnQgZ2V0VGFibGVJbmRleCgpOwotCi0JcHVibGljIFRhYmxlRWxlbWVudCBnZXRUYWJsZUVsZW1lbnQoKTsKLQotCXB1YmxpYyBMaXN0IGdldFRhYmxlUm93Q2hpbGRyZW4oKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVSb3dFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlUm93RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2Q4MjQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvVGFibGVSb3dFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5JVGV4dEVsZW1lbnRDb250YWluZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8dGFibGU6dGFibGUtcm93PiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlUm93RWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSwKLQkJSVRleHRFbGVtZW50Q29udGFpbmVyIHsKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZVN0eWxlTmFtZSgpOwotCi0JcHVibGljIGludCBnZXRBdHRyVGFibGVOdW1iZXJSb3dzUmVwZWF0ZWQoKTsKLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVJbmRleCgpOwotCi0JcHVibGljIGludCBnZXRSb3dJbmRleCgpOwotCi0JcHVibGljIFRhYmxlRWxlbWVudCBnZXRUYWJsZUVsZW1lbnQoKTsKLQotCXB1YmxpYyBMaXN0IGdldFRhYmxlQ2VsbENoaWxkcmVuKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9UYWJsZVJvd3NFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlUm93c0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhhYjQ5MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL1RhYmxlUm93c0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDx0YWJsZTp0YWJsZS1yb3dzPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlUm93c0VsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLQlwdWJsaWMgTGlzdCBnZXRUYWJsZVJvd0NoaWxkcmVuKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL0NvdmVyZWRUYWJsZUNlbGxFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL0NvdmVyZWRUYWJsZUNlbGxFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDQwMTRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9Db3ZlcmVkVGFibGVDZWxsRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuQ292ZXJlZFRhYmxlQ2VsbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgQ292ZXJlZFRhYmxlQ2VsbEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUNvdmVyZWRUYWJsZUNlbGxFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzM3MzI4MzU4ODA0ODYzMjY2M0w7Ci0KLQlwcm90ZWN0ZWQgQ292ZXJlZFRhYmxlQ2VsbEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3R5bGUoU3R5bGVFbGVtZW50IHN0eWxlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBTdHlsZUVsZW1lbnQgZ2V0U3R5bGUoKSB7Ci0JCUVsZW1lbnQgcm9vdCA9IGdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJaWYgKHJvb3QgaW5zdGFuY2VvZiBPREZFbGVtZW50SW1wbCkgewotCQkJU3RyaW5nIHN0eWxlTmFtZSA9IGdldEF0dHJpYnV0ZU5TKAotCQkJCQlUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX1NUWUxFX05BTUUpOwotCQkJT0RGRWxlbWVudCBlbGVtID0gKChPREZFbGVtZW50SW1wbCkgcm9vdCkuZmluZEVsZW1lbnRCeUF0dHJWYWx1ZSgKLQkJCQkJU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuRUxFTUVOVF9TVFlMRSwKLQkJCQkJU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9OQU1FLCBzdHlsZU5hbWUpOwotCQkJaWYgKChlbGVtICE9IG51bGwpICYmIChlbGVtIGluc3RhbmNlb2YgU3R5bGVFbGVtZW50KSkKLQkJCQlyZXR1cm4gKFN0eWxlRWxlbWVudCkgZWxlbTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHlsZUxpc3RlbmVyKElTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3R5bGVMaXN0ZW5lcihJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEl0ZXJhdG9yKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZUNlbGxFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlQ2VsbEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOGY3YjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlQ2VsbEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuT2ZmaWNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5pbXBsLklUZXh0RWxlbWVudENvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ2VsbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlUm93RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotY2xhc3MgVGFibGVDZWxsRWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGFibGVDZWxsRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ2MTc1MzY5Mzk3NjA4MjAzOTdMOwotCi0JcHJvdGVjdGVkIFRhYmxlQ2VsbEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVTdHlsZU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfU1RZTEVfTkFNRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9TVFlMRV9OQU1FKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZUluZGV4KCkgewotCQlUYWJsZUVsZW1lbnQgdGFibGVFbGVtZW50ID0gZ2V0VGFibGVFbGVtZW50KCk7Ci0JCXJldHVybiB0YWJsZUVsZW1lbnQuZ2V0VGFibGVJbmRleCgpOwotCX0KLQotCXB1YmxpYyBUYWJsZUVsZW1lbnQgZ2V0VGFibGVFbGVtZW50KCkgewotCQlUYWJsZUVsZW1lbnQgdGFibGVFbGVtZW50ID0gbnVsbDsKLQotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgVGFibGVFbGVtZW50KSB7Ci0JCQkJdGFibGVFbGVtZW50ID0gKFRhYmxlRWxlbWVudCkgcGFyZW50OwotCQkJCWJyZWFrOwotCQkJfQotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCi0JCXJldHVybiB0YWJsZUVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZUNvbEluZGV4KCkgewotCQlUYWJsZUVsZW1lbnQgdGFibGVFbGVtZW50ID0gZ2V0VGFibGVFbGVtZW50KCk7Ci0JCWlmICh0YWJsZUVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlMaXN0IHJvd0xpc3QgPSB0YWJsZUVsZW1lbnQuZ2V0VGFibGVSb3dDaGlsZHJlbigpOwotCQlpZiAocm93TGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm93TGlzdC5zaXplKCk7IGkrKykgewotCQkJVGFibGVSb3dFbGVtZW50IHJvdyA9IChUYWJsZVJvd0VsZW1lbnQpIHJvd0xpc3QuZ2V0KGkpOwotCQkJTGlzdCBjZWxsTGlzdCA9IHJvdy5nZXRUYWJsZUNlbGxDaGlsZHJlbigpOwotCQkJaWYgKGNlbGxMaXN0ICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNlbGxMaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCWlmIChjZWxsTGlzdC5nZXQoaikuZXF1YWxzKHRoaXMpKSB7Ci0JCQkJCQlyZXR1cm4gajsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRhYmxlUm93SW5kZXgoKSB7Ci0JCVRhYmxlRWxlbWVudCB0YWJsZUVsZW1lbnQgPSBnZXRUYWJsZUVsZW1lbnQoKTsKLQkJaWYgKHRhYmxlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCUxpc3Qgcm93TGlzdCA9IHRhYmxlRWxlbWVudC5nZXRUYWJsZVJvd0NoaWxkcmVuKCk7Ci0JCWlmIChyb3dMaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb3dMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlUYWJsZVJvd0VsZW1lbnQgcm93ID0gKFRhYmxlUm93RWxlbWVudCkgcm93TGlzdC5nZXQoaSk7Ci0JCQlMaXN0IGNlbGxMaXN0ID0gcm93LmdldFRhYmxlQ2VsbENoaWxkcmVuKCk7Ci0JCQlpZiAoY2VsbExpc3QgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2VsbExpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJaWYgKGNlbGxMaXN0LmdldChqKS5lcXVhbHModGhpcykpIHsKLQkJCQkJCXJldHVybiBpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVDb2xTaXplKCkgewotCQlUYWJsZUVsZW1lbnQgdGFibGVFbGVtZW50ID0gZ2V0VGFibGVFbGVtZW50KCk7Ci0JCWlmICh0YWJsZUVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlMaXN0IHJvd0xpc3QgPSB0YWJsZUVsZW1lbnQuZ2V0VGFibGVSb3dDaGlsZHJlbigpOwotCQlpZiAocm93TGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm93TGlzdC5zaXplKCk7IGkrKykgewotCQkJVGFibGVSb3dFbGVtZW50IHJvdyA9IChUYWJsZVJvd0VsZW1lbnQpIHJvd0xpc3QuZ2V0KGkpOwotCQkJTGlzdCBjZWxsTGlzdCA9IHJvdy5nZXRUYWJsZUNlbGxDaGlsZHJlbigpOwotCQkJaWYgKGNlbGxMaXN0ICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNlbGxMaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCWlmIChjZWxsTGlzdC5nZXQoaikuZXF1YWxzKHRoaXMpKSB7Ci0JCQkJCQlyZXR1cm4gY2VsbExpc3Quc2l6ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRhYmxlUm93U2l6ZSgpIHsKLQkJVGFibGVFbGVtZW50IHRhYmxlRWxlbWVudCA9IGdldFRhYmxlRWxlbWVudCgpOwotCQlpZiAodGFibGVFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJTGlzdCByb3dMaXN0ID0gdGFibGVFbGVtZW50LmdldFRhYmxlUm93Q2hpbGRyZW4oKTsKLQkJaWYgKHJvd0xpc3QgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlyZXR1cm4gcm93TGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyT2ZmaWNlVmFsdWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhPZmZpY2VDb25zdGFudHMuT0ZGSUNFX05BTUVTUEFDRV9VUkksCi0JCQkJT2ZmaWNlQ29uc3RhbnRzLkFUVFJfVkFMVUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKE9mZmljZUNvbnN0YW50cy5PRkZJQ0VfTkFNRVNQQUNFX1VSSSwKLQkJCQkJT2ZmaWNlQ29uc3RhbnRzLkFUVFJfVkFMVUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJPZmZpY2VWYWx1ZVR5cGUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhPZmZpY2VDb25zdGFudHMuT0ZGSUNFX05BTUVTUEFDRV9VUkksCi0JCQkJT2ZmaWNlQ29uc3RhbnRzLkFUVFJfVkFMVUVfVFlQRSkpCi0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlPZmZpY2VDb25zdGFudHMuQVRUUl9WQUxVRV9UWVBFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyVGFibGVGb3JtdWxhKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX0ZPUk1VTEEpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfRk9STVVMQSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0clRhYmxlTnVtYmVyQ29sdW1uc1JlcGVhdGVkKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX05VTUJFUl9DT0xVTU5TX1JFUEVBVEVEKSkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX05VTUJFUl9DT0xVTU5TX1JFUEVBVEVEKSkuaW50VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdHRyVGFibGVOdW1iZXJDb2x1bW5zU3Bhbm5lZCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9OVU1CRVJfQ09MVU1OU19TUEFOTkVEKSkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX05VTUJFUl9DT0xVTU5TX1NQQU5ORUQpKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJc2V0QXR0cmlidXRlTlMoT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJLAotCQkJCU9mZmljZUNvbnN0YW50cy5BVFRSX1ZBTFVFLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJPZmZpY2VWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0eWxlKFN0eWxlRWxlbWVudCBzdHlsZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgU3R5bGVFbGVtZW50IGdldFN0eWxlKCkgewotCQlFbGVtZW50IHJvb3QgPSBnZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmIChyb290IGluc3RhbmNlb2YgT0RGRWxlbWVudEltcGwpIHsKLQkJCVN0cmluZyBzdHlsZU5hbWUgPSBnZXRBdHRyaWJ1dGVOUygKLQkJCQkJVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9TVFlMRV9OQU1FKTsKLQkJCU9ERkVsZW1lbnQgZWxlbSA9ICgoT0RGRWxlbWVudEltcGwpIHJvb3QpLmZpbmRFbGVtZW50QnlBdHRyVmFsdWUoCi0JCQkJCVN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfU1RZTEUsCi0JCQkJCVN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfTkFNRSwgc3R5bGVOYW1lKTsKLQkJCWlmICgoZWxlbSAhPSBudWxsKSAmJiAoZWxlbSBpbnN0YW5jZW9mIFN0eWxlRWxlbWVudCkpCi0JCQkJcmV0dXJuIChTdHlsZUVsZW1lbnQpIGVsZW07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3R5bGVMaXN0ZW5lcihJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0eWxlTGlzdGVuZXIoSVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50U2l6ZSgpIHsKLQkJcmV0dXJuIElUZXh0RWxlbWVudENvbnRhaW5lclV0aWwuZ2V0Q29udGVudFNpemUodGhpcyk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiBJVGV4dEVsZW1lbnRDb250YWluZXJVdGlsLmdldENoaWxkSXRlcmF0b3IodGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZUNvbHVtbkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVDb2x1bW5FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWM0ZGI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZUNvbHVtbkVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb2x1bW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1jbGFzcyBUYWJsZUNvbHVtbkVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVRhYmxlQ29sdW1uRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY0ODE0MzI0OTYzMDk4NDY0MDFMOwotCi0JcHJvdGVjdGVkIFRhYmxlQ29sdW1uRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZVN0eWxlTmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9TVFlMRV9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX1NUWUxFX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJUYWJsZU51bWJlckNvbHVtbnNSZXBlYXRlZCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9OVU1CRVJfQ09MVU1OU19SRVBFQVRFRCkpIHsKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9OVU1CRVJfQ09MVU1OU19SRVBFQVRFRCkpLmludFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlRGVmYXVsdENlbGxTdHlsZU5hbWUoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfREVGQVVMVF9DRUxMX1NUWUxFX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfREVGQVVMVF9DRUxMX1NUWUxFX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRhYmxlSW5kZXgoKSB7Ci0JCVRhYmxlRWxlbWVudCB0YWJsZSA9IGdldFRhYmxlRWxlbWVudCgpOwotCQlpZiAodGFibGUgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJcmV0dXJuIHRhYmxlLmdldFRhYmxlSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGdldFRhYmxlRWxlbWVudCgpIHsKLQkJVGFibGVFbGVtZW50IHRhYmxlRWxlbWVudCA9IG51bGw7Ci0KLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRhYmxlRWxlbWVudCkgewotCQkJCXRhYmxlRWxlbWVudCA9IChUYWJsZUVsZW1lbnQpIHBhcmVudDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIHRhYmxlRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRhYmxlQ29sdW1uSW5kZXgoKSB7Ci0JCWludCBjb2x1bW5TdGFydEluZGV4ID0gMDsKLQkJTm9kZUxpc3QgbGlzdCA9IGdldFRhYmxlRWxlbWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwgInRhYmxlLWNvbHVtbiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGxpc3QuaXRlbShpKS5lcXVhbHModGhpcykpIHsKLQkJCQlyZXR1cm4gY29sdW1uU3RhcnRJbmRleDsKLQkJCX0KLQkJCWlmICgoKFRhYmxlQ29sdW1uRWxlbWVudCkgbGlzdC5pdGVtKGkpKS5oYXNBdHRyaWJ1dGVOUygKLQkJCQkJVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9OVU1CRVJfQ09MVU1OU19SRVBFQVRFRCkpIHsKLQkJCQljb2x1bW5TdGFydEluZGV4ICs9ICgoVGFibGVDb2x1bW5FbGVtZW50KSBsaXN0Lml0ZW0oaSkpCi0JCQkJCQkuZ2V0QXR0clRhYmxlTnVtYmVyQ29sdW1uc1JlcGVhdGVkKCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbHVtblN0YXJ0SW5kZXgrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3R5bGUoU3R5bGVFbGVtZW50IHN0eWxlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBTdHlsZUVsZW1lbnQgZ2V0U3R5bGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3R5bGVMaXN0ZW5lcihJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0eWxlTGlzdGVuZXIoSVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlQ29sdW1uc0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVDb2x1bW5zRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4YTI0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVDb2x1bW5zRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb2x1bW5zRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFRhYmxlQ29sdW1uc0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlUYWJsZUNvbHVtbnNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjU0ODM5NDAyMjQ2MzU3NTU0MEw7Ci0KLQlwcm90ZWN0ZWQgVGFibGVDb2x1bW5zRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MmU1OTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5Db250ZW50QmFzZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuQm9keUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5Eb2N1bWVudENvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5pbXBsLklUZXh0RWxlbWVudENvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ2VsbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ29sdW1uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVIZWFkZXJDb2x1bW5zRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVIZWFkZXJSb3dzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVSb3dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZVJvd3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlNlcXVlbmNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UZXh0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC54cGF0aC5YUGF0aFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1jbGFzcyBUYWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRhYmxlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTEwNzI4MTQ3ODU0OTY5NTMyNDlMOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgWFBhdGhTZXJ2aWNlIHhwYXRoU2VydmljZSA9IFhQYXRoU2VydmljZUZhY3RvcnkKLQkJCS5uZXdTZXJ2aWNlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEVYUDEgPSB4cGF0aFNlcnZpY2UKLQkJCS5jb21waWxlKCIuLypbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCSsgVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSQotCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJKyBUYWJsZUNvbnN0YW50cy5FTEVNRU5UX1RBQkxFX0hFQURFUl9DT0xVTU5TICsgIiddIik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEVYUDIgPSB4cGF0aFNlcnZpY2UKLQkJCS5jb21waWxlKCIuLypbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCSsgVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSQotCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJKyBUYWJsZUNvbnN0YW50cy5FTEVNRU5UX1RBQkxFX0hFQURFUl9ST1dTICsgIiddIik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEVYUDMgPSB4cGF0aFNlcnZpY2UKLQkJCS5jb21waWxlKCJmb2xsb3dpbmctc2libGluZzo6KltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJKyBUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJKyBUZXh0Q29uc3RhbnRzLkVMRU1FTlRfUCArICInXVsxXSIKLQkJCQkJKyAiLypbbmFtZXNwYWNlLXVyaSgpPSciICsgVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkkKLQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgVGV4dENvbnN0YW50cy5FTEVNRU5UX1NFUVVFTkNFCi0JCQkJCSsgIiddIik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEVYUDQgPSB4cGF0aFNlcnZpY2UKLQkJCS5jb21waWxlKCJwcmVjZWRpbmctc2libGluZzo6KltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJKyBUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJKyBUZXh0Q29uc3RhbnRzLkVMRU1FTlRfUCArICInXVsxXSIKLQkJCQkJKyAiLypbbmFtZXNwYWNlLXVyaSgpPSciICsgVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkkKLQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgVGV4dENvbnN0YW50cy5FTEVNRU5UX1NFUVVFTkNFCi0JCQkJCSsgIiddIik7Ci0KLQlwcm90ZWN0ZWQgVGFibGVFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlTmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJUYWJsZVN0eWxlTmFtZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9TVFlMRV9OQU1FKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX1NUWUxFX05BTUUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyVGFibGVBdHRyUHJpbnQoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfQVRUUl9QUklOVCkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUygKLQkJCQkJVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9BVFRSX1BSSU5UKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJUYWJsZVByb3RlY3RlZCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJVGFibGVDb25zdGFudHMuQVRUUl9QUk9URUNURUQpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoCi0JCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfUFJPVEVDVEVEKSkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVJbmRleCgpIHsKLQkJTm9kZUxpc3QgbGlzdCA9IGdldENvbnRlbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksICJ0YWJsZSIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGxpc3QuaXRlbShpKS5lcXVhbHModGhpcykpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIFRhYmxlQ29sdW1uRWxlbWVudCBnZXRUYWJsZUNvbHVtbkNoaWxkKGludCBjb2x1bW4pIHsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgY291bnQgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWlmIChjaGlsZHJlbi5pdGVtKGkpIGluc3RhbmNlb2YgVGFibGVDb2x1bW5FbGVtZW50KSB7Ci0JCQkJCWlmIChjb3VudCA9PSBjb2x1bW4pCi0JCQkJCQlyZXR1cm4gKFRhYmxlQ29sdW1uRWxlbWVudCkgY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJY291bnQrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRhYmxlUm93RWxlbWVudCBnZXRUYWJsZVJvd0NoaWxkKGludCByb3cpIHsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMCwgY291bnQgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWlmIChjaGlsZHJlbi5pdGVtKGkpIGluc3RhbmNlb2YgVGFibGVSb3dFbGVtZW50KSB7Ci0JCQkJCWlmIChjb3VudCA9PSByb3cpCi0JCQkJCQlyZXR1cm4gKFRhYmxlUm93RWxlbWVudCkgY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJY291bnQrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZUNvbHVtblNpemUoKSB7Ci0JCWludCBzaXplID0gMDsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBUYWJsZUNvbHVtbkVsZW1lbnQpIHsKLQkJCQkJaW50IGxlbiA9ICgoVGFibGVDb2x1bW5FbGVtZW50KSBjaGlsZCkKLQkJCQkJCQkuZ2V0QXR0clRhYmxlTnVtYmVyQ29sdW1uc1JlcGVhdGVkKCk7Ci0JCQkJCWlmIChsZW4gPiAwKQotCQkJCQkJc2l6ZSArPSBsZW47Ci0JCQkJCWVsc2UKLQkJCQkJCXNpemUrKzsKLQkJCQl9IGVsc2UgaWYgKChjaGlsZCBpbnN0YW5jZW9mIFRhYmxlSGVhZGVyQ29sdW1uc0VsZW1lbnQpCi0JCQkJCQl8fCAoY2hpbGQgaW5zdGFuY2VvZiBUYWJsZUNvbHVtbkVsZW1lbnQpKSB7Ci0JCQkJCU5vZGVMaXN0IGdyYW5kQ2hpbGRyZW4gPSBjaGlsZC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZ3JhbmRDaGlsZHJlbi5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQlOb2RlIGdyYW5kQ2hpbGQgPSBncmFuZENoaWxkcmVuLml0ZW0oaik7Ci0JCQkJCQlpZiAoZ3JhbmRDaGlsZCBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uRWxlbWVudCkgewotCQkJCQkJCWludCBsZW4gPSAoKFRhYmxlQ29sdW1uRWxlbWVudCkgZ3JhbmRDaGlsZCkKLQkJCQkJCQkJCS5nZXRBdHRyVGFibGVOdW1iZXJDb2x1bW5zUmVwZWF0ZWQoKTsKLQkJCQkJCQlpZiAobGVuID4gMCkKLQkJCQkJCQkJc2l6ZSArPSBsZW47Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlzaXplKys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0VGFibGVDb2x1bW5DaGlsZHJlbigpIHsKLQkJTGlzdDxOb2RlPiBjb2xMaXN0ID0gbnVsbDsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBUYWJsZUNvbHVtbkVsZW1lbnQpIHsKLQkJCQkJaWYgKGNvbExpc3QgPT0gbnVsbCkKLQkJCQkJCWNvbExpc3QgPSBuZXcgVmVjdG9yPE5vZGU+KCk7Ci0JCQkJCWNvbExpc3QuYWRkKGNoaWxkKTsKLQkJCQl9IGVsc2UgaWYgKChjaGlsZCBpbnN0YW5jZW9mIFRhYmxlSGVhZGVyQ29sdW1uc0VsZW1lbnQpCi0JCQkJCQl8fCAoY2hpbGQgaW5zdGFuY2VvZiBUYWJsZUNvbHVtbkVsZW1lbnQpKSB7Ci0JCQkJCU5vZGVMaXN0IGdyYW5kQ2hpbGRyZW4gPSBjaGlsZC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZ3JhbmRDaGlsZHJlbi5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQlOb2RlIGdyYW5kQ2hpbGQgPSBncmFuZENoaWxkcmVuLml0ZW0oaik7Ci0JCQkJCQlpZiAoZ3JhbmRDaGlsZCBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uRWxlbWVudCkgewotCQkJCQkJCWlmIChjb2xMaXN0ID09IG51bGwpCi0JCQkJCQkJCWNvbExpc3QgPSBuZXcgVmVjdG9yPE5vZGU+KCk7Ci0JCQkJCQkJY29sTGlzdC5hZGQoZ3JhbmRDaGlsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbExpc3Q7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZVJvd1NpemUoKSB7Ci0JCWludCBzaXplID0gMDsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBUYWJsZVJvd0VsZW1lbnQpIHsKLQkJCQkJaW50IGxlbiA9ICgoVGFibGVSb3dFbGVtZW50KSBjaGlsZCkKLQkJCQkJCQkuZ2V0QXR0clRhYmxlTnVtYmVyUm93c1JlcGVhdGVkKCk7Ci0JCQkJCWlmIChsZW4gPiAwKQotCQkJCQkJc2l6ZSArPSBsZW47Ci0JCQkJCWVsc2UKLQkJCQkJCXNpemUrKzsKLQkJCQl9IGVsc2UgaWYgKChjaGlsZCBpbnN0YW5jZW9mIFRhYmxlSGVhZGVyUm93c0VsZW1lbnQpCi0JCQkJCQl8fCAoY2hpbGQgaW5zdGFuY2VvZiBUYWJsZVJvd0VsZW1lbnQpKSB7Ci0JCQkJCU5vZGVMaXN0IGdyYW5kQ2hpbGRyZW4gPSBjaGlsZC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZ3JhbmRDaGlsZHJlbi5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQlOb2RlIGdyYW5kQ2hpbGQgPSBncmFuZENoaWxkcmVuLml0ZW0oaik7Ci0JCQkJCQlpZiAoZ3JhbmRDaGlsZCBpbnN0YW5jZW9mIFRhYmxlUm93RWxlbWVudCkgewotCQkJCQkJCWludCBsZW4gPSAoKFRhYmxlUm93RWxlbWVudCkgZ3JhbmRDaGlsZCkKLQkJCQkJCQkJCS5nZXRBdHRyVGFibGVOdW1iZXJSb3dzUmVwZWF0ZWQoKTsKLQkJCQkJCQlpZiAobGVuID4gMCkKLQkJCQkJCQkJc2l6ZSArPSBsZW47Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlzaXplKys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0VGFibGVSb3dDaGlsZHJlbigpIHsKLQkJTGlzdDxOb2RlPiByb3dMaXN0ID0gbnVsbDsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoY2hpbGRyZW4uaXRlbShpKSBpbnN0YW5jZW9mIFRhYmxlUm93RWxlbWVudCkgewotCQkJCQlpZiAocm93TGlzdCA9PSBudWxsKQotCQkJCQkJcm93TGlzdCA9IG5ldyBWZWN0b3I8Tm9kZT4oKTsKLQkJCQkJcm93TGlzdC5hZGQoY2hpbGRyZW4uaXRlbShpKSk7Ci0JCQkJfSBlbHNlIGlmICgoY2hpbGRyZW4uaXRlbShpKSBpbnN0YW5jZW9mIFRhYmxlSGVhZGVyUm93c0VsZW1lbnQpCi0JCQkJCQl8fCAoY2hpbGRyZW4uaXRlbShpKSBpbnN0YW5jZW9mIFRhYmxlUm93c0VsZW1lbnQpKSB7Ci0JCQkJCU5vZGVMaXN0IGdyYW5kQ2hpbGRyZW4gPSBjaGlsZHJlbi5pdGVtKGkpLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBncmFuZENoaWxkcmVuLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCWlmIChncmFuZENoaWxkcmVuLml0ZW0oaikgaW5zdGFuY2VvZiBUYWJsZVJvd0VsZW1lbnQpIHsKLQkJCQkJCQlpZiAocm93TGlzdCA9PSBudWxsKQotCQkJCQkJCQlyb3dMaXN0ID0gbmV3IFZlY3RvcjxOb2RlPigpOwotCQkJCQkJCXJvd0xpc3QuYWRkKGdyYW5kQ2hpbGRyZW4uaXRlbShqKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvd0xpc3Q7Ci0JfQotCi0JcHVibGljIENvbnRlbnRCYXNlRWxlbWVudCBnZXRDb250ZW50KCkgewotCQlpZiAob2RmRG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudEJhc2VFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gbnVsbDsKLQotCQlFbGVtZW50IHJvb3QgPSBvZGZEb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRDb250ZW50RWxlbWVudCkgewotCQkJQm9keUVsZW1lbnQgYm9keSA9ICgoRG9jdW1lbnRDb250ZW50RWxlbWVudCkgcm9vdCkuZ2V0Qm9keUVsZW1lbnQoKTsKLQkJCWNvbnRlbnRFbGVtZW50ID0gYm9keS5nZXRDb250ZW50KCk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVGFibGVDZWxsU3R5bGUoaW50IGNvbHVtbiwgaW50IHJvdykgewotCQlUYWJsZVJvd0VsZW1lbnQgcm93RWxlbWVudCA9IGdldFRhYmxlUm93Q2hpbGQocm93KTsKLQkJTGlzdCBjZWxsRWxlbXMgPSByb3dFbGVtZW50LmdldFRhYmxlQ2VsbENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBjb2xDb3VudCA9IDA7IGkgPCBjZWxsRWxlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCVRhYmxlQ2VsbEVsZW1lbnQgY2VsbEVsZW0gPSAoVGFibGVDZWxsRWxlbWVudCkgY2VsbEVsZW1zLmdldChpKTsKLQkJCWlmIChjZWxsRWxlbS5oYXNBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX05VTUJFUl9DT0xVTU5TX1JFUEVBVEVEKSkgewotCQkJCWNvbENvdW50ICs9IGNlbGxFbGVtLmdldEF0dHJUYWJsZU51bWJlckNvbHVtbnNSZXBlYXRlZCgpOwotCQkJfSBlbHNlIHsKLQkJCQljb2xDb3VudCsrOwotCQkJfQotCQkJaWYgKGNvbENvdW50IC0gMSA+PSBjb2x1bW4pCi0JCQkJcmV0dXJuIGNlbGxFbGVtLmhhc0F0dHJpYnV0ZU5TKAotCQkJCQkJVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfU1RZTEVfTkFNRSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBUYWJsZVJvd0VsZW1lbnQgYXBwZW5kTmV3VGFibGVSb3dFbGVtZW50KCkgewotCQlTdHJpbmcgdGFibGVQcmVmaXggPSB0aGlzCi0JCQkJLmxvb2t1cFByZWZpeChUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJKTsKLQkJVGFibGVSb3dFbGVtZW50IHJvd0VsZW1lbnQgPSAoVGFibGVSb3dFbGVtZW50KSBnZXRPd25lckRvY3VtZW50KCkKLQkJCQkuY3JlYXRlRWxlbWVudCgKLQkJCQkJCXRhYmxlUHJlZml4ICsgIjoiICsgVGFibGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9ST1cpOwotCQlyZXR1cm4gKFRhYmxlUm93RWxlbWVudCkgdGhpcy5hcHBlbmRDaGlsZChyb3dFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0VGFibGVIZWFkZXJDb2x1bW5zKCkgewotCQlyZXR1cm4geHBhdGhTZXJ2aWNlLmV2YWxGb3JOb2RlTGlzdChFWFAxLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0VGFibGVIZWFkZXJSb3dzKCkgewotCQlyZXR1cm4geHBhdGhTZXJ2aWNlLmV2YWxGb3JOb2RlTGlzdChFWFAyLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU2VxdWVuY2VFbGVtZW50IGdldFRleHRTZXF1ZW5jZUVsZW1lbnQoKSB7Ci0JCU5vZGVMaXN0IGZubCA9IHhwYXRoU2VydmljZS5ldmFsRm9yTm9kZUxpc3QoRVhQMywgdGhpcyk7Ci0JCWlmICgoZm5sICE9IG51bGwpICYmIChmbmwuZ2V0TGVuZ3RoKCkgPT0gMSkpCi0JCQlyZXR1cm4gKFNlcXVlbmNlRWxlbWVudCkgZm5sLml0ZW0oMCk7Ci0JCWlmICgoZm5sICE9IG51bGwpICYmIChmbmwuZ2V0TGVuZ3RoKCkgPiAxKSkgewotCQkJbmV3IE9ERkV4Y2VwdGlvbigKLQkJCQkJImRyYXc6aW1hZ2UgaGFzIG1vcmUgdGhhbiBvbmUgdGV4dDpzZXF1ZW5jZSBlbGVtZW50cy4iKQotCQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlOb2RlTGlzdCBwbmwgPSB4cGF0aFNlcnZpY2UuZXZhbEZvck5vZGVMaXN0KEVYUDQsIHRoaXMpOwotCQlpZiAoKHBubCAhPSBudWxsKSAmJiAocG5sLmdldExlbmd0aCgpID09IDEpKQotCQkJcmV0dXJuIChTZXF1ZW5jZUVsZW1lbnQpIHBubC5pdGVtKDApOwotCQlpZiAoKHBubCAhPSBudWxsKSAmJiAocG5sLmdldExlbmd0aCgpID4gMSkpIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oCi0JCQkJCSJkcmF3OmltYWdlIGhhcyBtb3JlIHRoYW4gb25lIHRleHQ6c2VxdWVuY2UgZWxlbWVudHMuIikKLQkJCQkJLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCkgewotCQlyZXR1cm4gSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbC5nZXRDb250ZW50U2l6ZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIElUZXh0RWxlbWVudENvbnRhaW5lclV0aWwuZ2V0Q2hpbGRJdGVyYXRvcih0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlSGVhZGVyQ29sdW1uc0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVIZWFkZXJDb2x1bW5zRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg0M2U0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVIZWFkZXJDb2x1bW5zRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ29sdW1uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUhlYWRlckNvbHVtbnNFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1jbGFzcyBUYWJsZUhlYWRlckNvbHVtbnNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGFibGVIZWFkZXJDb2x1bW5zRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI4MzY3ODA1MDI0MDc1ODA2MjlMOwotCi0JcHJvdGVjdGVkIFRhYmxlSGVhZGVyQ29sdW1uc0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZUluZGV4KCkgewotCQlyZXR1cm4gZ2V0VGFibGVFbGVtZW50KCkuZ2V0VGFibGVJbmRleCgpOwotCX0KLQotCXB1YmxpYyBUYWJsZUVsZW1lbnQgZ2V0VGFibGVFbGVtZW50KCkgewotCQlUYWJsZUVsZW1lbnQgdGFibGVFbGVtZW50ID0gbnVsbDsKLQotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgVGFibGVFbGVtZW50KSB7Ci0JCQkJdGFibGVFbGVtZW50ID0gKFRhYmxlRWxlbWVudCkgcGFyZW50OwotCQkJCWJyZWFrOwotCQkJfQotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gdGFibGVFbGVtZW50OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFRhYmxlQ29sdW1DaGlsZHJlbigpIHsKLQkJTGlzdDxOb2RlPiBjb2x1bW5MaXN0ID0gbnVsbDsKLQotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW4uaXRlbShpKSBpbnN0YW5jZW9mIFRhYmxlQ29sdW1uRWxlbWVudCkgewotCQkJCWlmIChjb2x1bW5MaXN0ID09IG51bGwpCi0JCQkJCWNvbHVtbkxpc3QgPSBuZXcgVmVjdG9yPE5vZGU+KCk7Ci0JCQkJY29sdW1uTGlzdC5hZGQoY2hpbGRyZW4uaXRlbShpKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY29sdW1uTGlzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVIZWFkZXJSb3dzRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZUhlYWRlclJvd3NFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODdmZmZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZUhlYWRlclJvd3NFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUhlYWRlclJvd3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZVJvd0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLWNsYXNzIFRhYmxlSGVhZGVyUm93c0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlUYWJsZUhlYWRlclJvd3NFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MDc4OTI0ODE5MTYxNjE3ODM4TDsKLQotCXByb3RlY3RlZCBUYWJsZUhlYWRlclJvd3NFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGFibGVJbmRleCgpIHsKLQkJcmV0dXJuIGdldFRhYmxlRWxlbWVudCgpLmdldFRhYmxlSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGVFbGVtZW50IGdldFRhYmxlRWxlbWVudCgpIHsKLQkJVGFibGVFbGVtZW50IHRhYmxlRWxlbWVudCA9IG51bGw7Ci0KLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRhYmxlRWxlbWVudCkgewotCQkJCXRhYmxlRWxlbWVudCA9IChUYWJsZUVsZW1lbnQpIHBhcmVudDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIHRhYmxlRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRUYWJsZVJvd0NoaWxkcmVuKCkgewotCQlMaXN0PE5vZGU+IHJvd0xpc3QgPSBudWxsOwotCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChjaGlsZHJlbi5pdGVtKGkpIGluc3RhbmNlb2YgVGFibGVSb3dFbGVtZW50KSB7Ci0JCQkJaWYgKHJvd0xpc3QgPT0gbnVsbCkKLQkJCQkJcm93TGlzdCA9IG5ldyBWZWN0b3I8Tm9kZT4oKTsKLQkJCQlyb3dMaXN0LmFkZChjaGlsZHJlbi5pdGVtKGkpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByb3dMaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZU5vZGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RhYmxlL2ltcGwvVGFibGVOb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDU1MmM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZU5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuaW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuQWJzdHJhY3RPREZOb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgVGFibGVOb2RlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0T0RGTm9kZUZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPiB0YWdNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPigpOwotCi0Jc3RhdGljIHsKLQkJdGFnTWFwLnB1dChUYWJsZUNvbnN0YW50cy5FTEVNRU5UX1RBQkxFLCBUYWJsZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUYWJsZUNvbnN0YW50cy5FTEVNRU5UX1RBQkxFX1JPVywgVGFibGVSb3dFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGFibGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9DT0xVTU4sCi0JCQkJVGFibGVDb2x1bW5FbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGFibGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9DRUxMLAotCQkJCVRhYmxlQ2VsbEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUYWJsZUNvbnN0YW50cy5FTEVNRU5UX0NPVkVSRURfVEFCTEVfQ0VMTCwKLQkJCQlDb3ZlcmVkVGFibGVDZWxsRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfSEVBREVSX0NPTFVNTlMsCi0JCQkJVGFibGVIZWFkZXJDb2x1bW5zRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfSEVBREVSX1JPV1MsCi0JCQkJVGFibGVIZWFkZXJSb3dzRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfUk9XUywKLQkJCQlUYWJsZVJvd3NFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGFibGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9DT0xVTU5TLAotCQkJCVRhYmxlQ29sdW1uc0VsZW1lbnRJbXBsLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChPREZEb2N1bWVudCBvZGZEb2MsIFN0cmluZyB0YWdOYW1lLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNsYXNzIGNzID0gKENsYXNzKSB0YWdNYXAuZ2V0KHRhZ05hbWUpOwotCQlpZiAobnVsbCA9PSBjcykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0cnkgewotCQkJcmV0dXJuIChFbGVtZW50KSBmaW5kRWxlbWVudENvbnN0cmFjdG9yKGNzKS5uZXdJbnN0YW5jZSgKLQkJCQkJbmV3IE9iamVjdFtdIHsgb2RmRG9jLCBlbGVtZW50IH0pOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlUm93RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZVJvd0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMmU1NWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlUm93RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5pbXBsLklUZXh0RWxlbWVudENvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDZWxsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVSb3dFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1jbGFzcyBUYWJsZVJvd0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVRhYmxlUm93RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDUxNTI2ODIxMTU5OTcyMDgyOUw7Ci0KLQlwcm90ZWN0ZWQgVGFibGVSb3dFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0clRhYmxlU3R5bGVOYW1lKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX1NUWUxFX05BTUUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfU1RZTEVfTkFNRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0clRhYmxlTnVtYmVyUm93c1JlcGVhdGVkKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX05VTUJFUl9ST1dTX1JFUEVBVEVEKSkgewotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEF0dHJpYnV0ZU5TKAotCQkJCQlUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX05VTUJFUl9ST1dTX1JFUEVBVEVEKSkuaW50VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZUluZGV4KCkgewotCQlUYWJsZUVsZW1lbnQgdGFibGVFbGVtZW50ID0gZ2V0VGFibGVFbGVtZW50KCk7Ci0JCXJldHVybiB0YWJsZUVsZW1lbnQuZ2V0VGFibGVJbmRleCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Um93SW5kZXgoKSB7Ci0JCVRhYmxlRWxlbWVudCB0YWJsZUVsZW1lbnQgPSBnZXRUYWJsZUVsZW1lbnQoKTsKLQkJaWYgKHRhYmxlRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCU5vZGVMaXN0IGxpc3QgPSB0YWJsZUVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLQkJCQlUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLCAidGFibGUtcm93Iik7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChsaXN0Lml0ZW0oaSkuZXF1YWxzKHRoaXMpKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBUYWJsZUVsZW1lbnQgZ2V0VGFibGVFbGVtZW50KCkgewotCQlUYWJsZUVsZW1lbnQgdGFibGVFbGVtZW50ID0gbnVsbDsKLQotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgVGFibGVFbGVtZW50KSB7Ci0JCQkJdGFibGVFbGVtZW50ID0gKFRhYmxlRWxlbWVudCkgcGFyZW50OwotCQkJCWJyZWFrOwotCQkJfQotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCi0JCXJldHVybiB0YWJsZUVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0VGFibGVDZWxsQ2hpbGRyZW4oKSB7Ci0JCUxpc3Q8Tm9kZT4gY2VsbExpc3QgPSBudWxsOwotCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChjaGlsZHJlbi5pdGVtKGkpIGluc3RhbmNlb2YgVGFibGVDZWxsRWxlbWVudCkgewotCQkJCWlmIChjZWxsTGlzdCA9PSBudWxsKQotCQkJCQljZWxsTGlzdCA9IG5ldyBWZWN0b3I8Tm9kZT4oKTsKLQkJCQljZWxsTGlzdC5hZGQoY2hpbGRyZW4uaXRlbShpKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2VsbExpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3R5bGUoU3R5bGVFbGVtZW50IHN0eWxlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBTdHlsZUVsZW1lbnQgZ2V0U3R5bGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3R5bGVMaXN0ZW5lcihJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0eWxlTGlzdGVuZXIoSVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50U2l6ZSgpIHsKLQkJcmV0dXJuIElUZXh0RWxlbWVudENvbnRhaW5lclV0aWwuZ2V0Q29udGVudFNpemUodGhpcyk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiBJVGV4dEVsZW1lbnRDb250YWluZXJVdGlsLmdldENoaWxkSXRlcmF0b3IodGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGFibGUvaW1wbC9UYWJsZVJvd3NFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlUm93c0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZTEzMDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90YWJsZS9pbXBsL1RhYmxlUm93c0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZVJvd0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlUm93c0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLWNsYXNzIFRhYmxlUm93c0VsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBUYWJsZVJvd3NFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0ODkwNTEyMjM2NzI3OTczMzc0TDsKLQotCXByb3RlY3RlZCBUYWJsZVJvd3NFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFRhYmxlUm93Q2hpbGRyZW4oKSB7Ci0JCUxpc3Q8Tm9kZT4gcm93TGlzdCA9IG51bGw7Ci0KLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkgaW5zdGFuY2VvZiBUYWJsZVJvd0VsZW1lbnQpIHsKLQkJCQlpZiAocm93TGlzdCA9PSBudWxsKQotCQkJCQlyb3dMaXN0ID0gbmV3IFZlY3RvcjxOb2RlPigpOwotCQkJCXJvd0xpc3QuYWRkKGNoaWxkcmVuLml0ZW0oaSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJvd0xpc3Q7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9BRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0FFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZGQ5ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0FFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5JVGV4dEVsZW1lbnRDb250YWluZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8dGV4dDphPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFFbGVtZW50IGV4dGVuZHMgSUVkaXRhYmxlLCBPREZFbGVtZW50LCBJVGV4dEVsZW1lbnRDb250YWluZXIsCi0JCUlUZXh0Q29udGVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRBdHRyT2ZmaWNlVGl0bGUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZW5hbWUpOwotCi0JcHVibGljIFN0cmluZyBnZXRIcmVmKCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRIcmVmKFN0cmluZyB1cmwpOwotCi0JcHVibGljIE9ERkVsZW1lbnQgZ2V0SHJlZkVsZW1lbnQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvQWxwaGFiZXRpY2FsSW5kZXhFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvQWxwaGFiZXRpY2FsSW5kZXhFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODIzY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0FscGhhYmV0aWNhbEluZGV4RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSVRleHRFbGVtZW50Q29udGFpbmVyOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHRleHQ6YWxwaGFiZXRpY2FsLWluZGV4PiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFscGhhYmV0aWNhbEluZGV4RWxlbWVudCBleHRlbmRzIElUZXh0RWxlbWVudENvbnRhaW5lciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0FscGhhYmV0aWNhbEluZGV4U291cmNlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0FscGhhYmV0aWNhbEluZGV4U291cmNlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA3YzYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9BbHBoYWJldGljYWxJbmRleFNvdXJjZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDx0ZXh0OmFscGhhYmV0aWNhbC1pbmRleC1zb3VyY2U+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWxwaGFiZXRpY2FsSW5kZXhTb3VyY2VFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0Jvb2ttYXJrRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0Jvb2ttYXJrRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGRlMzg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9Cb29rbWFya0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDx0ZXh0OmJvb2ttYXJrPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJvb2ttYXJrRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9DaGFuZ2VFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvQ2hhbmdlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTU1ZGJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9DaGFuZ2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8dGV4dDpjaGFuZ2U+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hhbmdlRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0NoYW5nZUVuZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9DaGFuZ2VFbmRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMDA3OGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0NoYW5nZUVuZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDx0ZXh0OmNoYW5nZS1lbmQ+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hhbmdlRW5kRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0NoYW5nZVN0YXJ0RWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0NoYW5nZVN0YXJ0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDExM2FjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9DaGFuZ2VTdGFydEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDx0ZXh0OmNoYW5nZS1zdGFydD4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDaGFuZ2VTdGFydEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9IRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0hFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMGY0NDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0hFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSVRleHRFbGVtZW50Q29udGFpbmVyOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHRleHQ6aD4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBIRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSwgSUVkaXRhYmxlLAotCQlJVGV4dEVsZW1lbnRDb250YWluZXIgewotCXB1YmxpYyBpbnQgZ2V0QXR0clRleHRPdXRsaW5lTGV2ZWwoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJUZXh0UmVzdGFydE51bWJlcmluZygpOwotCi0JcHVibGljIGludCBnZXRBdHRyVGV4dFN0YXJ0VmFsdWUoKTsKLQotCXB1YmxpYyBib29sZWFuIGdldEF0dHJUZXh0SXNMaXN0SGVhZGVyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0lUZXh0Q29udGVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0lUZXh0Q29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMThmMDA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9JVGV4dENvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi0vKioKLSAqIE9ERiBlbGVtZW50cyB0aGF0IGhhdmUgdGV4dCBjb250ZW50cyBzaG91bGQgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJVGV4dENvbnRlbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9JbmRleEJvZHlFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvSW5kZXhCb2R5RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDk4MDQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9JbmRleEJvZHlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5JVGV4dEVsZW1lbnRDb250YWluZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8dGV4dDppbmRleC1ib2R5PiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluZGV4Qm9keUVsZW1lbnQgZXh0ZW5kcyBJVGV4dEVsZW1lbnRDb250YWluZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9JbmRleFRpdGxlRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0luZGV4VGl0bGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NGVmNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0luZGV4VGl0bGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5JVGV4dEVsZW1lbnRDb250YWluZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8dGV4dDppbmRleC10aXRsZT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJbmRleFRpdGxlRWxlbWVudCBleHRlbmRzIElUZXh0RWxlbWVudENvbnRhaW5lciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0xpc3RFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvTGlzdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIxZDM5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvTGlzdEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHRleHQ6bGlzdD4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBMaXN0RWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSwKLQkJSVRleHRFbGVtZW50Q29udGFpbmVyIHsKLQlwdWJsaWMgbG9uZyBnZXRTaXplKCk7Ci0KLQlwdWJsaWMgTGlzdEl0ZW1FbGVtZW50IGdldEl0ZW0obG9uZyBpZHgpOwotCi0JcHVibGljIHZvaWQgYXBwZW5kSXRlbShMaXN0SXRlbUVsZW1lbnQgaXRlbSk7Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnRCZWZvcmUoTGlzdEl0ZW1FbGVtZW50IGl0ZW0sIGxvbmcgaWR4KTsKLQotCXB1YmxpYyBsb25nIGdldExpc3RMZXZlbCgpOwotCi0JcHVibGljIExpc3RFbGVtZW50IGdldFRvcExldmVsTGlzdEVsZW1lbnQoKTsKLQotCXB1YmxpYyBTdHlsZUVsZW1lbnQgZ2V0TGlzdExldmVsU3R5bGVFbGVtZW50KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvTGlzdEhlYWRlckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0SGVhZGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2E1ZjBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0SGVhZGVyRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSVRleHRFbGVtZW50Q29udGFpbmVyOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHRleHQ6bGlzdC1oZWFkZXI+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlzdEhlYWRlckVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUsCi0JCUlUZXh0RWxlbWVudENvbnRhaW5lciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0xpc3RJdGVtRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0xpc3RJdGVtRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTdlMzE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0SXRlbUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDx0ZXh0Omxpc3QtaXRlbT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBMaXN0SXRlbUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUsCi0JCUlUZXh0RWxlbWVudENvbnRhaW5lciB7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvTGlzdExldmVsU3R5bGVCdWxsZXRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvTGlzdExldmVsU3R5bGVCdWxsZXRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MzkwMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L0xpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHRleHQ6bGlzdC1sZXZlbC1zdHlsZS1idWxsZXQ+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlzdExldmVsU3R5bGVCdWxsZXRFbGVtZW50IGV4dGVuZHMgU3R5bGVFbGVtZW50IHsKLQlwdWJsaWMgbG9uZyBnZXRBdHRyTGV2ZWwoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckJ1bGxldENoYXIoKTsKLQotCXB1YmxpYyB2b2lkIHNldEF0dHJCdWxsZXRDaGFyKFN0cmluZyBjaGFyYWN0ZXIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0TGV2ZWxTdHlsZU51bWJlckVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0TGV2ZWxTdHlsZU51bWJlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1ZWE0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8dGV4dDpsaXN0LWxldmVsLXN0eWxlLW51bWJlcj4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBMaXN0TGV2ZWxTdHlsZU51bWJlckVsZW1lbnQgZXh0ZW5kcyBTdHlsZUVsZW1lbnQgewotCXB1YmxpYyBsb25nIGdldEF0dHJMZXZlbCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyTnVtRm9ybWF0KCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOdW1QcmVmaXgoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck51bVN1ZmZpeCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0U3R5bGVFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvTGlzdFN0eWxlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2NjOTk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9MaXN0U3R5bGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8dGV4dDpsaXN0LXN0eWxlPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpc3RTdHlsZUVsZW1lbnQgZXh0ZW5kcyBTdHlsZUVsZW1lbnQgewotCXB1YmxpYyBsb25nIGdldExpc3RMZXZlbFN0eWxlQnVsbGV0U2l6ZSgpOwotCi0JcHVibGljIExpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudCBnZXRMaXN0TGV2ZWxTdHlsZUJ1bGxldChsb25nIGlkeCk7Ci0KLQlwdWJsaWMgdm9pZCBhcHBlbmRMaXN0TGV2ZXJTdHlsZUJ1bGxldChMaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnQgZWxlbSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvUEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9QRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDVkODc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9QRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDx0ZXh0OnA+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUEVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUsIElFZGl0YWJsZSwKLQkJSVRleHRDb250ZW50LCBJVGV4dEVsZW1lbnRDb250YWluZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9QYWdlTnVtYmVyRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L1BhZ2VOdW1iZXJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNzc4MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L1BhZ2VOdW1iZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSVN0eWxhYmxlOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHRleHQ6cGFnZS1udW1iZXI+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFnZU51bWJlckVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9TRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L1NFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NGJmODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L1NFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8dGV4dDpzPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNFbGVtZW50IGV4dGVuZHMgT0RGRWxlbWVudCB7Ci0JcHVibGljIGludCBnZXRBdHRyVGV4dEMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvU2VjdGlvbkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9TZWN0aW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWI3NDgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9TZWN0aW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JU3R5bGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLklUZXh0RWxlbWVudENvbnRhaW5lcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDx0ZXh0OnNlY3Rpb24+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VjdGlvbkVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUsIElFZGl0YWJsZSwKLQkJSVRleHRDb250ZW50LCBJVGV4dEVsZW1lbnRDb250YWluZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9TZXF1ZW5jZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9TZXF1ZW5jZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVlMjY3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvU2VxdWVuY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDx0ZXh0OnNlcXVlbmNlPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcXVlbmNlRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQsIElTdHlsYWJsZSwgSUVkaXRhYmxlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvU3BhbkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9TcGFuRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2MxM2ExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9TcGFuRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIDx0ZXh0OnNwYW4+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3BhbkVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50LCBJU3R5bGFibGUgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9UYWJFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvVGFiRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODEyOTMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9UYWJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8dGV4dDp0YWI+IGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFiRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotCXB1YmxpYyBpbnQgZ2V0QXR0clRleHRUYWJSZWYoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvVGFibGVPZkNvbnRlbnRFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvVGFibGVPZkNvbnRlbnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNmFmNjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L1RhYmxlT2ZDb250ZW50RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucmFuZ2UuSVRleHRFbGVtZW50Q29udGFpbmVyOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHRleHQ6dGFibGUtb2YtY29udGVudD4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBUYWJsZU9mQ29udGVudEVsZW1lbnQgZXh0ZW5kcyBJVGV4dEVsZW1lbnRDb250YWluZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9UYWJsZU9mQ29udGVudFNvdXJjZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9UYWJsZU9mQ29udGVudFNvdXJjZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmZGE3My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvVGFibGVPZkNvbnRlbnRTb3VyY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciA8dGV4dDp0YWJsZS1vZi1jb250ZW50LXNvdXJjZT4gZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBUYWJsZU9mQ29udGVudFNvdXJjZUVsZW1lbnQgZXh0ZW5kcyBPREZFbGVtZW50IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvVGV4dENvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L1RleHRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwZTUwYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvVGV4dENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLS8qKgotICogVGV4dENvbnN0YW50cyBkZWZpbmVzIHRoZSBjb25zdGFudCB2YWx1ZXMgdXNlZCBieSB0ZXh0IG5hbWVzcGFjZSBvZiBPREYgRE9NIEFQSQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGV4dENvbnN0YW50cyB7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgVEVYVF9OQU1FU1BBQ0VfVVJJID0gInVybjpvYXNpczpuYW1lczp0YzpvcGVuZG9jdW1lbnQ6eG1sbnM6dGV4dDoxLjAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9BID0gImEiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9BTFBIQUJFVElDQUxfSU5ERVggPSAiYWxwaGFiZXRpY2FsLWluZGV4IjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQUxQSEFCRVRJQ0FMX0lOREVYX1NPVVJDRSA9ICJhbHBoYWJldGljYWwtaW5kZXgtc291cmNlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQk9PS01BUksgPSAiYm9va21hcmsiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9IID0gImgiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9JTkRFWF9CT0RZID0gImluZGV4LWJvZHkiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9JTkRFWF9USVRMRSA9ICJpbmRleC10aXRsZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xJU1QgPSAibGlzdCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xJU1RfSVRFTSA9ICJsaXN0LWl0ZW0iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MSVNUX0xFVkVMX1NUWUxFX0JVTExFVCA9ICJsaXN0LWxldmVsLXN0eWxlLWJ1bGxldCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xJU1RfTEVWRUxfU1RZTEVfTlVNQkVSID0gImxpc3QtbGV2ZWwtc3R5bGUtbnVtYmVyIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTElTVF9TVFlMRSA9ICJsaXN0LXN0eWxlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTElTVF9IRUFERVIgPSAibGlzdC1oZWFkZXIiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QID0gInAiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TID0gInMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TRUNUSU9OID0gInNlY3Rpb24iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TUEFOID0gInNwYW4iOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9TRVFVRU5DRSA9ICJzZXF1ZW5jZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBQiA9ICJ0YWIiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUJMRV9PRl9DT05URU5UID0gInRhYmxlLW9mLWNvbnRlbnQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUJMRV9PRl9DT05URU5UX1NPVVJDRSA9ICJ0YWJsZS1vZi1jb250ZW50LXNvdXJjZSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RSQUNLRURfQ0hBTkdFUyA9ICJ0cmFja2VkLWNoYW5nZXMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DSEFOR0UgPSAiY2hhbmdlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQ0hBTkdFX1NUQVJUID0gImNoYW5nZS1zdGFydCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NIQU5HRV9FTkQgPSAiY2hhbmdlLWVuZCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1BBR0VfTlVNQkVSID0gInBhZ2UtbnVtYmVyIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfSUQgPSAiaWQiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVFlMRV9OQU1FID0gInN0eWxlLW5hbWUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9MSU5FX0JSRUFLID0gImxpbmUtYnJlYWsiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9PVVRMSU5FX0xFVkVMID0gIm91dGxpbmUtbGV2ZWwiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9SRVNUQVJUX05VTUJFUklORyA9ICJyZXN0YXJ0LW51bWJlcmluZyI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX1NUQVJUX1ZBTFVFID0gInN0YXJ0LXZhbHVlIjsKLQotCXN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIEFUVFJfSVNfTElTVF9IRUFERVIgPSAiaXMtbGlzdC1oZWFkZXIiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9DID0gImMiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9UQUJfUkVGID0gInRhYi1yZWYiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9MRVZFTCA9ICJsZXZlbCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0ZPUk1VTEEgPSAiZm9ybXVsYSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RJU1BMQVkgPSAiZGlzcGxheSI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBBVFRSX0RJU1BMQVlfVkFMVUVfTk9ORSA9ICJub25lIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvVHJhY2tlZENoYW5nZXNFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvVHJhY2tlZENoYW5nZXNFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OTcxNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L1RyYWNrZWRDaGFuZ2VzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgPHRleHQ6dHJhY2tlZC1jaGFuZ2VzPiBlbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyYWNrZWRDaGFuZ2VzRWxlbWVudCBleHRlbmRzIE9ERkVsZW1lbnQgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0FFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvQUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Yjk1ZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvQUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkRyYXdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5PZmZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLmltcGwuSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuQUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuQm9va21hcmtFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlRleHRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnhsaW5rLlhMaW5rQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC54cGF0aC5YUGF0aFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotY2xhc3MgQUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBBRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODg0MTI5ODcxODE4MjkzODU3TDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhQYXRoU2VydmljZSB4cGF0aFNlcnZpY2UgPSBYUGF0aFNlcnZpY2VGYWN0b3J5Ci0JCQkubmV3U2VydmljZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBFWFAxID0geHBhdGhTZXJ2aWNlCi0JCQkuY29tcGlsZSgiLi8vKltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJKyBUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJKyBUZXh0Q29uc3RhbnRzLkVMRU1FTlRfSCArICInXSIKLQkJCQkJKyAiW3BhcmVudDo6KltuYW1lc3BhY2UtdXJpKCkhPSciCi0JCQkJCSsgVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkkgKyAiJyBvciBsb2NhbC1uYW1lKCkhPSciCi0JCQkJCSsgVGV4dENvbnN0YW50cy5FTEVNRU5UX0xJU1RfSVRFTSArICInXVtuYW1lc3BhY2UtdXJpKCkhPSciCi0JCQkJCSsgVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkkgKyAiJyBvciBsb2NhbC1uYW1lKCkhPSciCi0JCQkJCSsgVGV4dENvbnN0YW50cy5FTEVNRU5UX0xJU1RfSEVBREVSICsgIiddXSIpOwotCi0JcHJvdGVjdGVkIEFFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck9mZmljZVRpdGxlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJLAotCQkJCU9mZmljZUNvbnN0YW50cy5BVFRSX1RJVExFKSkKLQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhPZmZpY2VDb25zdGFudHMuT0ZGSUNFX05BTUVTUEFDRV9VUkksCi0JCQkJCU9mZmljZUNvbnN0YW50cy5BVFRSX1RJVExFKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX1RZUEUpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfVFlQRSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGVuYW1lKSB7Ci0JCXNldEF0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJWExpbmtDb25zdGFudHMuQVRUUl9UWVBFLCB0eXBlbmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIcmVmKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoWExpbmtDb25zdGFudHMuWExJTktfTkFNRVNQQUNFX1VSSSwKLQkJCQlYTGlua0NvbnN0YW50cy5BVFRSX0hSRUYpKQotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFhMaW5rQ29uc3RhbnRzLlhMSU5LX05BTUVTUEFDRV9VUkksCi0JCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfSFJFRik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIHVybCkgewotCQlzZXRBdHRyaWJ1dGVOUyhYTGlua0NvbnN0YW50cy5YTElOS19OQU1FU1BBQ0VfVVJJLAotCQkJCVhMaW5rQ29uc3RhbnRzLkFUVFJfSFJFRiwgdXJsKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUZXh0Q29udGVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCBkYXRhKSB7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQl0aGlzLnNldFRleHRDb250ZW50KChTdHJpbmcpIGRhdGEpOwotCQl9IGVsc2UgewotCQkJbmV3IE9ERkV4Y2VwdGlvbigiaW52YWxpZCBvYmplY3QgZm9yIHRleHQ6YSBzZXRWYWx1ZSBmdW5jdGlvbi4iKQotCQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnQoSUVkaXRhYmxlIGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVkaXRMaXN0ZW5lcihJRWRpdExpc3RlbmVyIG9ic2VydmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVkaXRMaXN0ZW5lcihJRWRpdExpc3RlbmVyIG9ic2VydmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCkgewotCQlyZXR1cm4gSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbC5nZXRDb250ZW50U2l6ZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIElUZXh0RWxlbWVudENvbnRhaW5lclV0aWwuZ2V0Q2hpbGRJdGVyYXRvcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEludGVybmFsIGxpbmsgbGl0ZXJhbCBpcyBub3QgZGVmaW5lZCBpbiBPREYgc3BlYy4gVGhpcyBmdW5jdGlvbiBtaWdodCBub3QKLQkgKiBiZSBjb21wYXRpYmxlIHdpdGggT3Blbk9mZmljZS4KLQkgKi8KLQlwdWJsaWMgT0RGRWxlbWVudCBnZXRIcmVmRWxlbWVudCgpIHsKLQkJU3RyaW5nIHR5cGUgPSBnZXRUeXBlKCk7Ci0JCWlmIChYTGlua0NvbnN0YW50cy5MSU5LX1RZUEVfU0lNUExFLmVxdWFscyh0eXBlKSkgewotCQkJU3RyaW5nIGhyZWYgPSBnZXRIcmVmKCk7Ci0JCQlpZiAoKGhyZWYuc3RhcnRzV2l0aCgiIyIpKSAmJiAoaHJlZi5lbmRzV2l0aCgifG91dGxpbmUiKSkpIHsgLy8gbGluawotCQkJCS8vIGZvcgotCQkJCS8vIGhlYWRlcgotCQkJCVN0cmluZyBvdXRsaW5lQ29udGVudHMgPSBocmVmLnN1YnN0cmluZygxLCBocmVmLmxlbmd0aCgpIC0gOCk7Ci0JCQkJLy8gY2FsY3VsYXRlIGxpc3QgbGV2ZWwgb2YgaGVhZGluZyBlbGVtZW50Ci0JCQkJLy8gaWYgbGV2ZWw9PTEsIGl0IGlzIG5vdCBpbmNsdWRlZCB3aXRoaW4gbGlzdCBzdHJ1Y3R1cmUKLQkJCQlpbnQgbGV2ZWwgPSAwOwotCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCWludCBpbmRleEVuZFBvcyA9IG91dGxpbmVDb250ZW50cy5pbmRleE9mKCcuJyk7Ci0JCQkJCWlmIChpbmRleEVuZFBvcyA9PSAtMSkKLQkJCQkJCWJyZWFrOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHByZWZpeG51bSA9IG91dGxpbmVDb250ZW50cy5zdWJzdHJpbmcoMCwKLQkJCQkJCQkJaW5kZXhFbmRQb3MpOwotCQkJCQkJbmV3IEludGVnZXIocHJlZml4bnVtKS5pbnRWYWx1ZSgpOwotCQkJCQkJb3V0bGluZUNvbnRlbnRzID0gb3V0bGluZUNvbnRlbnRzLnN1YnN0cmluZygyKS50cmltKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlsZXZlbCsrOwotCQkJCX0KLQotCQkJCS8vIHNlYXJjaCBoZWFkaW5nIGVsZW1lbnQgZnJvbSBsaXN0IHN0cnVjdHVyZSwgaWYgbGlzdCBsZXZlbCBpcwotCQkJCS8vIG1vcmUgdGhhbiAxCi0JCQkJaWYgKGxldmVsID4gMSkgewotCQkJCQlOb2RlTGlzdCBubCA9IHhwYXRoU2VydmljZS5ldmFsUGF0aEZvck5vZGVMaXN0KAotCQkJCQkJCSIuLy8qW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkJCQkJKyBUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSQotCQkJCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciCi0JCQkJCQkJCQkrIFRleHRDb25zdGFudHMuRUxFTUVOVF9ICi0JCQkJCQkJCQkrICInXVthdHRyaWJ1dGU6OipbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCQkJCQkrIFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJCi0JCQkJCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJCQkJCSsgVGV4dENvbnN0YW50cy5BVFRSX09VVExJTkVfTEVWRUwgKyAiJ109JyIKLQkJCQkJCQkJCSsgbGV2ZWwgKyAiJ10iLCBnZXRPd25lckRvY3VtZW50KCkKLQkJCQkJCQkJCS5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCQkJCWlmIChubCAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCQlPREZFbGVtZW50IGVsZW0gPSAoT0RGRWxlbWVudCkgbmwuaXRlbShpKTsKLQkJCQkJCQlTdHJpbmcgY29udGVudCA9IGVsZW0uZ2V0VGV4dENvbnRlbnQoKTsKLQkJCQkJCQlpZiAoKGNvbnRlbnQgIT0gbnVsbCkKLQkJCQkJCQkJCSYmIChvdXRsaW5lQ29udGVudHMuZXF1YWxzKGNvbnRlbnQudHJpbSgpKSkpIHsKLQkJCQkJCQkJcmV0dXJuIGVsZW07Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2VhcmNoIGhlYWRpbmcgZWxlbWVudCBmcm9tIGhlYWRpbmcgZWxlbWVudHMgd2hpY2ggYXJlIG5vdAotCQkJCS8vIGluY2x1ZGVkIGluIGxpc3Qgc3RydWN0dXJlCi0JCQkJTm9kZUxpc3QgaEVsZW1MaXN0ID0geHBhdGhTZXJ2aWNlLmV2YWxGb3JOb2RlTGlzdChFWFAxLAotCQkJCQkJZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpKTsKLQkJCQlpbnQgaW5kZXhFbmRQb3MgPSBocmVmLmluZGV4T2YoJy4nKTsKLQkJCQlpZiAoaW5kZXhFbmRQb3MgIT0gLTEpIHsKLQkJCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJCW91dGxpbmVDb250ZW50cyA9IGhyZWYuc3Vic3RyaW5nKGluZGV4RW5kUG9zICsgMSwKLQkJCQkJCQlocmVmLmxlbmd0aCgpIC0gOCkudHJpbSgpOwotCQkJCQl0cnkgewotCQkJCQkJaW5kZXggPSBuZXcgSW50ZWdlcihocmVmLnN1YnN0cmluZygxLCBpbmRleEVuZFBvcykpCi0JCQkJCQkJCS5pbnRWYWx1ZSgpIC0gMTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJCWlmICgoaEVsZW1MaXN0ICE9IG51bGwpCi0JCQkJCQkJCSYmIChoRWxlbUxpc3QuZ2V0TGVuZ3RoKCkgPiBpbmRleCkpIHsKLQkJCQkJCQlPREZFbGVtZW50IGVsZW0gPSAoT0RGRWxlbWVudCkgaEVsZW1MaXN0Ci0JCQkJCQkJCQkuaXRlbShpbmRleCk7Ci0JCQkJCQkJU3RyaW5nIGNvbnRlbnQgPSBlbGVtLmdldFRleHRDb250ZW50KCk7Ci0JCQkJCQkJaWYgKChjb250ZW50ICE9IG51bGwpCi0JCQkJCQkJCQkmJiAob3V0bGluZUNvbnRlbnRzLmVxdWFscyhjb250ZW50LnRyaW0oKSkpKSB7Ci0JCQkJCQkJCXJldHVybiBlbGVtOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGlmIGhyZWYgVVJJIGRvZXMgbm90IHN0YXJ0IHdpdGggbnVtYmVyLCBvciBsaW5rIHRhcmdldCBjYW5ub3QKLQkJCQkvLyBiZSBmb3VuZCwKLQkJCQkvLyBzZWFyY2ggaGVhZGluZyBlbGVtZW50IGJ5IGl0cyB0ZXh0IGNvbnRlbnQKLQkJCQlvdXRsaW5lQ29udGVudHMgPSBocmVmLnN1YnN0cmluZygxLCBocmVmLmxlbmd0aCgpIC0gOCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoRWxlbUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlPREZFbGVtZW50IGVsZW0gPSAoT0RGRWxlbWVudCkgaEVsZW1MaXN0Lml0ZW0oaSk7Ci0JCQkJCVN0cmluZyBjb250ZW50ID0gZWxlbS5nZXRUZXh0Q29udGVudCgpOwotCQkJCQlpZiAoKGNvbnRlbnQgIT0gbnVsbCkKLQkJCQkJCQkmJiAob3V0bGluZUNvbnRlbnRzLmVxdWFscyhjb250ZW50LnRyaW0oKSkpKSB7Ci0JCQkJCQlyZXR1cm4gZWxlbTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoKGhyZWYuc3RhcnRzV2l0aCgiIyIpKSAmJiAoaHJlZi5lbmRzV2l0aCgifGdyYXBoaWMiKSkpIHsgLy8gbGluawotCQkJCS8vIGZvcgotCQkJCS8vIGdyYXBoaWMKLQkJCQkvLyBvYmplY3QKLQkJCQlTdHJpbmcgZHJhd05hbWUgPSBocmVmLnN1YnN0cmluZygxLCBocmVmLmxlbmd0aCgpIC0gOCk7Ci0JCQkJcmV0dXJuIGZpbmRFbGVtZW50QnlBdHRyVmFsdWUoRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCQlEcmF3Q29uc3RhbnRzLkVMRU1FTlRfRlJBTUUsCi0JCQkJCQlEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCURyYXdDb25zdGFudHMuQVRUUl9OQU1FLCBkcmF3TmFtZSk7Ci0JCQl9IGVsc2UgaWYgKChocmVmLnN0YXJ0c1dpdGgoIiMiKSkgJiYgKGhyZWYuZW5kc1dpdGgoInx0YWJsZSIpKSkgeyAvLyBsaW5rCi0JCQkJLy8gZm9yCi0JCQkJLy8gdGFibGUKLQkJCQlTdHJpbmcgdGFibGVOYW1lID0gaHJlZi5zdWJzdHJpbmcoMSwgaHJlZi5sZW5ndGgoKSAtIDYpOwotCQkJCXJldHVybiBmaW5kRWxlbWVudEJ5QXR0clZhbHVlKAotCQkJCQkJVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCVRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEUsCi0JCQkJCQlUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9OQU1FLCB0YWJsZU5hbWUpOwotCQkJfSBlbHNlIGlmICgoaHJlZi5zdGFydHNXaXRoKCIjIikpICYmIChocmVmLmVuZHNXaXRoKCJ8ZnJhbWUiKSkpIHsgLy8gbGluawotCQkJCS8vIGZvcgotCQkJCS8vIGZyYW1lCi0JCQkJU3RyaW5nIGZyYW1lTmFtZSA9IGhyZWYuc3Vic3RyaW5nKDEsIGhyZWYubGVuZ3RoKCkgLSA2KTsKLQkJCQlyZXR1cm4gZmluZEVsZW1lbnRCeUF0dHJWYWx1ZShEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCURyYXdDb25zdGFudHMuRUxFTUVOVF9GUkFNRSwKLQkJCQkJCURyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQkJRHJhd0NvbnN0YW50cy5BVFRSX05BTUUsIGZyYW1lTmFtZSk7Ci0JCQl9IGVsc2UgaWYgKChocmVmLnN0YXJ0c1dpdGgoIiMiKSkgJiYgKGhyZWYuZW5kc1dpdGgoInxvbGUiKSkpIHsgLy8gbGluawotCQkJCS8vIGZvcgotCQkJCS8vIE9MRQotCQkJCS8vIG9iamVjdAotCQkJCVN0cmluZyBvbGVOYW1lID0gaHJlZi5zdWJzdHJpbmcoMSwgaHJlZi5sZW5ndGgoKSAtIDQpOwotCQkJCXJldHVybiBmaW5kRWxlbWVudEJ5QXR0clZhbHVlKERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLAotCQkJCQkJRHJhd0NvbnN0YW50cy5FTEVNRU5UX0ZSQU1FLAotCQkJCQkJRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJCQlEcmF3Q29uc3RhbnRzLkFUVFJfTkFNRSwgb2xlTmFtZSk7Ci0JCQl9IGVsc2UgaWYgKChocmVmLnN0YXJ0c1dpdGgoIiMiKSkgJiYgKGhyZWYuZW5kc1dpdGgoInxyZWdpb24iKSkpIHsgLy8gbGluawotCQkJCS8vIGZvcgotCQkJCS8vIHNlY3Rpb24sCi0JCQkJLy8gb3IKLQkJCQkvLyB0YWJsZQotCQkJCS8vIG9mCi0JCQkJLy8gY29udGVudHMKLQkJCQlTdHJpbmcgcmVnaW9uTmFtZSA9IGhyZWYuc3Vic3RyaW5nKDEsIGhyZWYubGVuZ3RoKCkgLSA3KTsKLQkJCQlPREZFbGVtZW50IGVsZW0gPSBmaW5kRWxlbWVudEJ5QXR0clZhbHVlKAotCQkJCQkJVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCQlUZXh0Q29uc3RhbnRzLkVMRU1FTlRfU0VDVElPTiwKLQkJCQkJCVRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJVGV4dENvbnN0YW50cy5BVFRSX05BTUUsIHJlZ2lvbk5hbWUpOwotCQkJCWlmIChlbGVtICE9IG51bGwpCi0JCQkJCXJldHVybiBlbGVtOwotCQkJCWVsZW0gPSBmaW5kRWxlbWVudEJ5QXR0clZhbHVlKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJVGV4dENvbnN0YW50cy5FTEVNRU5UX1RBQkxFX09GX0NPTlRFTlQsCi0JCQkJCQlUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCVRleHRDb25zdGFudHMuQVRUUl9OQU1FLCByZWdpb25OYW1lKTsKLQkJCQlpZiAoZWxlbSAhPSBudWxsKQotCQkJCQlyZXR1cm4gZWxlbTsKLQkJCQllbGVtID0gZmluZEVsZW1lbnRCeUF0dHJWYWx1ZShUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCVRleHRDb25zdGFudHMuRUxFTUVOVF9JTkRFWF9USVRMRSwKLQkJCQkJCVRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJVGV4dENvbnN0YW50cy5BVFRSX05BTUUsIHJlZ2lvbk5hbWUpOwotCQkJCWlmIChlbGVtICE9IG51bGwpCi0JCQkJCXJldHVybiBlbGVtOwotCQkJfSBlbHNlIGlmIChocmVmLnN0YXJ0c1dpdGgoIiMiKSkgeyAvLyBsaW5rIGZvciBib29rbWFyawotCQkJCVN0cmluZyBib29rbWFya05hbWUgPSBocmVmLnN1YnN0cmluZygxKTsKLQkJCQlPREZFbGVtZW50IGVsZW0gPSBmaW5kRWxlbWVudEJ5QXR0clZhbHVlKAotCQkJCQkJVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCQlUZXh0Q29uc3RhbnRzLkVMRU1FTlRfQk9PS01BUkssCi0JCQkJCQlUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCVRleHRDb25zdGFudHMuQVRUUl9OQU1FLCBib29rbWFya05hbWUpOwotCQkJCWlmIChlbGVtIGluc3RhbmNlb2YgQm9va21hcmtFbGVtZW50KQotCQkJCQlyZXR1cm4gZWxlbTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvQWxwaGFiZXRpY2FsSW5kZXhFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvQWxwaGFiZXRpY2FsSW5kZXhFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjMxMGEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0FscGhhYmV0aWNhbEluZGV4RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LkFscGhhYmV0aWNhbEluZGV4RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIEFscGhhYmV0aWNhbEluZGV4RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUFscGhhYmV0aWNhbEluZGV4RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjU3NTE0ODE3OTEwNTE1NTkwNEw7Ci0KLQlwcm90ZWN0ZWQgQWxwaGFiZXRpY2FsSW5kZXhFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEl0ZXJhdG9yKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9BbHBoYWJldGljYWxJbmRleFNvdXJjZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9BbHBoYWJldGljYWxJbmRleFNvdXJjZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2N2QzYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvQWxwaGFiZXRpY2FsSW5kZXhTb3VyY2VFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGFibGVPZkNvbnRlbnRTb3VyY2VFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgQWxwaGFiZXRpY2FsSW5kZXhTb3VyY2VFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGFibGVPZkNvbnRlbnRTb3VyY2VFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4ODU4ODkxMzU0NTcyMjU0MzM4TDsKLQotCXByb3RlY3RlZCBBbHBoYWJldGljYWxJbmRleFNvdXJjZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywKLQkJCUVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9Cb29rbWFya0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9Cb29rbWFya0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4OTU2YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvQm9va21hcmtFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuQm9va21hcmtFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgQm9va21hcmtFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgQm9va21hcmtFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4NDIzMzQ4MDg0NjA2NjA0NDQyTDsKLQotCXByb3RlY3RlZCBCb29rbWFya0VsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0NoYW5nZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9DaGFuZ2VFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRkMzg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0NoYW5nZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5DaGFuZ2VFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgQ2hhbmdlRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIENoYW5nZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkyMTQ2NzMzMTUxODE5OTQ5OUw7Ci0KLQlwdWJsaWMgQ2hhbmdlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGlFbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgaUVsZW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0NoYW5nZUVuZEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9DaGFuZ2VFbmRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGMzNjQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0NoYW5nZUVuZEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5DaGFuZ2VTdGFydEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBDaGFuZ2VFbmRFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgQ2hhbmdlU3RhcnRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTUyMzYzMzk5NjUwNjAyNzcwTDsKLQotCXB1YmxpYyBDaGFuZ2VFbmRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgaUVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBpRWxlbWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvQ2hhbmdlU3RhcnRFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvQ2hhbmdlU3RhcnRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzkzNmY4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0NoYW5nZVN0YXJ0RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LkNoYW5nZVN0YXJ0RWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIENoYW5nZVN0YXJ0RWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUNoYW5nZVN0YXJ0RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzkzNjY3NjE3NTM1OTAzMzk4OEw7Ci0KLQlwdWJsaWMgQ2hhbmdlU3RhcnRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgaUVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBpRWxlbWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvSEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9IRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1YzAyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9IRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnJhbmdlLmltcGwuSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5IRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UZXh0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgSEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEhFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjc2Mzk1MzUxNDEzNjA1MjUxMEw7Ci0KLQlwcm90ZWN0ZWQgSEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdHRyVGV4dE91dGxpbmVMZXZlbCgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCVRleHRDb25zdGFudHMuQVRUUl9PVVRMSU5FX0xFVkVMKSkKLQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUyhUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGV4dENvbnN0YW50cy5BVFRSX09VVExJTkVfTEVWRUwpKS5pbnRWYWx1ZSgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QXR0clRleHRSZXN0YXJ0TnVtYmVyaW5nKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJVGV4dENvbnN0YW50cy5BVFRSX1JFU1RBUlRfTlVNQkVSSU5HKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbihnZXRBdHRyaWJ1dGVOUyhUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGV4dENvbnN0YW50cy5BVFRSX1JFU1RBUlRfTlVNQkVSSU5HKSkuYm9vbGVhblZhbHVlKCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJUZXh0U3RhcnRWYWx1ZSgpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCVRleHRDb25zdGFudHMuQVRUUl9TVEFSVF9WQUxVRSkpCi0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCVRleHRDb25zdGFudHMuQVRUUl9TVEFSVF9WQUxVRSkpLmludFZhbHVlKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRBdHRyVGV4dElzTGlzdEhlYWRlcigpIHsKLQkJaWYgKGhhc0F0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCVRleHRDb25zdGFudHMuQVRUUl9JU19MSVNUX0hFQURFUikpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZ2V0QXR0cmlidXRlTlMoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCVRleHRDb25zdGFudHMuQVRUUl9JU19MSVNUX0hFQURFUikpLmJvb2xlYW5WYWx1ZSgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGV4dENvbnRlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgZGF0YSkgewotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdGhpcy5zZXRUZXh0Q29udGVudCgoU3RyaW5nKSBkYXRhKTsKLQkJfSBlbHNlIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oImludmFsaWQgb2JqZWN0IGZvciB0ZXh0Omggc2V0VmFsdWUgZnVuY3Rpb24uIikKLQkJCQkJLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnQoSUVkaXRhYmxlIGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRWRpdExpc3RlbmVyKElFZGl0TGlzdGVuZXIgb2JzZXJ2ZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCkgewotCQlyZXR1cm4gSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbC5nZXRDb250ZW50U2l6ZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIElUZXh0RWxlbWVudENvbnRhaW5lclV0aWwuZ2V0Q2hpbGRJdGVyYXRvcih0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvSW5kZXhCb2R5RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0luZGV4Qm9keUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjIyOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvSW5kZXhCb2R5RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LkluZGV4Qm9keUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBJbmRleEJvZHlFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgSW5kZXhCb2R5RWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgwODk0NzY3NTcwMDM1NDIyNUw7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhCb2R5RWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50U2l6ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvSW5kZXhUaXRsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9JbmRleFRpdGxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZmMjljNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9JbmRleFRpdGxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LkluZGV4VGl0bGVFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgSW5kZXhUaXRsZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cyBJbmRleFRpdGxlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzkyMTg2NDgyODE0Mzg3NTQ2M0w7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhUaXRsZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0Q29udGVudFNpemUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkSXRlcmF0b3IoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwM2I4MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RJdGVtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5MaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RTdHlsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC54cGF0aC5YUGF0aFNlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotY2xhc3MgTGlzdEVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIExpc3RFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTgxNjA3MzM2MTkyMTU2OTYwNkw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBYUGF0aFNlcnZpY2UgeHBhdGhTZXJ2aWNlID0gWFBhdGhTZXJ2aWNlRmFjdG9yeQotCQkJLm5ld1NlcnZpY2UoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgRVhQMSA9IHhwYXRoU2VydmljZQotCQkJLmNvbXBpbGUoIi4vKltuYW1lc3BhY2UtdXJpKCk9JyIgKyBUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSQotCQkJCQkrICInIGFuZCBsb2NhbC1uYW1lKCk9J2xpc3QtaXRlbSddIik7Ci0KLQlwcm90ZWN0ZWQgTGlzdEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIHhwYXRoU2VydmljZS5ldmFsRm9yTm9kZUxpc3QoRVhQMSwgdGhpcykuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVtRWxlbWVudCBnZXRJdGVtKGxvbmcgaWR4KSB7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0geHBhdGhTZXJ2aWNlLmV2YWxQYXRoRm9yTm9kZUxpc3QoCi0JCQkJIi4vKltuYW1lc3BhY2UtdXJpKCk9JyIgKyBUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSQotCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSdsaXN0LWl0ZW0nXVsiICsgKGlkeCArIDEpICsgIl0iLAotCQkJCXRoaXMpOwotCQlpZiAoKG5vZGVMaXN0ICE9IG51bGwpICYmIChub2RlTGlzdC5nZXRMZW5ndGgoKSA9PSAxKQotCQkJCSYmIChub2RlTGlzdC5pdGVtKDApIGluc3RhbmNlb2YgTGlzdEl0ZW1FbGVtZW50KSkKLQkJCXJldHVybiAoTGlzdEl0ZW1FbGVtZW50KSBub2RlTGlzdC5pdGVtKDApOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3R5bGVFbGVtZW50IGdldFN0eWxlKCkgewotCQlMaXN0RWxlbWVudCB0b3BMZXZlbExpc3QgPSBnZXRUb3BMZXZlbExpc3RFbGVtZW50KCk7Ci0JCVN0cmluZyBzdHlsZU5hbWUgPSB0b3BMZXZlbExpc3QKLQkJCQkuZ2V0QXR0cmlidXRlTlMoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCQlUZXh0Q29uc3RhbnRzLkFUVFJfU1RZTEVfTkFNRSk7Ci0JCU9ERkVsZW1lbnQgZWxlbSA9IGZpbmRFbGVtZW50QnlBdHRyVmFsdWUoCi0JCQkJVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJVGV4dENvbnN0YW50cy5FTEVNRU5UX0xJU1RfU1RZTEUsCi0JCQkJU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwgU3R5bGVDb25zdGFudHMuQVRUUl9OQU1FLAotCQkJCXN0eWxlTmFtZSk7Ci0JCWlmICgoZWxlbSAhPSBudWxsKSAmJiAoZWxlbSBpbnN0YW5jZW9mIExpc3RTdHlsZUVsZW1lbnQpKQotCQkJcmV0dXJuIChTdHlsZUVsZW1lbnQpIGVsZW07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGVuZEl0ZW0oTGlzdEl0ZW1FbGVtZW50IGl0ZW0pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0QmVmb3JlKExpc3RJdGVtRWxlbWVudCBpdGVtLCBsb25nIGlkeCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50U2l6ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRMaXN0TGV2ZWwoKSB7Ci0JCWxvbmcgbGV2ZWwgPSAxOwotCQlMaXN0RWxlbWVudCB0b3BMaXN0RWxlbSA9IHRoaXM7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlOb2RlIHBhcmVudCA9IHRvcExpc3RFbGVtLmdldFBhcmVudE5vZGUoKTsKLQkJCU5vZGUgZ3BhcmVudCA9IG51bGw7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQkJZ3BhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgTGlzdEl0ZW1FbGVtZW50KQotCQkJCQkmJiAoZ3BhcmVudCAhPSBudWxsKSAmJiAoZ3BhcmVudCBpbnN0YW5jZW9mIExpc3RFbGVtZW50KSkgewotCQkJCXRvcExpc3RFbGVtID0gKExpc3RFbGVtZW50KSBncGFyZW50OwotCQkJCWxldmVsKys7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBsZXZlbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdEVsZW1lbnQgZ2V0VG9wTGV2ZWxMaXN0RWxlbWVudCgpIHsKLQkJTGlzdEVsZW1lbnQgdG9wTGlzdEVsZW0gPSB0aGlzOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJTm9kZSBwYXJlbnQgPSB0b3BMaXN0RWxlbS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlOb2RlIGdwYXJlbnQgPSBudWxsOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJCWdwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIExpc3RJdGVtRWxlbWVudCkKLQkJCQkJJiYgKGdwYXJlbnQgIT0gbnVsbCkgJiYgKGdwYXJlbnQgaW5zdGFuY2VvZiBMaXN0RWxlbWVudCkpIHsKLQkJCQl0b3BMaXN0RWxlbSA9IChMaXN0RWxlbWVudCkgZ3BhcmVudDsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRvcExpc3RFbGVtOwotCX0KLQotCXB1YmxpYyBTdHlsZUVsZW1lbnQgZ2V0TGlzdExldmVsU3R5bGVFbGVtZW50KCkgewotCQlsb25nIGxldmVsID0gZ2V0TGlzdExldmVsKCk7Ci0JCVN0eWxlRWxlbWVudCBzdHlsZSA9IGdldFN0eWxlKCk7Ci0JCWlmIChzdHlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gc3R5bGUuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgU3R5bGVFbGVtZW50KSB7Ci0JCQkJaWYgKChjaGlsZCBpbnN0YW5jZW9mIExpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudCkKLQkJCQkJCSYmICgoKExpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudCkgY2hpbGQpCi0JCQkJCQkJCS5nZXRBdHRyTGV2ZWwoKSA9PSBsZXZlbCkpIHsKLQkJCQkJcmV0dXJuIChTdHlsZUVsZW1lbnQpIGNoaWxkOwotCQkJCX0gZWxzZSBpZiAoKGNoaWxkIGluc3RhbmNlb2YgTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50KQotCQkJCQkJJiYgKCgoTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50KSBjaGlsZCkKLQkJCQkJCQkJLmdldEF0dHJMZXZlbCgpID09IGxldmVsKSkgewotCQkJCQlyZXR1cm4gKFN0eWxlRWxlbWVudCkgY2hpbGQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9MaXN0SGVhZGVyRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RIZWFkZXJFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDkxNGMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RIZWFkZXJFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5MaXN0SGVhZGVyRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIExpc3RIZWFkZXJFbGVtZW50SW1wbCBleHRlbmRzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlMaXN0SGVhZGVyRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzM5MTU5MTcyMjM1Mjg1OTgzMUw7Ci0KLQlwcm90ZWN0ZWQgTGlzdEhlYWRlckVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkSXRlcmF0b3IoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0Q29udGVudFNpemUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RJdGVtRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RJdGVtRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwMjFmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9MaXN0SXRlbUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RJdGVtRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIExpc3RJdGVtRWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTGlzdEl0ZW1FbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjM1NjMyNjA0NjcwMTIzMDE1TDsKLQotCXByb3RlY3RlZCBMaXN0SXRlbUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0Q29udGVudFNpemUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkSXRlcmF0b3IoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhMTdlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9MaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGwuU3R5bGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5MaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIExpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudEltcGwgZXh0ZW5kcyBTdHlsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTGlzdExldmVsU3R5bGVCdWxsZXRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTI4MDMwMDY5NjQwOTk5Nzg4Nkw7Ci0KLQlwcm90ZWN0ZWQgTGlzdExldmVsU3R5bGVCdWxsZXRFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsCi0JCQlFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIob2RmRG9jLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRBdHRyTGV2ZWwoKSB7Ci0JCXJldHVybiBuZXcgSW50ZWdlcihnZXRBdHRyaWJ1dGVOUyhUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQlUZXh0Q29uc3RhbnRzLkFUVFJfTEVWRUwpKS5pbnRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckJ1bGxldENoYXIoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0ckJ1bGxldENoYXIoU3RyaW5nIGNoYXJhY3RlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjg5ZDAyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RMZXZlbFN0eWxlTnVtYmVyRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGwuU3R5bGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5MaXN0TGV2ZWxTdHlsZU51bWJlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIExpc3RMZXZlbFN0eWxlTnVtYmVyRWxlbWVudEltcGwgZXh0ZW5kcyBTdHlsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxODg3MTA1Mzg5NDM0ODAzMjU2TDsKLQotCXByb3RlY3RlZCBMaXN0TGV2ZWxTdHlsZU51bWJlckVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywKLQkJCUVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBsb25nIGdldEF0dHJMZXZlbCgpIHsKLQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEF0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCVRleHRDb25zdGFudHMuQVRUUl9MRVZFTCkpLmludFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyTnVtRm9ybWF0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlTlMoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05VTV9GT1JNQVQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck51bVByZWZpeCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5TKFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuQVRUUl9OVU1fUFJFRklYKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOdW1TdWZmaXgoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVOUyhTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkFUVFJfTlVNX1NVRkZJWCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RTdHlsZUVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9MaXN0U3R5bGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzNkZDNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL0xpc3RTdHlsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLmltcGwuU3R5bGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5MaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuTGlzdFN0eWxlRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIExpc3RTdHlsZUVsZW1lbnRJbXBsIGV4dGVuZHMgU3R5bGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIExpc3RTdHlsZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDg4Mjk0Njc4OTI2Mzg0OTAwNThMOwotCi0JcHJvdGVjdGVkIExpc3RTdHlsZUVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0TGlzdExldmVsU3R5bGVCdWxsZXRTaXplKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBMaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnQgZ2V0TGlzdExldmVsU3R5bGVCdWxsZXQobG9uZyBpZHgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBlbmRMaXN0TGV2ZXJTdHlsZUJ1bGxldChMaXN0TGV2ZWxTdHlsZUJ1bGxldEVsZW1lbnQgZWxlbSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvUEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9QRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmZjhhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9QRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZTdHlsYWJsZUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5yYW5nZS5pbXBsLklUZXh0RWxlbWVudENvbnRhaW5lclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuUEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFBFbGVtZW50SW1wbCBleHRlbmRzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBQRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgwNDQ1NDIwNTMxODAzNDg2MDBMOwotCi0JcHJvdGVjdGVkIFBFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBTdHlsZUVsZW1lbnQgZ2V0U3R5bGUoKSB7Ci0JCVN0cmluZyBzdHlsZU5hbWUgPSBnZXRBdHRyaWJ1dGVOUyhUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQlUZXh0Q29uc3RhbnRzLkFUVFJfU1RZTEVfTkFNRSk7Ci0JCU9ERkVsZW1lbnQgc3R5bGUgPSBmaW5kRWxlbWVudEJ5QXR0clZhbHVlKAotCQkJCVN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuRUxFTUVOVF9TVFlMRSwKLQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLCBTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUsCi0JCQkJc3R5bGVOYW1lKTsKLQkJaWYgKChzdHlsZSAhPSBudWxsKSAmJiAoc3R5bGUgaW5zdGFuY2VvZiBTdHlsZUVsZW1lbnQpKQotCQkJcmV0dXJuIChTdHlsZUVsZW1lbnQpIHN0eWxlOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUZXh0Q29udGVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCBkYXRhKSB7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQl0aGlzLnNldFRleHRDb250ZW50KChTdHJpbmcpIGRhdGEpOwotCQl9IGVsc2UgewotCQkJbmV3IE9ERkV4Y2VwdGlvbigiaW52YWxpZCBvYmplY3QgZm9yIHRleHQ6cCBzZXRWYWx1ZSBmdW5jdGlvbi4iKQotCQkJCQkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydChJRWRpdGFibGUgZGF0YSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVkaXRMaXN0ZW5lcihJRWRpdExpc3RlbmVyIG9ic2VydmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRTaXplKCkgewotCQlyZXR1cm4gSVRleHRFbGVtZW50Q29udGFpbmVyVXRpbC5nZXRDb250ZW50U2l6ZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIElUZXh0RWxlbWVudENvbnRhaW5lclV0aWwuZ2V0Q2hpbGRJdGVyYXRvcih0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvUGFnZU51bWJlckVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9QYWdlTnVtYmVyRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE3NDZlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9QYWdlTnVtYmVyRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuUGFnZU51bWJlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBQYWdlTnVtYmVyRWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJUGFnZU51bWJlckVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYwNjQ2ODM5MjAwNjg4MTI4NDdMOwotCi0JcHJvdGVjdGVkIFBhZ2VOdW1iZXJFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9TRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1NFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OThmMzk3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1NFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuU0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMgU0VsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE4NjUyNDM0MjgwMTY0NjAzNjhMOwotCi0JcHJvdGVjdGVkIFNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0clRleHRDKCkgewotCQlpZiAoaGFzQXR0cmlidXRlTlMoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJVGV4dENvbnN0YW50cy5BVFRSX0MpKQotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEF0dHJpYnV0ZU5TKFRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUZXh0Q29uc3RhbnRzLkFUVFJfQykpLmludFZhbHVlKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvU2VjdGlvbkVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9TZWN0aW9uRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkYjMyNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9TZWN0aW9uRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5pbXBsLk9ERlN0eWxhYmxlRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuU2VjdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBTZWN0aW9uRWxlbWVudEltcGwgZXh0ZW5kcyBPREZTdHlsYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJU2VjdGlvbkVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY3OTg4MTg5ODU4NDE3OTY1NDRMOwotCi0JcHJvdGVjdGVkIFNlY3Rpb25FbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVkaXRMaXN0ZW5lcihJRWRpdExpc3RlbmVyIG9ic2VydmVyLCBTdHJpbmcgdG9waWMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnQoSUVkaXRhYmxlIGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCBkYXRhKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRJdGVyYXRvcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50U2l6ZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gMDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvU2VxdWVuY2VFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvU2VxdWVuY2VFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmM2MWMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1NlcXVlbmNlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklFZGl0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5TZXF1ZW5jZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBTZXF1ZW5jZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGU3R5bGFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVNlcXVlbmNlRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTQ3NTkyOTA2NjUzNDAyMTUxNUw7Ci0KLQlwcm90ZWN0ZWQgU2VxdWVuY2VFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFRleHRDb250ZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IGRhdGEpIHsKLQkJLy8gVE9ETyB2YWxpZGF0ZSBzdHlsZTpudW0tZm9ybWF0IGF0dHJpYnV0ZQotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJdGhpcy5zZXRUZXh0Q29udGVudCgoU3RyaW5nKSBkYXRhKTsKLQkJfSBlbHNlIHsKLQkJCW5ldyBPREZFeGNlcHRpb24oImludmFsaWQgb2JqZWN0IGZvciB0ZXh0OnAgc2V0VmFsdWUgZnVuY3Rpb24uIikKLQkJCQkJLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnQoSUVkaXRhYmxlIGRhdGEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRWRpdExpc3RlbmVyKElFZGl0TGlzdGVuZXIgb2JzZXJ2ZXIsIFN0cmluZyB0b3BpYykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFZGl0TGlzdGVuZXIoSUVkaXRMaXN0ZW5lciBvYnNlcnZlciwgU3RyaW5nIHRvcGljKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9TcGFuRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1NwYW5FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGY3M2VlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1NwYW5FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGU3R5bGFibGVFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5TcGFuRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLWNsYXNzIFNwYW5FbGVtZW50SW1wbCBleHRlbmRzIE9ERlN0eWxhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBTcGFuRWxlbWVudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMyMTkxNjEyMzY2NTQ4NDYzNjFMOwotCi0JcHJvdGVjdGVkIFNwYW5FbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9UYWJFbGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvVGFiRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyNDNjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9UYWJFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGFiRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UZXh0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgVGFiRWxlbWVudEltcGwgZXh0ZW5kcyBPREZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRhYkVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00MjgwOTYzMzk4ODYwODgwMTk5TDsKLQotCXByb3RlY3RlZCBUYWJFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0clRleHRUYWJSZWYoKSB7Ci0JCWlmIChoYXNBdHRyaWJ1dGVOUyhUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQlUZXh0Q29uc3RhbnRzLkFUVFJfVEFCX1JFRikpCi0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0QXR0cmlidXRlTlMoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCVRleHRDb25zdGFudHMuQVRUUl9UQUJfUkVGKSkuaW50VmFsdWUoKTsKLQkJcmV0dXJuIC0xOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9UYWJsZU9mQ29udGVudEVsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9UYWJsZU9mQ29udGVudEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODc4YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvVGFibGVPZkNvbnRlbnRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGFibGVPZkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgVGFibGVPZkNvbnRlbnRFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGFibGVPZkNvbnRlbnRFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyODgyNDg1MjY4NTU5NDEwMzQyTDsKLQotCXByb3RlY3RlZCBUYWJsZU9mQ29udGVudEVsZW1lbnRJbXBsKE9ERkRvY3VtZW50IG9kZkRvYywgRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0Q29udGVudFNpemUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldENoaWxkSXRlcmF0b3IoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1RhYmxlT2ZDb250ZW50U291cmNlRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1RhYmxlT2ZDb250ZW50U291cmNlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUxYTlmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9UYWJsZU9mQ29udGVudFNvdXJjZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UYWJsZU9mQ29udGVudFNvdXJjZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1jbGFzcyBUYWJsZU9mQ29udGVudFNvdXJjZUVsZW1lbnRJbXBsIGV4dGVuZHMgT0RGRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlUYWJsZU9mQ29udGVudFNvdXJjZUVsZW1lbnQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDg4NTg4OTEzNTQ1NzIyNTQzMzhMOwotCi0JcHJvdGVjdGVkIFRhYmxlT2ZDb250ZW50U291cmNlRWxlbWVudEltcGwoT0RGRG9jdW1lbnQgb2RmRG9jLAotCQkJRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKG9kZkRvYywgZWxlbWVudCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdGV4dC9pbXBsL1RleHROb2RlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvVGV4dE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYTQ4MmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvVGV4dE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5BYnN0cmFjdE9ERk5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlRleHRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgVGV4dE5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPREZOb2RlRmFjdG9yeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M+IHRhZ01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0KLQlzdGF0aWMgewotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9BLCBBRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9BTFBIQUJFVElDQUxfSU5ERVgsCi0JCQkJQWxwaGFiZXRpY2FsSW5kZXhFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX0FMUEhBQkVUSUNBTF9JTkRFWF9TT1VSQ0UsCi0JCQkJQWxwaGFiZXRpY2FsSW5kZXhTb3VyY2VFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX0JPT0tNQVJLLCBCb29rbWFya0VsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUZXh0Q29uc3RhbnRzLkVMRU1FTlRfSCwgSEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwCi0JCQkJLnB1dChUZXh0Q29uc3RhbnRzLkVMRU1FTlRfSU5ERVhfQk9EWSwKLQkJCQkJCUluZGV4Qm9keUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUZXh0Q29uc3RhbnRzLkVMRU1FTlRfSU5ERVhfVElUTEUsCi0JCQkJSW5kZXhUaXRsZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUZXh0Q29uc3RhbnRzLkVMRU1FTlRfTElTVCwgTGlzdEVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUZXh0Q29uc3RhbnRzLkVMRU1FTlRfTElTVF9JVEVNLCBMaXN0SXRlbUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUZXh0Q29uc3RhbnRzLkVMRU1FTlRfTElTVF9MRVZFTF9TVFlMRV9CVUxMRVQsCi0JCQkJTGlzdExldmVsU3R5bGVCdWxsZXRFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX0xJU1RfTEVWRUxfU1RZTEVfTlVNQkVSLAotCQkJCUxpc3RMZXZlbFN0eWxlTnVtYmVyRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAKLQkJCQkucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9MSVNUX1NUWUxFLAotCQkJCQkJTGlzdFN0eWxlRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9MSVNUX0hFQURFUiwKLQkJCQlMaXN0SGVhZGVyRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9QLCBQRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9TLCBTRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9TRUNUSU9OLCBTZWN0aW9uRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9TRVFVRU5DRSwgU2VxdWVuY2VFbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX1NQQU4sIFNwYW5FbGVtZW50SW1wbC5jbGFzcyk7Ci0JCXRhZ01hcC5wdXQoVGV4dENvbnN0YW50cy5FTEVNRU5UX1RBQiwgVGFiRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9PRl9DT05URU5ULAotCQkJCVRhYmxlT2ZDb250ZW50RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9PRl9DT05URU5UX1NPVVJDRSwKLQkJCQlUYWJsZU9mQ29udGVudFNvdXJjZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUZXh0Q29uc3RhbnRzLkVMRU1FTlRfVFJBQ0tFRF9DSEFOR0VTLAotCQkJCVRyYWNrZWRDaGFuZ2VzRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9DSEFOR0UsIENoYW5nZUVsZW1lbnRJbXBsLmNsYXNzKTsKLQkJdGFnTWFwLnB1dChUZXh0Q29uc3RhbnRzLkVMRU1FTlRfQ0hBTkdFX1NUQVJULAotCQkJCUNoYW5nZVN0YXJ0RWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAKLQkJCQkucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9DSEFOR0VfRU5ELAotCQkJCQkJQ2hhbmdlRW5kRWxlbWVudEltcGwuY2xhc3MpOwotCQl0YWdNYXAucHV0KFRleHRDb25zdGFudHMuRUxFTUVOVF9QQUdFX05VTUJFUiwKLQkJCQlQYWdlTnVtYmVyRWxlbWVudEltcGwuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KE9ERkRvY3VtZW50IG9kZkRvYywgU3RyaW5nIHRhZ05hbWUsCi0JCQlFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ2xhc3MgY3MgPSAoQ2xhc3MpIHRhZ01hcC5nZXQodGFnTmFtZSk7Ci0JCWlmIChudWxsID09IGNzKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gKEVsZW1lbnQpIGZpbmRFbGVtZW50Q29uc3RyYWN0b3IoY3MpLm5ld0luc3RhbmNlKAotCQkJCQluZXcgT2JqZWN0W10geyBvZGZEb2MsIGVsZW1lbnQgfSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9UcmFja2VkQ2hhbmdlc0VsZW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3RleHQvaW1wbC9UcmFja2VkQ2hhbmdlc0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMGEzN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi90ZXh0L2ltcGwvVHJhY2tlZENoYW5nZXNFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLmltcGwuT0RGRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVHJhY2tlZENoYW5nZXNFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotY2xhc3MgVHJhY2tlZENoYW5nZXNFbGVtZW50SW1wbCBleHRlbmRzIE9ERkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVHJhY2tlZENoYW5nZXNFbGVtZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODg2NDk0MDk0OTk3NTUwNDAzN0w7Ci0KLQlwcm90ZWN0ZWQgVHJhY2tlZENoYW5nZXNFbGVtZW50SW1wbChPREZEb2N1bWVudCBvZGZEb2MsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihvZGZEb2MsIGVsZW1lbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvT0RGRmlsZVV0aWxzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvT0RGRmlsZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOWUyZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL09ERkZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHMuQ29udGVudFR5cGU7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB1c2VkIGJ5IE9ERiBmaWxlIHJlYWQgYW5kIHdyaXRlIGNsYXNzZXMKLSAqLwotcHVibGljIGNsYXNzIE9ERkZpbGVVdGlscyB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzT0RGRmlsZShTdHJpbmcgc1VybCkgewotCQlpZiAoc1VybCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBzVXJsLmVuZHNXaXRoKE9ERkNvbnN0YW50cy5PRFRfU1VGRklYKQotCQkJCXx8IHNVcmwuZW5kc1dpdGgoT0RGQ29uc3RhbnRzLk9EU19TVUZGSVgpCi0JCQkJfHwgc1VybC5lbmRzV2l0aChPREZDb25zdGFudHMuT0RQX1NVRkZJWCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50VHlwZSBnZXRPREZGaWxlVHlwZShTdHJpbmcgc1VybCkgewotCQlpZiAoc1VybCA9PSBudWxsKQotCQkJcmV0dXJuIENvbnRlbnRUeXBlLk5PTkU7Ci0KLQkJaWYgKHNVcmwuZW5kc1dpdGgoT0RGQ29uc3RhbnRzLk9EVF9TVUZGSVgpKQotCQkJcmV0dXJuIENvbnRlbnRUeXBlLldSSVRFOwotCQllbHNlIGlmIChzVXJsLmVuZHNXaXRoKE9ERkNvbnN0YW50cy5PRFNfU1VGRklYKSkKLQkJCXJldHVybiBDb250ZW50VHlwZS5TUFJFQURTSEVFVDsKLQkJZWxzZSBpZiAoc1VybC5lbmRzV2l0aChPREZDb25zdGFudHMuT0RQX1NVRkZJWCkpCi0JCQlyZXR1cm4gQ29udGVudFR5cGUuUFJFU0VOVEFUSU9OOwotCi0JCXJldHVybiBDb250ZW50VHlwZS5OT05FOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9PREZXcml0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9PREZXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5ZmFhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvT0RGV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5vZGYuT2RmUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIHNhdmUgT0RGIGRvY3VtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBPREZXcml0ZXIgewotCXByaXZhdGUgdm9pZCBhZGRGaWxlVG9aaXAoWmlwT3V0cHV0U3RyZWFtIHpvcywgU3RyaW5nIGlucHV0RGlyLCBGaWxlIGZpbGUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZyBlbnRyeSA9IGZpbGUuZ2V0UGF0aCgpOwotCQkJZW50cnkgPSBlbnRyeS5zdWJzdHJpbmcoaW5wdXREaXIubGVuZ3RoKCkgKyAxKTsKLQkJCWVudHJ5ID0gZW50cnkucmVwbGFjZUFsbCgiXFxcXCIsICIvIik7Ci0JCQlaaXBFbnRyeSB0YXJnZXQgPSBuZXcgWmlwRW50cnkoZW50cnkgKyAiLyIpOwotCQkJdGFyZ2V0LnNldFNpemUoMCk7Ci0JCQl6b3MucHV0TmV4dEVudHJ5KHRhcmdldCk7Ci0JCQl6b3MuY2xvc2VFbnRyeSgpOwotCi0JCQlGaWxlW10gZmlsZUxpc3QgPSBmaWxlLmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5sZW5ndGg7IGkrKykgewotCQkJCWFkZEZpbGVUb1ppcCh6b3MsIGlucHV0RGlyLCBmaWxlTGlzdFtpXSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAotCQkJCQluZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLQkJCVN0cmluZyBlbnRyeSA9IGZpbGUuZ2V0UGF0aCgpOwotCQkJZW50cnkgPSBlbnRyeS5zdWJzdHJpbmcoaW5wdXREaXIubGVuZ3RoKCkgKyAxKTsKLQkJCWVudHJ5ID0gZW50cnkucmVwbGFjZUFsbCgiXFxcXCIsICIvIik7Ci0JCQlaaXBFbnRyeSB0YXJnZXQgPSBuZXcgWmlwRW50cnkoZW50cnkpOwotCQkJem9zLnB1dE5leHRFbnRyeSh0YXJnZXQpOwotCQkJYnl0ZSBidWZbXSA9IG5ldyBieXRlWzEwMjRdOwotCQkJaW50IGNvdW50OwotCQkJd2hpbGUgKChjb3VudCA9IGJpcy5yZWFkKGJ1ZiwgMCwgMTAyNCkpICE9IC0xKSB7Ci0JCQkJem9zLndyaXRlKGJ1ZiwgMCwgY291bnQpOwotCQkJfQotCQkJYmlzLmNsb3NlKCk7Ci0JCQl6b3MuY2xvc2VFbnRyeSgpOwotCQl9Ci0JfQotCi0JcHVibGljIExpc3Q8U3RyaW5nPiB1bnppcE9ERkZpbGUoU3RyaW5nIG9kZk5hbWUsIFN0cmluZyBvdXRwdXREaXIpIHsKLQkJTGlzdDxTdHJpbmc+IG91dHB1dEZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVppcElucHV0U3RyZWFtIHppcyA9IG51bGw7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLQkJCi0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTChvZGZOYW1lKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCXppcyA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKHVybC50b1VSSSgpKSkpOwotCQkJfSBlbHNlIHsJCQkKLQkJCQl6aXMgPSBuZXcgWmlwSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShvZGZOYW1lKSk7Ci0JCQl9Ci0JCQlaaXBFbnRyeSB6ZW50ID0gbnVsbDsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7Ci0JCQl3aGlsZSAoKHplbnQgPSB6aXMuZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLQkJCQlmaWxlTmFtZSA9IHplbnQuZ2V0TmFtZSgpOwotCQkJCWlmIChmaWxlTmFtZS5jb250YWlucygiLyIpKSB7Ci0JCQkJCWludCBsYXN0SW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZigiLyIpOwotCQkJCQlGaWxlIGRpciA9IG5ldyBGaWxlKG91dHB1dERpciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJKyBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KSk7Ci0JCQkJCWlmICghZGlyLmV4aXN0cygpKSB7Ci0JCQkJCQlkaXIubWtkaXJzKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFmaWxlTmFtZS5lbmRzV2l0aCgiLyIpKSB7Ci0JCQkJCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oemlzKTsKLQkJCQkJU3RyaW5nIG91dHB1dEZpbGUgPSBvdXRwdXREaXIgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lOwotCQkJCQlvdXRwdXRGaWxlTGlzdC5hZGQob3V0cHV0RmlsZSk7Ci0JCQkJCWZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOwotCQkJCQl0cnkgewotCQkJCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOwotCQkJCQkJaW50IHNpemU7Ci0JCQkJCQl3aGlsZSAoKHNpemUgPSBiaXMucmVhZChidWZmZXIpKSAhPSAtMSkgewotCQkJCQkJCWZvcy53cml0ZShidWZmZXIsIDAsIHNpemUpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJZm9zLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQl6aXMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvdXRwdXRGaWxlTGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVPREZGaWxlKFN0cmluZyBpbnB1dERpciwgU3RyaW5nIG91dHB1dE9ERk5hbWUpIHsKLQkJRmlsZSBpbnB1dERpckZpbGUgPSBuZXcgRmlsZShpbnB1dERpcik7Ci0JCWlmIChpbnB1dERpckZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJVVJMIHVybCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXVybCA9IG5ldyBVUkwob3V0cHV0T0RGTmFtZSk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJfQotCQkJCQkJCi0JCQl0cnkgewotCQkJCUZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCXppcEZpbGUgPSBuZXcgRmlsZSh1cmwudG9VUkkoKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJemlwRmlsZSA9IG5ldyBGaWxlKG91dHB1dE9ERk5hbWUpOwotCQkJCX0KLQkJCQkKLQkJCQlGaWxlW10gZmlsZUxpc3QgPSBpbnB1dERpckZpbGUubGlzdEZpbGVzKCk7Ci0JCQkJWmlwT3V0cHV0U3RyZWFtIHpvcyA9IG5ldyBaaXBPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oCXppcEZpbGUpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFkZEZpbGVUb1ppcCh6b3MsIGlucHV0RGlyLCBmaWxlTGlzdFtpXSk7Ci0JCQkJfQotCQkJCXpvcy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcm1EaXIoRmlsZSBkZWxldGVkRGlyKSB7Ci0JCUZpbGVbXSBmaWxlcyA9IGRlbGV0ZWREaXIubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghcm1EaXIoZmlsZXNbaV0pKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCXJldHVybiBkZWxldGVkRGlyLmRlbGV0ZSgpOwotCX0KLQotCS8qCi0JICogT0RGRG9jdW1lbnQgZG9jIC0tIG1vZGlmaWVkIGNvbnRlbnQueG1sIFN0cmluZyBvdXRGaWxlIC0tIG91dHB1dCBPREYgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVPREZGaWxlKE9ERkRvY3VtZW50IGRvYywgU3RyaW5nIG91dEZpbGUpIHsKLQkJU3RyaW5nIGluRmlsZSA9IGRvYy5nZXRVUkwoKTsKLQotCQkvLyBjcmVhdGUgdG1wIGRpcmVjdG9yeQotCQlJUGF0aCB0bXBEaXIgPSBPZGZQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoInRtcCIpOwotCQlGaWxlIHRtcERpckZpbGUgPSB0bXBEaXIudG9GaWxlKCk7Ci0JCXRtcERpckZpbGUubWtkaXIoKTsKLQkJU3RyaW5nIHRtcERpclBhdGggPSB0bXBEaXJGaWxlLmdldFBhdGgoKTsKLQotCQkvLyB1bnppcCBPREYgZmlsZQotCQlPREZXcml0ZXIgb2RmV3JpdGVyID0gbmV3IE9ERldyaXRlcigpOwotCQlvZGZXcml0ZXIudW56aXBPREZGaWxlKGluRmlsZSwgdG1wRGlyUGF0aCk7Ci0KLQkJLy8gc2F2ZSBjb250ZW50LnhtbAotCQl0cnkgewotCQkJRmlsZU91dHB1dFN0cmVhbSB3cml0ZXIgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBEaXJQYXRoCi0JCQkJCSsgU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpCi0JCQkJCSsgT0RGQ29uc3RhbnRzLk9ERl9DT05URU5UX0ZJTEVOQU1FKTsKLQkJCVRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jKTsKLQkJCVJlc3VsdCB0YXJnZXQgPSBuZXcgU3RyZWFtUmVzdWx0KHdyaXRlcik7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl0RmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShzb3VyY2UsIHRhcmdldCk7Ci0JCQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQkvLyBzYXZlIE9ERiBmaWxlCi0JCW9kZldyaXRlci5jcmVhdGVPREZGaWxlKHRtcERpclBhdGgsIG91dEZpbGUpOwotCi0JCS8vIHJlbW92ZSB0bXAgZGlyZWN0b3J5Ci0JCXJtRGlyKHRtcERpckZpbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlGaXhFbmdpbmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlGaXhFbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwZDFiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Rml4RW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuYWNjZXNzaWJpbGl0eTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkNvbnN0YW50cy5Db250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRHJhd2luZ09iamVjdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5jb250ZW50LklTdHlsYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5Db250cm9sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5EcmF3Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkZyYW1lRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5UZXh0Qm94RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZm9ybS5Gb3JtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkZvcm1Db250cm9sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkRvY3VtZW50Q29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5PZmZpY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5TcHJlYWRTaGVldEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnByZXNlbnRhdGlvbi5Ob3Rlc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnByZXNlbnRhdGlvbi5QcmVzZW50YXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlN0eWxlUHJvcGVydGllc0Jhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlRhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdmcuU1ZHQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5Db3ZlcmVkVGFibGVDZWxsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDZWxsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVDb2x1bW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZVJvd0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuUEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuU2VxdWVuY2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlRleHRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGZpeCBPREYgYWNjZXNzaWJpbGl0eSBwcm9ibGVtcwotICovCi1wdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eUZpeEVuZ2luZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBYUGF0aFNlcnZpY2UgeHBhdGhTZXJ2aWNlID0gWFBhdGhTZXJ2aWNlRmFjdG9yeQotCQkJLm5ld1NlcnZpY2UoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgRVhQMSA9IHhwYXRoU2VydmljZQotCQkJLmNvbXBpbGUoIi4vYW5jZXN0b3I6OipbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCSsgVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkkgKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciCi0JCQkJCSsgVGV4dENvbnN0YW50cy5FTEVNRU5UX1NFQ1RJT04gKyAiJ10iCi0JCQkJCSsgIlthdHRyaWJ1dGU6OipbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCSsgVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkkgKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciCi0JCQkJCSsgVGV4dENvbnN0YW50cy5BVFRSX0RJU1BMQVkgKyAiJ109JyIKLQkJCQkJKyBUZXh0Q29uc3RhbnRzLkFUVFJfRElTUExBWV9WQUxVRV9OT05FICsgIiddIik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEVYUDIgPSB4cGF0aFNlcnZpY2UKLQkJCS5jb21waWxlKCIuL2FuY2VzdG9yOjoqWyhuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJKyBUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJCi0JCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkrIFRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfQ0VMTCArICInKSIKLQkJCQkJKyAiIG9yIChuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJKyBUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJCi0JCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkrIFRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfQ09WRVJFRF9UQUJMRV9DRUxMICsgIicpXSIpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBFWFAzID0geHBhdGhTZXJ2aWNlCi0JCQkuY29tcGlsZSgiLi9hbmNlc3Rvcjo6KltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJKyBUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJCi0JCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIiArIFRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEUKLQkJCQkJKyAiJ10iICsgIltwYXJlbnQ6OipbbmFtZXNwYWNlLXVyaSgpPSciCi0JCQkJCSsgT2ZmaWNlQ29uc3RhbnRzLk9GRklDRV9OQU1FU1BBQ0VfVVJJCi0JCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkrIE9mZmljZUNvbnN0YW50cy5FTEVNRU5UX1NQUkVBRFNIRUVUICsgIiddXSIpOwotCi0JcHJpdmF0ZSBkb3VibGUgb2RmVmVyc2lvbiA9IC0xLjA7Ci0KLQlwdWJsaWMgQWNjZXNzaWJpbGl0eUZpeEVuZ2luZSgpIHsKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzaWJpbGl0eUZpeEVuZ2luZShkb3VibGUgb2RmVmVyc2lvbikgewotCQl0aGlzLm9kZlZlcnNpb24gPSBvZGZWZXJzaW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGZpeFNob3J0RGVzYyhPREZFbGVtZW50IHRhcmdldCwgU3RyaW5nIHNob3J0RGVzYykgewotCQlpZiAoKHNob3J0RGVzYyA9PSBudWxsKSB8fCAoc2hvcnREZXNjLmxlbmd0aCgpID09IDApKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQpIHsKLQkJCU9ERkVsZW1lbnQgc2hvcnREZXNjRWxlbSA9IG51bGw7Ci0JCQlpZiAob2RmVmVyc2lvbiAhPSAtMS4wKSB7Ci0JCQkJc2hvcnREZXNjRWxlbSA9ICgoRHJhd2luZ09iamVjdEJhc2VFbGVtZW50KSB0YXJnZXQpCi0JCQkJCQkuZ2V0U2hvcnREZXNjRWxlbWVudChvZGZWZXJzaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2hvcnREZXNjRWxlbSA9ICgoRHJhd2luZ09iamVjdEJhc2VFbGVtZW50KSB0YXJnZXQpCi0JCQkJCQkuZ2V0U2hvcnREZXNjRWxlbWVudCgpOwotCQkJfQotCi0JCQlpZiAoc2hvcnREZXNjRWxlbSA9PSBudWxsKSB7Ci0JCQkJRG9jdW1lbnQgZG9jID0gdGFyZ2V0LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCQlpZiAoZG9jIGluc3RhbmNlb2YgT0RGRG9jdW1lbnQpIHsKLQkJCQkJRWxlbWVudCBuZXdFbGVtID0gbnVsbDsKLQkJCQkJT0RGRG9jdW1lbnQgb2RmRG9jID0gKChPREZEb2N1bWVudCkgZG9jKTsKLQkJCQkJU3RyaW5nIHN2Z1ByZWZpeCA9IHRhcmdldAotCQkJCQkJCS5sb29rdXBQcmVmaXgoU1ZHQ29uc3RhbnRzLlNWR19OQU1FU1BBQ0VfVVJJKTsKLQkJCQkJaWYgKHN2Z1ByZWZpeCA9PSBudWxsKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJCWlmICgob2RmVmVyc2lvbiA9PSAxLjApCi0JCQkJCQkJfHwgKChvZGZWZXJzaW9uID09IC0xLjApICYmIChvZGZEb2MuZ2V0T0RGVmVyc2lvbigpID09IDEuMCkpKSB7Ci0JCQkJCQluZXdFbGVtID0gZG9jLmNyZWF0ZUVsZW1lbnQoc3ZnUHJlZml4ICsgIjoiCi0JCQkJCQkJCSsgU1ZHQ29uc3RhbnRzLkVMRU1FTlRfREVTQyk7Ci0JCQkJCQluZXdFbGVtLnNldFRleHRDb250ZW50KHNob3J0RGVzYyk7Ci0JCQkJCX0gZWxzZSBpZiAoKG9kZlZlcnNpb24gPiAxLjApCi0JCQkJCQkJfHwgKChvZGZWZXJzaW9uID09IC0xLjApICYmIChvZGZEb2MuZ2V0T0RGVmVyc2lvbigpID4gMS4wKSkpIHsKLQkJCQkJCW5ld0VsZW0gPSBkb2MuY3JlYXRlRWxlbWVudChzdmdQcmVmaXggKyAiOiIKLQkJCQkJCQkJKyBTVkdDb25zdGFudHMuRUxFTUVOVF9USVRMRSk7Ci0JCQkJCQluZXdFbGVtLnNldFRleHRDb250ZW50KHNob3J0RGVzYyk7Ci0JCQkJCX0KLQotCQkJCQlpZiAobmV3RWxlbSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudCkgewotCQkJCQkJCUVsZW1lbnQgcGFyZW50ID0gKEVsZW1lbnQpIHRhcmdldC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJcGFyZW50LmFwcGVuZENoaWxkKG5ld0VsZW0pOwotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEcmF3aW5nT2JqZWN0RWxlbWVudCkgewotCQkJCQkJCXRhcmdldC5hcHBlbmRDaGlsZChuZXdFbGVtKTsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc2hvcnREZXNjRWxlbS5zZXRUZXh0Q29udGVudChzaG9ydERlc2MpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBmaXhMb25nRGVzYyhPREZFbGVtZW50IHRhcmdldCwgU3RyaW5nIGxvbmdEZXNjKSB7Ci0JCWlmICgobG9uZ0Rlc2MgPT0gbnVsbCkgfHwgKGxvbmdEZXNjLmxlbmd0aCgpID09IDApKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQpIHsKLQkJCU9ERkVsZW1lbnQgbG9uZ0Rlc2NFbGVtID0gbnVsbDsKLQkJCWlmIChvZGZWZXJzaW9uICE9IC0xLjApIHsKLQkJCQlsb25nRGVzY0VsZW0gPSAoKERyYXdpbmdPYmplY3RCYXNlRWxlbWVudCkgdGFyZ2V0KQotCQkJCQkJLmdldExvbmdEZXNjRWxlbWVudChvZGZWZXJzaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbG9uZ0Rlc2NFbGVtID0gKChEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnQpIHRhcmdldCkKLQkJCQkJCS5nZXRMb25nRGVzY0VsZW1lbnQoKTsKLQkJCX0KLQotCQkJaWYgKGxvbmdEZXNjRWxlbSA9PSBudWxsKSB7Ci0JCQkJRG9jdW1lbnQgZG9jID0gdGFyZ2V0LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCQlpZiAoZG9jIGluc3RhbmNlb2YgT0RGRG9jdW1lbnQpIHsKLQkJCQkJRWxlbWVudCBuZXdFbGVtID0gbnVsbDsKLQkJCQkJT0RGRG9jdW1lbnQgb2RmRG9jID0gKChPREZEb2N1bWVudCkgZG9jKTsKLQkJCQkJRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudCkgdGFyZ2V0LmdldFBhcmVudE5vZGUoKTsKLQotCQkJCQlpZiAoKG9kZlZlcnNpb24gPiAxLjApCi0JCQkJCQkJfHwgKChvZGZWZXJzaW9uID09IC0xLjApICYmIChvZGZEb2MuZ2V0T0RGVmVyc2lvbigpID4gMS4wKSkpIHsKLQkJCQkJCVN0cmluZyBzdmdQcmVmaXggPSB0YXJnZXQKLQkJCQkJCQkJLmxvb2t1cFByZWZpeChTVkdDb25zdGFudHMuU1ZHX05BTUVTUEFDRV9VUkkpOwotCQkJCQkJaWYgKHN2Z1ByZWZpeCA9PSBudWxsKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCQkJbmV3RWxlbSA9IGRvYy5jcmVhdGVFbGVtZW50KHN2Z1ByZWZpeCArICI6IgotCQkJCQkJCQkrIFNWR0NvbnN0YW50cy5FTEVNRU5UX0RFU0MpOwotCQkJCQkJbmV3RWxlbS5zZXRUZXh0Q29udGVudChsb25nRGVzYyk7Ci0JCQkJCX0KLQotCQkJCQlpZiAobmV3RWxlbSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRW1iZWREcmF3aW5nT2JqZWN0RWxlbWVudCkgewotCQkJCQkJCXBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtKTsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRHJhd2luZ09iamVjdEVsZW1lbnQpIHsKLQkJCQkJCQl0YXJnZXQuYXBwZW5kQ2hpbGQobmV3RWxlbSk7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWxvbmdEZXNjRWxlbS5zZXRUZXh0Q29udGVudChsb25nRGVzYyk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRSZXBlYXRlZFRhYmxlUm93KFRhYmxlUm93RWxlbWVudCByb3cpIHsKLQkJaW50IHJlcGVhdCA9IHJvdy5nZXRBdHRyVGFibGVOdW1iZXJSb3dzUmVwZWF0ZWQoKTsKLQkJaWYgKHJlcGVhdCAhPSAtMSkgewotCQkJTm9kZSByb3dQYXJlbnQgPSByb3cuZ2V0UGFyZW50Tm9kZSgpOwotCQkJcm93LnJlbW92ZUF0dHJpYnV0ZU5TKFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfTlVNQkVSX1JPV1NfUkVQRUFURUQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXBlYXQgLSAxOyBpKyspIHsKLQkJCQlUYWJsZVJvd0VsZW1lbnQgY2xvbmVSb3cgPSAoVGFibGVSb3dFbGVtZW50KSByb3cKLQkJCQkJCS5jbG9uZU5vZGUoZmFsc2UpOwotCQkJCXJvd1BhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmVSb3csIHJvdyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBmaXhUYWJsZVJvd0hlYWRlcihPREZFbGVtZW50IHRhcmdldCwgaW50IGhlYWRlck51bSkgewotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgVGFibGVFbGVtZW50KSB7Ci0JCQlOb2RlTGlzdCB0ZXN0bmwgPSAoKFRhYmxlRWxlbWVudCkgdGFyZ2V0KS5nZXRUYWJsZUhlYWRlclJvd3MoKTsKLQkJCWlmICgodGVzdG5sICE9IG51bGwpICYmICh0ZXN0bmwuZ2V0TGVuZ3RoKCkgPiAwKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCURvY3VtZW50IGRvYyA9IHRhcmdldC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jIGluc3RhbmNlb2YgT0RGRG9jdW1lbnQpIHsKLQkJCQlTdHJpbmcgdGFibGVQcmVmaXggPSB0YXJnZXQKLQkJCQkJCS5sb29rdXBQcmVmaXgoVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSk7Ci0JCQkJaWYgKHRhYmxlUHJlZml4ID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCUVsZW1lbnQgaGVhZGVyUm93ID0gZG9jLmNyZWF0ZUVsZW1lbnQodGFibGVQcmVmaXggKyAiOiIKLQkJCQkJCSsgVGFibGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9IRUFERVJfUk9XUyk7Ci0KLQkJCQlMaXN0IHJvd0xpc3QgPSAoKFRhYmxlRWxlbWVudCkgdGFyZ2V0KS5nZXRUYWJsZVJvd0NoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb3dMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCWV4cGFuZFJlcGVhdGVkVGFibGVSb3coKFRhYmxlUm93RWxlbWVudCkgcm93TGlzdC5nZXQoaSkpOwotCQkJCX0KLQotCQkJCXJvd0xpc3QgPSAoKFRhYmxlRWxlbWVudCkgdGFyZ2V0KS5nZXRUYWJsZVJvd0NoaWxkcmVuKCk7Ci0JCQkJaWYgKChyb3dMaXN0LnNpemUoKSA9PSAwKSB8fCAoaGVhZGVyTnVtID4gcm93TGlzdC5zaXplKCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQlOb2RlIG5ld0hlYWRlclJvdyA9IHRhcmdldC5pbnNlcnRCZWZvcmUoaGVhZGVyUm93LAotCQkJCQkJKE5vZGUpIHJvd0xpc3QuZ2V0KDApKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlck51bTsgaSsrKSB7Ci0JCQkJCVRhYmxlUm93RWxlbWVudCByb3cgPSAoVGFibGVSb3dFbGVtZW50KSByb3dMaXN0LmdldChpKTsKLQkJCQkJbmV3SGVhZGVyUm93LmFwcGVuZENoaWxkKHJvdyk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhwYW5kUmVwZWF0ZWRUYWJsZUNvbHVtbihUYWJsZUNvbHVtbkVsZW1lbnQgY29sKSB7Ci0JCWludCByZXBlYXQgPSBjb2wuZ2V0QXR0clRhYmxlTnVtYmVyQ29sdW1uc1JlcGVhdGVkKCk7Ci0JCWlmIChyZXBlYXQgIT0gLTEpIHsKLQkJCU5vZGUgY29sUGFyZW50ID0gY29sLmdldFBhcmVudE5vZGUoKTsKLQkJCWNvbC5yZW1vdmVBdHRyaWJ1dGVOUyhUYWJsZUNvbnN0YW50cy5UQUJMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX05VTUJFUl9DT0xVTU5TX1JFUEVBVEVEKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0IC0gMTsgaSsrKSB7Ci0JCQkJVGFibGVDb2x1bW5FbGVtZW50IGNsb25lQ29sID0gKFRhYmxlQ29sdW1uRWxlbWVudCkgY29sCi0JCQkJCQkuY2xvbmVOb2RlKGZhbHNlKTsKLQkJCQljb2xQYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lQ29sLCBjb2wpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZml4VGFibGVDb2x1bW5IZWFkZXIoT0RGRWxlbWVudCB0YXJnZXQsIGludCBoZWFkZXJOdW0pIHsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFRhYmxlRWxlbWVudCkgewotCQkJTm9kZUxpc3QgdGVzdG5sID0gKChUYWJsZUVsZW1lbnQpIHRhcmdldCkuZ2V0VGFibGVIZWFkZXJDb2x1bW5zKCk7Ci0JCQlpZiAoKHRlc3RubCAhPSBudWxsKSAmJiAodGVzdG5sLmdldExlbmd0aCgpID4gMCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlEb2N1bWVudCBkb2MgPSB0YXJnZXQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIE9ERkRvY3VtZW50KSB7Ci0JCQkJU3RyaW5nIHRhYmxlUHJlZml4ID0gdGFyZ2V0Ci0JCQkJCQkubG9va3VwUHJlZml4KFRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkkpOwotCQkJCWlmICh0YWJsZVByZWZpeCA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQlFbGVtZW50IGhlYWRlckNvbHVtbiA9IGRvYy5jcmVhdGVFbGVtZW50KHRhYmxlUHJlZml4ICsgIjoiCi0JCQkJCQkrIFRhYmxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfSEVBREVSX0NPTFVNTlMpOwotCi0JCQkJTGlzdCBjb2xMaXN0ID0gKChUYWJsZUVsZW1lbnQpIHRhcmdldCkuZ2V0VGFibGVDb2x1bW5DaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQlleHBhbmRSZXBlYXRlZFRhYmxlQ29sdW1uKChUYWJsZUNvbHVtbkVsZW1lbnQpIGNvbExpc3QKLQkJCQkJCQkuZ2V0KGkpKTsKLQkJCQl9Ci0KLQkJCQljb2xMaXN0ID0gKChUYWJsZUVsZW1lbnQpIHRhcmdldCkuZ2V0VGFibGVDb2x1bW5DaGlsZHJlbigpOwotCQkJCWlmICgoY29sTGlzdC5zaXplKCkgPT0gMCkgfHwgKGhlYWRlck51bSA+IGNvbExpc3Quc2l6ZSgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJTm9kZSBuZXdIZWFkZXJDb2x1bW4gPSB0YXJnZXQuaW5zZXJ0QmVmb3JlKGhlYWRlckNvbHVtbiwKLQkJCQkJCShOb2RlKSBjb2xMaXN0LmdldCgwKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJOdW07IGkrKykgewotCQkJCQlUYWJsZUNvbHVtbkVsZW1lbnQgY29sID0gKFRhYmxlQ29sdW1uRWxlbWVudCkgY29sTGlzdAotCQkJCQkJCS5nZXQoaSk7Ci0JCQkJCW5ld0hlYWRlckNvbHVtbi5hcHBlbmRDaGlsZChjb2wpOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZml4VGFibGVDYXB0aW9uKE9ERkVsZW1lbnQgdGFyZ2V0LCBTdHJpbmcgY2FwdGlvbikgewotCQlpZiAoKGNhcHRpb24gPT0gbnVsbCkgfHwgKGNhcHRpb24ubGVuZ3RoKCkgPT0gMCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFRhYmxlRWxlbWVudCkgewotCQkJU2VxdWVuY2VFbGVtZW50IHRlc3QgPSAoKFRhYmxlRWxlbWVudCkgdGFyZ2V0KQotCQkJCQkuZ2V0VGV4dFNlcXVlbmNlRWxlbWVudCgpOwotCQkJaWYgKHRlc3QgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCURvY3VtZW50IGRvYyA9IHRhcmdldC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jIGluc3RhbmNlb2YgT0RGRG9jdW1lbnQpIHsKLQkJCQkvLyBhZGQgdGV4dDpwIGVsZW1lbnQgbmV4dCB0byB0YWJsZTp0YWJsZSBlbGVtZW50Ci0JCQkJRWxlbWVudCBuZXdQRWxlbSA9IG51bGw7Ci0JCQkJU3RyaW5nIHRleHRQcmVmaXggPSB0YXJnZXQKLQkJCQkJCS5sb29rdXBQcmVmaXgoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkkpOwotCQkJCWlmICh0ZXh0UHJlZml4ID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlTdHJpbmcgc3R5bGVQcmVmaXggPSB0YXJnZXQKLQkJCQkJCS5sb29rdXBQcmVmaXgoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSk7Ci0JCQkJaWYgKHN0eWxlUHJlZml4ID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCUVsZW1lbnQgcEVsZW0gPSBkb2MuY3JlYXRlRWxlbWVudCh0ZXh0UHJlZml4ICsgIjoiCi0JCQkJCQkrIFRleHRDb25zdGFudHMuRUxFTUVOVF9QKTsKLQkJCQlwRWxlbS5zZXRBdHRyaWJ1dGUodGV4dFByZWZpeCArICI6IgotCQkJCQkJKyBUZXh0Q29uc3RhbnRzLkFUVFJfU1RZTEVfTkFNRSwgIlRhYmxlIik7Ci0JCQkJTm9kZSBwYXJlbnQgPSB0YXJnZXQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCU5vZGUgbmV4dE5vZGUgPSB0YXJnZXQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dE5vZGUgPT0gbnVsbCkgewotCQkJCQluZXdQRWxlbSA9IChFbGVtZW50KSBwYXJlbnQuYXBwZW5kQ2hpbGQocEVsZW0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5ld1BFbGVtID0gKEVsZW1lbnQpIHBhcmVudC5pbnNlcnRCZWZvcmUocEVsZW0sIG5leHROb2RlKTsKLQkJCQl9Ci0KLQkJCQlpZiAobmV3UEVsZW0gIT0gbnVsbCkgewotCQkJCQluZXdQRWxlbS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlRhYmxlICIpKTsKLQotCQkJCQkvLyBzZXQgY29udGVudCBvZiB0ZXh0OnAgZWxlbWVudAotCQkJCQlFbGVtZW50IHNlcUVsZW0gPSBkb2MuY3JlYXRlRWxlbWVudCh0ZXh0UHJlZml4ICsgIjoiCi0JCQkJCQkJKyBUZXh0Q29uc3RhbnRzLkVMRU1FTlRfU0VRVUVOQ0UpOwotCQkJCQlzZXFFbGVtLnNldEF0dHJpYnV0ZSh0ZXh0UHJlZml4ICsgIjoiCi0JCQkJCQkJKyBUZXh0Q29uc3RhbnRzLkFUVFJfTkFNRSwgIlRhYmxlIik7Ci0JCQkJCXNlcUVsZW0uc2V0QXR0cmlidXRlKHRleHRQcmVmaXggKyAiOiIKLQkJCQkJCQkrIFRleHRDb25zdGFudHMuQVRUUl9GT1JNVUxBLCAib29vdzpUYWJsZSsxIik7Ci0JCQkJCXNlcUVsZW0uc2V0QXR0cmlidXRlKHN0eWxlUHJlZml4ICsgIjoiCi0JCQkJCQkJKyBTdHlsZUNvbnN0YW50cy5BVFRSX05VTV9GT1JNQVQsICIxIik7Ci0JCQkJCW5ld1BFbGVtLmFwcGVuZENoaWxkKHNlcUVsZW0pOwotCQkJCQlUZXh0IGNhcHRpb25UZXh0ID0gZG9jLmNyZWF0ZVRleHROb2RlKCIgOiAiICsgY2FwdGlvbik7Ci0JCQkJCW5ld1BFbGVtLmFwcGVuZENoaWxkKGNhcHRpb25UZXh0KTsKLQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9ybUxhYmVsRml4Q2FwYWJsZShPREZFbGVtZW50IHRhcmdldCkgewotCQlmaW5hbCBTdHJpbmcgQ09OVFJPTF9JTVBMX0NIRUNLQk9YID0gImNvbS5zdW4uc3Rhci5mb3JtLmNvbXBvbmVudC5DaGVja0JveCI7Ci0JCWZpbmFsIFN0cmluZyBDT05UUk9MX0lNUExfT1BUSU9OQlVUVE9OID0gImNvbS5zdW4uc3Rhci5mb3JtLmNvbXBvbmVudC5PcHRpb25CdXR0b24iOwotCQlmaW5hbCBTdHJpbmcgQ09OVFJPTF9JTVBMX1BVU0hCVVRUT04gPSAiY29tLnN1bi5zdGFyLmZvcm0uY29tcG9uZW50LlB1c2hCdXR0b24iOwotCQlmaW5hbCBTdHJpbmcgQ09OVFJPTF9JTVBMX1JBRElPQlVUVE9OID0gImNvbS5zdW4uc3Rhci5mb3JtLmNvbXBvbmVudC5SYWRpb0J1dHRvbiI7Ci0JCWZpbmFsIFN0cmluZyBDT05UUk9MX0lNUExfR1JPVVBCT1ggPSAiY29tLnN1bi5zdGFyLmZvcm0uY29tcG9uZW50Lkdyb3VwQm94IjsKLQotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ29udHJvbEVsZW1lbnQpIHsKLQkJCUZvcm1Db250cm9sRWxlbWVudCBmb3JtQ29udHJvbCA9ICgoQ29udHJvbEVsZW1lbnQpIHRhcmdldCkKLQkJCQkJLmdldEZvcm1Db250cm9sRWxlbWVudCgpOwotCQkJU3RyaW5nIGNvbnRyb2xJbXBsID0gZm9ybUNvbnRyb2wuZ2V0QXR0ckZvcm1Db250cm9sSW1wbGVtZW50YXRpb24oKTsKLQkJCWlmICgoY29udHJvbEltcGwuZW5kc1dpdGgoQ09OVFJPTF9JTVBMX0NIRUNLQk9YKSkKLQkJCQkJfHwgKGNvbnRyb2xJbXBsLmVuZHNXaXRoKENPTlRST0xfSU1QTF9PUFRJT05CVVRUT04pKQotCQkJCQl8fCAoY29udHJvbEltcGwuZW5kc1dpdGgoQ09OVFJPTF9JTVBMX1BVU0hCVVRUT04pKQotCQkJCQl8fCAoY29udHJvbEltcGwuZW5kc1dpdGgoQ09OVFJPTF9JTVBMX1JBRElPQlVUVE9OKSkKLQkJCQkJfHwgKGNvbnRyb2xJbXBsLmVuZHNXaXRoKENPTlRST0xfSU1QTF9HUk9VUEJPWCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBmaXhGb3JtTGFiZWwoT0RGRWxlbWVudCB0YXJnZXQsIFN0cmluZyBsYWJlbCkgewotCQlpZiAoKGxhYmVsID09IG51bGwpIHx8IChsYWJlbC5sZW5ndGgoKSA9PSAwKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ29udHJvbEVsZW1lbnQpIHsKLQkJCUZvcm1Db250cm9sRWxlbWVudCBmb3JtQ29udHJvbCA9ICgoQ29udHJvbEVsZW1lbnQpIHRhcmdldCkKLQkJCQkJLmdldEZvcm1Db250cm9sRWxlbWVudCgpOwotCQkJaWYgKGZvcm1Db250cm9sLmhhc0F0dHJpYnV0ZU5TKEZvcm1Db25zdGFudHMuRk9STV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtQ29uc3RhbnRzLkFUVFJfTEFCRUwpKSB7Ci0JCQkJZm9ybUNvbnRyb2wucmVtb3ZlQXR0cmlidXRlTlMoRm9ybUNvbnN0YW50cy5GT1JNX05BTUVTUEFDRV9VUkksCi0JCQkJCQlGb3JtQ29uc3RhbnRzLkFUVFJfTEFCRUwpOwotCQkJfQotCQkJU3RyaW5nIGZvcm1QcmVmaXggPSBmb3JtQ29udHJvbC5nZXRQcmVmaXgoKTsKLQkJCWZvcm1Db250cm9sLnNldEF0dHJpYnV0ZShmb3JtUHJlZml4ICsgIjoiCi0JCQkJCSsgRm9ybUNvbnN0YW50cy5BVFRSX0xBQkVMLCBsYWJlbCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZml4Rm9ybVRhYlN0b3AoT0RGRWxlbWVudCB0YXJnZXQsIGJvb2xlYW4gdGFiU3RvcCkgewotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ29udHJvbEVsZW1lbnQpIHsKLQkJCUZvcm1Db250cm9sRWxlbWVudCBmb3JtQ29udHJvbCA9ICgoQ29udHJvbEVsZW1lbnQpIHRhcmdldCkKLQkJCQkJLmdldEZvcm1Db250cm9sRWxlbWVudCgpOwotCQkJaWYgKGZvcm1Db250cm9sLmhhc0F0dHJpYnV0ZU5TKEZvcm1Db25zdGFudHMuRk9STV9OQU1FU1BBQ0VfVVJJLAotCQkJCQlGb3JtQ29uc3RhbnRzLkFUVFJfVEFCX1NUT1ApKSB7Ci0JCQkJZm9ybUNvbnRyb2wucmVtb3ZlQXR0cmlidXRlTlMoRm9ybUNvbnN0YW50cy5GT1JNX05BTUVTUEFDRV9VUkksCi0JCQkJCQlGb3JtQ29uc3RhbnRzLkFUVFJfVEFCX1NUT1ApOwotCQkJfQotCQkJU3RyaW5nIGZvcm1QcmVmaXggPSBmb3JtQ29udHJvbC5nZXRQcmVmaXgoKTsKLQkJCWZvcm1Db250cm9sLnNldEF0dHJpYnV0ZShmb3JtUHJlZml4ICsgIjoiCi0JCQkJCSsgRm9ybUNvbnN0YW50cy5BVFRSX1RBQl9TVE9QLCBuZXcgQm9vbGVhbih0YWJTdG9wKQotCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbnZpc2libGVFbGVtZW50KE9ERkVsZW1lbnQgZWxlbSkgewotCQlOb2RlTGlzdCBubCA9IHhwYXRoU2VydmljZS5ldmFsRm9yTm9kZUxpc3QoRVhQMSwgZWxlbSk7Ci0JCWlmICgobmwgIT0gbnVsbCkgJiYgKG5sLmdldExlbmd0aCgpID4gMCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW52aXNpYmxlU2VjdGlvbk5hbWUoT0RGRWxlbWVudCBlbGVtKSB7Ci0JCU5vZGVMaXN0IG5sID0geHBhdGhTZXJ2aWNlLmV2YWxGb3JOb2RlTGlzdChFWFAxLCBlbGVtKTsKLQkJaWYgKChubCAhPSBudWxsKSAmJiAobmwuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJaWYgKG5sLml0ZW0oMCkgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJRWxlbWVudCBzZWN0aW9uID0gKEVsZW1lbnQpIG5sLml0ZW0oMCk7Ci0JCQkJaWYgKHNlY3Rpb24uaGFzQXR0cmlidXRlTlMoVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCQlUZXh0Q29uc3RhbnRzLkFUVFJfTkFNRSkpIHsKLQkJCQkJcmV0dXJuIHNlY3Rpb24uZ2V0QXR0cmlidXRlTlMoCi0JCQkJCQkJVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCQkJVGV4dENvbnN0YW50cy5BVFRSX05BTUUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3RlY3RlZEVsZW1lbnQoT0RGRWxlbWVudCB0YXJnZXQpIHsKLQkJQ29udGVudFR5cGUgdHlwZSA9IENvbnRlbnRUeXBlLk5PTkU7Ci0JCUVsZW1lbnQgY29udGVudCA9IHRhcmdldC5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRG9jdW1lbnRDb250ZW50RWxlbWVudCkgewotCQkJdHlwZSA9ICgoRG9jdW1lbnRDb250ZW50RWxlbWVudCkgY29udGVudCkuZ2V0Qm9keUVsZW1lbnQoKQotCQkJCQkuZ2V0Q29udGVudCgpLmdldENvbnRlbnRUeXBlKCk7Ci0JCX0KLQkJaWYgKHR5cGUgIT0gQ29udGVudFR5cGUuU1BSRUFEU0hFRVQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIFNwcmVhZFNoZWV0RWxlbWVudCkgewotCQkJU3ByZWFkU2hlZXRFbGVtZW50IHNwcmVhZHNoZWV0ID0gKFNwcmVhZFNoZWV0RWxlbWVudCkgdGFyZ2V0OwotCQkJcmV0dXJuIHNwcmVhZHNoZWV0LmdldEF0dHJUYWJsZVN0cnVjdHVyZVByb3RlY3RlZCgpOwotCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFRhYmxlRWxlbWVudCkgewotCQkJVGFibGVFbGVtZW50IHRhYmxlID0gKFRhYmxlRWxlbWVudCkgdGFyZ2V0OwotCQkJcmV0dXJuIHRhYmxlLmdldEF0dHJUYWJsZVByb3RlY3RlZCgpOwotCQl9IGVsc2UgewotCQkJU3ByZWFkU2hlZXRFbGVtZW50IHNwcmVhZHNoZWV0ID0gbnVsbDsKLQkJCVRhYmxlRWxlbWVudCB0YWJsZSA9IG51bGw7Ci0JCQlJU3R5bGFibGUgY2VsbCA9IG51bGw7Ci0KLQkJCWlmICgodGFyZ2V0IGluc3RhbmNlb2YgVGFibGVDZWxsRWxlbWVudCkKLQkJCQkJfHwgKHRhcmdldCBpbnN0YW5jZW9mIENvdmVyZWRUYWJsZUNlbGxFbGVtZW50KSkgewotCQkJCWNlbGwgPSAoSVN0eWxhYmxlKSB0YXJnZXQ7Ci0JCQl9IGVsc2UgewotCQkJCU5vZGVMaXN0IGNlbGxMaXN0ID0geHBhdGhTZXJ2aWNlLmV2YWxGb3JOb2RlTGlzdChFWFAyLCB0YXJnZXQpOwotCQkJCWlmICgoY2VsbExpc3QgIT0gbnVsbCkgJiYgKGNlbGxMaXN0LmdldExlbmd0aCgpID09IDEpKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IGNlbGxMaXN0Lml0ZW0oMCk7Ci0JCQkJCWlmICgobm9kZSBpbnN0YW5jZW9mIFRhYmxlQ2VsbEVsZW1lbnQpCi0JCQkJCQkJfHwgKG5vZGUgaW5zdGFuY2VvZiBDb3ZlcmVkVGFibGVDZWxsRWxlbWVudCkpIHsKLQkJCQkJCWNlbGwgPSAoSVN0eWxhYmxlKSBub2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNlbGwgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCU5vZGVMaXN0IHRhYmxlTGlzdCA9IHhwYXRoU2VydmljZS5ldmFsRm9yTm9kZUxpc3QoRVhQMywgdGFyZ2V0KTsKLQkJCWlmICgodGFibGVMaXN0ICE9IG51bGwpICYmICh0YWJsZUxpc3QuZ2V0TGVuZ3RoKCkgPT0gMSkpIHsKLQkJCQlOb2RlIG5vZGUgPSB0YWJsZUxpc3QuaXRlbSgwKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRhYmxlRWxlbWVudCkgewotCQkJCQl0YWJsZSA9IChUYWJsZUVsZW1lbnQpIG5vZGU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHRhYmxlID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlOb2RlIHRhYmxlUGFyZW50ID0gdGFibGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHRhYmxlUGFyZW50IGluc3RhbmNlb2YgU3ByZWFkU2hlZXRFbGVtZW50KSB7Ci0JCQkJc3ByZWFkc2hlZXQgPSAoU3ByZWFkU2hlZXRFbGVtZW50KSB0YWJsZVBhcmVudDsKLQkJCX0KLQkJCWlmIChzcHJlYWRzaGVldCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJaWYgKHNwcmVhZHNoZWV0LmdldEF0dHJUYWJsZVN0cnVjdHVyZVByb3RlY3RlZCgpCi0JCQkJCXx8IHRhYmxlLmdldEF0dHJUYWJsZVByb3RlY3RlZCgpKSB7Ci0JCQkJaW50IGNlbGxQcm90ZWN0ID0gU3R5bGVDb25zdGFudHMuQ0VMTF9QUk9URUNUX1ZBTFVFX05PVF9ERUZJTkVEOwotCi0JCQkJU3R5bGVFbGVtZW50IHN0eWxlRWxlbSA9IGNlbGwuZ2V0U3R5bGUoKTsKLQkJCQlpZiAoc3R5bGVFbGVtICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHlsZUVsZW0uZ2V0UHJvcGVydHlTaXplKCk7IGkrKykgewotCQkJCQkJU3R5bGVQcm9wZXJ0aWVzQmFzZSBwcm9wID0gc3R5bGVFbGVtCi0JCQkJCQkJCS5nZXRQcm9wZXJ0eUVsZW1lbnQoaSk7Ci0JCQkJCQlpZiAocHJvcCBpbnN0YW5jZW9mIFRhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50KSB7Ci0JCQkJCQkJVGFibGVDZWxsUHJvcGVydGllc0VsZW1lbnQgY2VsbFByb3AgPSAoVGFibGVDZWxsUHJvcGVydGllc0VsZW1lbnQpIHByb3A7Ci0JCQkJCQkJY2VsbFByb3RlY3QgPSBjZWxsUHJvcC5nZXRBdHRyU3R5bGVDZWxsUHJvdGVjdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKChjZWxsUHJvdGVjdCA9PSBTdHlsZUNvbnN0YW50cy5DRUxMX1BST1RFQ1RfVkFMVUVfUFJPVEVDVEVEKQotCQkJCQkJfHwgKGNlbGxQcm90ZWN0ID09IFN0eWxlQ29uc3RhbnRzLkNFTExfUFJPVEVDVF9WQUxVRV9ISURERU5fQU5EX1BST1RFQ1RFRCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChjZWxsUHJvdGVjdCA9PSBTdHlsZUNvbnN0YW50cy5DRUxMX1BST1RFQ1RfVkFMVUVfTk9UX0RFRklORUQpIHsKLQkJCQkJaWYgKHRhYmxlLmhhc0F0dHJpYnV0ZU5TKAotCQkJCQkJCVRhYmxlQ29uc3RhbnRzLlRBQkxFX05BTUVTUEFDRV9VUkksCi0JCQkJCQkJVGFibGVDb25zdGFudHMuQVRUUl9QUk9URUNURUQpKQotCQkJCQkJcmV0dXJuIHRhYmxlLmdldEF0dHJUYWJsZVByb3RlY3RlZCgpOwotCQkJCQlpZiAoc3ByZWFkc2hlZXQuaGFzQXR0cmlidXRlTlMoCi0JCQkJCQkJVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCQlUYWJsZUNvbnN0YW50cy5BVFRSX1NUUlVDVFVSRV9QUk9URUNURUQpKQotCQkJCQkJcmV0dXJuIHNwcmVhZHNoZWV0LmdldEF0dHJUYWJsZVN0cnVjdHVyZVByb3RlY3RlZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlYWtlck5vdGVzQ29udGVudChOb3Rlc0VsZW1lbnQgbm90ZXMsIFN0cmluZyBjb250ZW50KSB7Ci0JCVN0cmluZ1tdIGNvbnRlbnRMaXN0ID0gY29udGVudC5zcGxpdCgiXG4iKTsKLQotCQlOb2RlTGlzdCBmcmFtZUxpc3QgPSBub3Rlcy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotCQkJCURyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLCBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfRlJBTUUpOwotCQlpZiAoKGZyYW1lTGlzdCA9PSBudWxsKSB8fCAoZnJhbWVMaXN0LmdldExlbmd0aCgpIDw9IDApKQotCQkJcmV0dXJuOwotCi0JCUZyYW1lRWxlbWVudCBub3Rlc0ZyYW1lID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBub2RlID0gZnJhbWVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEZyYW1lRWxlbWVudCkgewotCQkJCUZyYW1lRWxlbWVudCBmcmFtZSA9IChGcmFtZUVsZW1lbnQpIG5vZGU7Ci0JCQkJU3RyaW5nIHByZXNlbnRhdGlvbkNsYXNzID0gZnJhbWUuZ2V0QXR0cmlidXRlTlMoCi0JCQkJCQlQcmVzZW50YXRpb25Db25zdGFudHMuUFJFU0VOVEFUSU9OX05BTUVTUEFDRV9VUkksCi0JCQkJCQlQcmVzZW50YXRpb25Db25zdGFudHMuQVRUUl9DTEFTUyk7Ci0JCQkJaWYgKChwcmVzZW50YXRpb25DbGFzcyAhPSBudWxsKQotCQkJCQkJJiYgKHByZXNlbnRhdGlvbkNsYXNzCi0JCQkJCQkJCS5lcXVhbHMoUHJlc2VudGF0aW9uQ29uc3RhbnRzLkFUVFJfQ0xBU1NfVkFMVUVfTk9URVMpKSkgewotCQkJCQlub3Rlc0ZyYW1lID0gZnJhbWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChub3Rlc0ZyYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJTm9kZUxpc3QgdGV4dEJveExpc3QgPSBub3Rlc0ZyYW1lLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksCi0JCQkJRHJhd0NvbnN0YW50cy5FTEVNRU5UX1RFWFRfQk9YKTsKLQkJaWYgKCh0ZXh0Qm94TGlzdCA9PSBudWxsKSB8fCAodGV4dEJveExpc3QuZ2V0TGVuZ3RoKCkgIT0gMSkpCi0JCQlyZXR1cm47Ci0KLQkJRG9jdW1lbnQgZG9jID0gbm90ZXMuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlUZXh0Qm94RWxlbWVudCB0ZXh0Qm94ID0gKFRleHRCb3hFbGVtZW50KSB0ZXh0Qm94TGlzdC5pdGVtKDApOwotCQlOb2RlTGlzdCBwTGlzdCA9IHRleHRCb3guZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLQkJCQlUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwgVGV4dENvbnN0YW50cy5FTEVNRU5UX1ApOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudExpc3QubGVuZ3RoOyBpKyspIHsKLQkJCVBFbGVtZW50IHBFbGVtID0gbnVsbDsKLQkJCWlmICgoaSA9PSAwKSAmJiAocExpc3QgIT0gbnVsbCkgJiYgKHBMaXN0LmdldExlbmd0aCgpID09IDEpKSB7Ci0JCQkJcEVsZW0gPSAoUEVsZW1lbnQpIHBMaXN0Lml0ZW0oMCk7Ci0JCQl9IGVsc2UgewotCQkJCXBFbGVtID0gKFBFbGVtZW50KSBkb2MuY3JlYXRlRWxlbWVudE5TKAotCQkJCQkJVGV4dENvbnN0YW50cy5URVhUX05BTUVTUEFDRV9VUkksCi0JCQkJCQlUZXh0Q29uc3RhbnRzLkVMRU1FTlRfUCk7Ci0JCQl9Ci0JCQl0ZXh0Qm94LmFwcGVuZENoaWxkKHBFbGVtKTsKLQotCQkJVGV4dCB0ZXh0ID0gZG9jLmNyZWF0ZVRleHROb2RlKGNvbnRlbnRMaXN0W2ldKTsKLQkJCXBFbGVtLmFwcGVuZENoaWxkKHRleHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2FjY2Vzc2liaWxpdHkvU2NyZWVuUmVhZGVyU2ltdWxhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvYWNjZXNzaWJpbGl0eS9TY3JlZW5SZWFkZXJTaW11bGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiOWQxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvYWNjZXNzaWJpbGl0eS9TY3JlZW5SZWFkZXJTaW11bGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLmFjY2Vzc2liaWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLmNvbnZlcnRlci5UZXh0RXh0cmFjdG9yOwotCi0vKioKLSAqIFNjcmVlbiByZWFkZXIgc2ltdWxhdG9yIGNsYXNzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBTY3JlZW5SZWFkZXJTaW11bGF0b3IgZXh0ZW5kcyBUZXh0RXh0cmFjdG9yIHsKLQl2b2lkIHNldERvY3VtZW50KE9ERkRvY3VtZW50IGRvY3VtZW50KTsKLQotCXZvaWQgc2V0RWxlbWVudChPREZFbGVtZW50IGVsZW1lbnQpOwotCi0JU3RyaW5nIGdldEN1cnJlbnRFbGVtZW50Q29udGVudCgpOwotCi0JU3RyaW5nIGdldEVsZW1lbnRDb250ZW50KE9ERkVsZW1lbnQgZWxlbSk7Ci0KLQlTdHJpbmcgZ2V0RG9jdW1lbnRDb250ZW50KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvYWNjZXNzaWJpbGl0eS9TaW11bGF0b3JDcmVhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvYWNjZXNzaWJpbGl0eS9TaW11bGF0b3JDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZDFmZDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2FjY2Vzc2liaWxpdHkvU2ltdWxhdG9yQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuYWNjZXNzaWJpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLmFjY2Vzc2liaWxpdHkuaW1wbC5TY3JlZW5SZWFkZXJTaW11bGF0b3JJbXBsOwotCi0vKioKLSAqIEZhY3RvcnkgY2xhc3MgdG8gY3JlYXRlIHNjcmVlbiByZWFkZXIgc2ltdWxhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW11bGF0b3JDcmVhdG9yIHsKLQlzdGF0aWMgcHVibGljIFNjcmVlblJlYWRlclNpbXVsYXRvciBjcmVhdGVTaW11bGF0b3JDb250cm9sbGVyKCkgewotCQlyZXR1cm4gKFNjcmVlblJlYWRlclNpbXVsYXRvcikgKG5ldyBTY3JlZW5SZWFkZXJTaW11bGF0b3JJbXBsKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9hY2Nlc3NpYmlsaXR5L2ltcGwvU2NyZWVuUmVhZGVyU2ltdWxhdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2FjY2Vzc2liaWxpdHkvaW1wbC9TY3JlZW5SZWFkZXJTaW11bGF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMmM4ZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2FjY2Vzc2liaWxpdHkvaW1wbC9TY3JlZW5SZWFkZXJTaW11bGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuYWNjZXNzaWJpbGl0eS5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzLkNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkNvbnRlbnRCYXNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LlBhZ2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuQm9keUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5Eb2N1bWVudENvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuUHJlc2VudGF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLlNwcmVhZFNoZWV0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5wcmVzZW50YXRpb24uTm90ZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuYWNjZXNzaWJpbGl0eS5TY3JlZW5SZWFkZXJTaW11bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuY29udmVydGVyLmltcGwuVGV4dEV4dHJhY3RvckltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBTY3JlZW5SZWFkZXJTaW11bGF0b3JJbXBsIGltcGxlbWVudHMgU2NyZWVuUmVhZGVyU2ltdWxhdG9yIHsKLQlwcml2YXRlIE9ERkVsZW1lbnQgY3VyRWxlbSA9IG51bGw7Ci0KLQlwcml2YXRlIFRleHRFeHRyYWN0b3JJbXBsIHRleHRFeHRyYWN0b3I7Ci0KLQlwdWJsaWMgU2NyZWVuUmVhZGVyU2ltdWxhdG9ySW1wbCgpIHsKLQkJdGV4dEV4dHJhY3RvciA9IG5ldyBUZXh0RXh0cmFjdG9ySW1wbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KE9ERkRvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMuY3VyRWxlbSA9IChPREZFbGVtZW50KSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJdGhpcy50ZXh0RXh0cmFjdG9yLnNldERvY3VtZW50KGRvY3VtZW50LCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50KE9ERkVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmN1ckVsZW0gPSBlbGVtZW50OwotCQl0aGlzLnRleHRFeHRyYWN0b3Iuc2V0RG9jdW1lbnQoCi0JCQkJKE9ERkRvY3VtZW50KSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSwgdGhpcyk7Ci0JfQotCi0JLy8gZm9yIE5vdGVzOCwgTm90ZXM4IHNhdmUgZG9jdW1lbnQgYnkgT0RGIDEuMSBzY2hlbWEsCi0JLy8gYnV0IG9kZjp2ZXJzaW9uIGlzIHNldCBhcyAxLjAKLQkvLyBpZiBzcGVjaWZ5IG9kZjp2ZXJzaW9uIGJ5IHRoaXMgZnVuY3Rpb24sCi0JLy8gZG8gbm90IHVzZSBvZGY6dmVyc2lvbiBkZWZpbmVkIGluIGVhY2ggT0RGIGZpbGUKLQlwdWJsaWMgdm9pZCBzZXRPZGZWZXJzaW9uKGRvdWJsZSBvZGZWZXJzaW9uKSB7Ci0JCXRoaXMudGV4dEV4dHJhY3Rvci5zZXRPZGZWZXJzaW9uKG9kZlZlcnNpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZVBhZ2VFbGVtZW50Q29udGVudChXcml0ZXIgd3JpdGVyLCBQYWdlRWxlbWVudCBwYWdlKSB7Ci0JCS8qCi0JCSAqIE5vZGVMaXN0IGNoaWxkcmVuID0gcGFnZS5nZXRDaGlsZE5vZGVzKCk7IGZvciAoaW50IGo9MDsgajxjaGlsZHJlbi5nZXRMZW5ndGgoKTsKLQkJICogaisrKSB7IE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGopOwotCQkgKi8KLQkJTGlzdDxPREZFbGVtZW50PiBjaGlsZHJlbiA9IHBhZ2UuZ2V0Q2hpbGROb2Rlc0luTmF2T3JkZXIoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5zaXplKCk7IGorKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLmdldChqKTsKLQkJCWlmICgoY2hpbGQgaW5zdGFuY2VvZiBPREZFbGVtZW50KQotCQkJCQkmJiAoIShjaGlsZCBpbnN0YW5jZW9mIE5vdGVzRWxlbWVudCkpKSB7Ci0JCQkJU3RyaW5nIHN0ciA9IGdldEVsZW1lbnRDb250ZW50KChPREZFbGVtZW50KSBjaGlsZCk7Ci0JCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl3cml0ZXIud3JpdGUoc3RyKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4dHJhY3RDb250ZW50KFdyaXRlciB3cml0ZXIsIEZpbGUgZGlyLCBPREZFbGVtZW50IGVsZW0sCi0JCQlib29sZWFuIGVuYWJsZVN0eWxlKSB7Ci0JCXJldHVybiB0ZXh0RXh0cmFjdG9yLmV4dHJhY3RDb250ZW50KHdyaXRlciwgZGlyLCAoT0RGRWxlbWVudCkgZWxlbSwKLQkJCQllbmFibGVTdHlsZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50Q29udGVudChPREZFbGVtZW50IGVsZW0pIHsKLQkJc2V0RWxlbWVudChlbGVtKTsKLQotCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCi0JCWlmIChlbGVtIGluc3RhbmNlb2YgUGFnZUVsZW1lbnQpIHsKLQkJCXdyaXRlUGFnZUVsZW1lbnRDb250ZW50KHdyaXRlciwgKFBhZ2VFbGVtZW50KSBlbGVtKTsKLQkJfSBlbHNlIHsKLQkJCWV4dHJhY3RDb250ZW50KHdyaXRlciwgbnVsbCwgKE9ERkVsZW1lbnQpIGVsZW0sIGZhbHNlKTsKLQkJfQotCi0JCVN0cmluZyBzdHIgPSAiIjsKLQkJdHJ5IHsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQlzdHIgPSB3cml0ZXIudG9TdHJpbmcoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gc3RyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudEVsZW1lbnRDb250ZW50KCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudENvbnRlbnQoY3VyRWxlbSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dERvY3VtZW50Q29udGVudChUZXh0RWxlbWVudCB0ZXh0RWxlbSkgewotCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0ZXh0RWxlbS5nZXRDaGlsZEl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRWxlbWVudCBjaGlsZCA9IChFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE9ERkVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgc3RyID0gZ2V0RWxlbWVudENvbnRlbnQoKE9ERkVsZW1lbnQpIGNoaWxkKTsKLQkJCQlpZiAoc3RyICE9IG51bGwpCi0JCQkJCXdyaXRlci53cml0ZShzdHIpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBzdHIgPSAiIjsKLQkJdHJ5IHsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQlzdHIgPSB3cml0ZXIudG9TdHJpbmcoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gc3RyOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFNwcmVhZHNoZWV0RG9jdW1lbnRDb250ZW50KFNwcmVhZFNoZWV0RWxlbWVudCBzcHJlYWRFbGVtKSB7Ci0JCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3ByZWFkRWxlbS5nZXRUYWJsZVNpemUoKTsgaSsrKSB7Ci0JCQlUYWJsZUVsZW1lbnQgdGFibGUgPSBzcHJlYWRFbGVtLmdldFRhYmxlKGkpOwotCQkJU3RyaW5nIHN0ciA9IGdldEVsZW1lbnRDb250ZW50KHRhYmxlKTsKLQkJCWlmIChzdHIgIT0gbnVsbCkKLQkJCQl3cml0ZXIud3JpdGUoc3RyICsgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsKLQkJfQotCQlTdHJpbmcgc3RyID0gIiI7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJCXdyaXRlci5jbG9zZSgpOwotCQkJc3RyID0gd3JpdGVyLnRvU3RyaW5nKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVzZW50YXRpb25Eb2N1bWVudENvbnRlbnQoUHJlc2VudGF0aW9uRWxlbWVudCBwcmVzZW5FbGVtKSB7Ci0JCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlc2VuRWxlbS5nZXRQYWdlU2l6ZSgpOyBpKyspIHsKLQkJCVBhZ2VFbGVtZW50IHBhZ2UgPSBwcmVzZW5FbGVtLmdldFBhZ2UoaSk7Ci0JCQlOb3Rlc0VsZW1lbnQgbm90ZXMgPSBwYWdlLmdldFByZXNlbnRhdGlvbk5vdGVzRWxlbWVudCgpOwotCQkJd3JpdGVyLndyaXRlKCJQYWdlICIpOwotCQkJd3JpdGVyLndyaXRlKGkgKyAxKTsKLQkJCXdyaXRlci53cml0ZShTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOwotCQkJd3JpdGVyLndyaXRlKGdldEVsZW1lbnRDb250ZW50KHBhZ2UpKTsKLQkJCXdyaXRlci53cml0ZShTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOwotCQkJd3JpdGVyLndyaXRlKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotCQkJd3JpdGVyLndyaXRlKFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7Ci0JCQl3cml0ZXIud3JpdGUoIlNwZWFrZXIgTm90ZXMiKTsKLQkJCXdyaXRlci53cml0ZShTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOwotCQkJd3JpdGVyLndyaXRlKGdldEVsZW1lbnRDb250ZW50KG5vdGVzKSk7Ci0JCX0KLQkJU3RyaW5nIHN0ciA9ICIiOwotCQl0cnkgewotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJCXN0ciA9IHdyaXRlci50b1N0cmluZygpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBzdHI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREb2N1bWVudENvbnRlbnQoKSB7Ci0JCWlmIChjdXJFbGVtID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRWxlbWVudCByb290ID0gY3VyRWxlbS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRDb250ZW50RWxlbWVudCkgewotCQkJQm9keUVsZW1lbnQgYm9keSA9ICgoRG9jdW1lbnRDb250ZW50RWxlbWVudCkgcm9vdCkuZ2V0Qm9keUVsZW1lbnQoKTsKLQkJCUNvbnRlbnRCYXNlRWxlbWVudCBjb250ZW50ID0gYm9keS5nZXRDb250ZW50KCk7Ci0JCQlDb250ZW50VHlwZSB0eXBlID0gY29udGVudC5nZXRDb250ZW50VHlwZSgpOwotCQkJaWYgKCh0eXBlLmVxdWFscyhDb250ZW50VHlwZS5XUklURSkpCi0JCQkJCSYmIChjb250ZW50IGluc3RhbmNlb2YgVGV4dEVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGdldFRleHREb2N1bWVudENvbnRlbnQoKFRleHRFbGVtZW50KSBjb250ZW50KTsKLQkJCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoQ29udGVudFR5cGUuU1BSRUFEU0hFRVQpCi0JCQkJCSYmIChjb250ZW50IGluc3RhbmNlb2YgU3ByZWFkU2hlZXRFbGVtZW50KSkgewotCQkJCXJldHVybiBnZXRTcHJlYWRzaGVldERvY3VtZW50Q29udGVudCgoU3ByZWFkU2hlZXRFbGVtZW50KSBjb250ZW50KTsKLQkJCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoQ29udGVudFR5cGUuUFJFU0VOVEFUSU9OKQotCQkJCQkmJiAoY29udGVudCBpbnN0YW5jZW9mIFByZXNlbnRhdGlvbkVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGdldFByZXNlbnRhdGlvbkRvY3VtZW50Q29udGVudCgoUHJlc2VudGF0aW9uRWxlbWVudCkgY29udGVudCk7Ci0JCQl9IGVsc2UgewotCQkJCW5ldyBPREZFeGNlcHRpb24oImludmFsaWQgY29udGVudCBlbGVtZW50IikucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQluZXcgT0RGRXhjZXB0aW9uKCJpbnZhbGlkIG9kZiBkb2N1bWVudCIpLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9jb252ZXJ0ZXIvT0RGQ29udmVydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvY29udmVydGVyL09ERkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGU1YzQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9jb252ZXJ0ZXIvT0RGQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5jb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLQotLyoqCi0gKiBPREYgY29udmVydGVyIGNsYXNzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBPREZDb252ZXJ0ZXIgZXh0ZW5kcyBUZXh0RXh0cmFjdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRCA9ICJhY3RmLW9kZi1jb250ZW50LWlkIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9BVFRSX09ERl9UQUdOQU1FID0gIm9kZi10YWduYW1lIjsKLQotCXZvaWQgc2V0RG9jdW1lbnQoT0RGRG9jdW1lbnQgZG9jdW1lbnQpOwotCi0Jdm9pZCBjb252ZXJ0RG9jdW1lbnQoU3RyaW5nIGZpbGVOYW1lLCBib29sZWFuIGVuYWJsZVN0eWxlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9jb252ZXJ0ZXIvT0RGQ29udmVydGVyQ3JlYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2NvbnZlcnRlci9PREZDb252ZXJ0ZXJDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjM1ODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2NvbnZlcnRlci9PREZDb252ZXJ0ZXJDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5jb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5jb252ZXJ0ZXIuaW1wbC5IVE1MQ29udmVydGVyOwotCi0vKioKLSAqIEZhY3RvcnkgY2xhc3MgdG8gY3JlYXRlIE9ERiBjb252ZXJ0ZXIgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIE9ERkNvbnZlcnRlckNyZWF0b3IgewotCXN0YXRpYyBwdWJsaWMgT0RGQ29udmVydGVyIGNyZWF0ZUhUTUxDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiAoT0RGQ29udmVydGVyKSAobmV3IEhUTUxDb252ZXJ0ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2NvbnZlcnRlci9PREZDb252ZXJ0ZXJVdGlscy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2NvbnZlcnRlci9PREZDb252ZXJ0ZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjE4YzFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9jb252ZXJ0ZXIvT0RGQ29udmVydGVyVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLmNvbnZlcnRlcjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHVzZWQgYnkgT0RGIGNvbnZlcnRlciBjbGFzc2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBPREZDb252ZXJ0ZXJVdGlscyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFhNTENoYXJhY3RlcihTdHJpbmcgdmFsKSB7Ci0JCVN0cmluZyBuZXdWYWwgPSB2YWwucmVwbGFjZUFsbCgiJiIsICImYW1wOyIpOwotCQluZXdWYWwgPSBuZXdWYWwucmVwbGFjZUFsbCgiPCIsICImbHQ7Iik7Ci0JCW5ld1ZhbCA9IG5ld1ZhbC5yZXBsYWNlQWxsKCI+IiwgIiZndDsiKTsKLQkJcmV0dXJuIG5ld1ZhbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9kb20vb2RmL3V0aWwvY29udmVydGVyL1RleHRFeHRyYWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9jb252ZXJ0ZXIvVGV4dEV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDNjZjc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9jb252ZXJ0ZXIvVGV4dEV4dHJhY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuY29udmVydGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuT0RGRWxlbWVudDsKLQotLyoqCi0gKiBDbGFzcyB0aGF0IGV4dHJhY3QgdGV4dCBjb250ZW50cyBzaG91bGQgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRleHRFeHRyYWN0b3IgewotCWJvb2xlYW4gZXh0cmFjdENvbnRlbnQoV3JpdGVyIHdyaXRlciwgRmlsZSBkaXIsIE9ERkVsZW1lbnQgZWxlbSwKLQkJCWJvb2xlYW4gZW5hYmxlU3R5bGUpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2NvbnZlcnRlci9pbXBsL0hUTUxDb252ZXJ0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9jb252ZXJ0ZXIvaW1wbC9IVE1MQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZWJmYzEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2NvbnZlcnRlci9pbXBsL0hUTUxDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudXRpbC5jb252ZXJ0ZXIuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHMuQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuQ29udGVudEJhc2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmJhc2UuaW1wbC5PREZFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuY29udGVudC5JRWRpdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRnJhbWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkltYWdlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5QYWdlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5UZXh0Qm94RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLkJvZHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5vZmZpY2UuRG9jdW1lbnRDb250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYub2ZmaWNlLlByZXNlbnRhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5TcHJlYWRTaGVldEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYucHJlc2VudGF0aW9uLk5vdGVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuRGVmYXVsdFN0eWxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuRm9udEZhY2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5HcmFwaGljUHJvcGVydGllc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnN0eWxlLlBhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5TdHlsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuU3R5bGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5zdHlsZS5UYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuVGFibGVDb2x1bW5Qcm9wZXJ0aWVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuVGFibGVQcm9wZXJ0aWVzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuc3R5bGUuVGV4dFByb3BlcnRpZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNlbGxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNvbHVtbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ29sdW1uc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVIZWFkZXJSb3dzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGFibGUuVGFibGVSb3dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LkFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LkNoYW5nZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuQ2hhbmdlRW5kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5DaGFuZ2VTdGFydEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuSEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuTGlzdEl0ZW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0Lkxpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5MaXN0TGV2ZWxTdHlsZU51bWJlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuTGlzdFN0eWxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5QRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5TRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5TZXF1ZW5jZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuU3BhbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGFiRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UZXh0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLmNvbnZlcnRlci5PREZDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnhsaW5rLlhMaW5rQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC54cGF0aC5YUGF0aFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIEhUTUxDb252ZXJ0ZXIgaW1wbGVtZW50cyBPREZDb252ZXJ0ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0VOQ09ESU5HID0gIlVURjgiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9ERl9DU1NfRklMRSA9ICJPREYuY3NzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0hFQURFUiA9ICI8aHRtbD48aGVhZD48TUVUQSBodHRwLWVxdWl2PSdDb250ZW50LVR5cGUnIGNvbnRlbnQ9J3RleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcvPiIKLQkJCSsgIjxtZXRhIGNvbnRlbnQ9J3RleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcgaHR0cC1lcXVpdj0nQ29udGVudC10eXBlJy8+PHRpdGxlPjwvdGl0bGU+IgotCQkJKyAiPGxpbmsgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2NzcycgaHJlZj0nIgotCQkJKyBPREZfQ1NTX0ZJTEUKLQkJCSsgIicvPjwvaGVhZD4iOwotCi0JcHJpdmF0ZSBkb3VibGUgb2RmVmVyc2lvbiA9IC0xLjA7Ci0KLQlwcml2YXRlIE9ERkVsZW1lbnQgY3VyRWxlbSA9IG51bGw7Ci0KLQlwcml2YXRlIFRleHRFeHRyYWN0b3JJbXBsIHRleHRFeHRyYWN0b3I7Ci0KLQlwdWJsaWMgSFRNTENvbnZlcnRlcigpIHsKLQkJdGV4dEV4dHJhY3RvciA9IG5ldyBUZXh0RXh0cmFjdG9ySW1wbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KE9ERkRvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMuY3VyRWxlbSA9IChPREZFbGVtZW50KSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJdGhpcy50ZXh0RXh0cmFjdG9yLnNldERvY3VtZW50KGRvY3VtZW50LCB0aGlzKTsKLQl9Ci0KLQkvLyBmb3IgTm90ZXM4LCBOb3Rlczggc2F2ZSBkb2N1bWVudCBieSBPREYgMS4xIHNjaGVtYSwKLQkvLyBidXQgb2RmOnZlcnNpb24gaXMgc2V0IGFzIDEuMAotCS8vIGlmIHNwZWNpZnkgb2RmOnZlcnNpb24gYnkgdGhpcyBmdW5jdGlvbiwKLQkvLyBkbyBub3QgdXNlIG9kZjp2ZXJzaW9uIGRlZmluZWQgaW4gZWFjaCBPREYgZmlsZQotCXB1YmxpYyB2b2lkIHNldE9kZlZlcnNpb24oZG91YmxlIG9kZlZlcnNpb24pIHsKLQkJdGhpcy5vZGZWZXJzaW9uID0gb2RmVmVyc2lvbjsKLQkJdGhpcy50ZXh0RXh0cmFjdG9yLnNldE9kZlZlcnNpb24ob2RmVmVyc2lvbik7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SFRNTFRhZ05hbWUoT0RGRWxlbWVudCBlbGVtKSB7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgSW1hZ2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gImltZyI7Ci0JCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIEhFbGVtZW50KSB7Ci0JCQlpbnQgbGV2ZWwgPSAoKEhFbGVtZW50KSBlbGVtKS5nZXRBdHRyVGV4dE91dGxpbmVMZXZlbCgpOwotCQkJaWYgKGxldmVsID4gNikKLQkJCQlsZXZlbCA9IDY7Ci0JCQlyZXR1cm4gImgiICsgbGV2ZWw7Ci0JCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIExpc3RFbGVtZW50KSB7Ci0JCQlTdHlsZUVsZW1lbnQgc3R5bGUgPSAoKExpc3RFbGVtZW50KSBlbGVtKQotCQkJCQkuZ2V0TGlzdExldmVsU3R5bGVFbGVtZW50KCk7Ci0JCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJCWlmIChzdHlsZSBpbnN0YW5jZW9mIExpc3RMZXZlbFN0eWxlQnVsbGV0RWxlbWVudCkgewotCQkJCQlyZXR1cm4gInVsIjsKLQkJCQl9IGVsc2UgaWYgKHN0eWxlIGluc3RhbmNlb2YgTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAib2wiOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgVGFibGVDZWxsRWxlbWVudCkgewotCQkJTm9kZSBwYXJlbnQgPSBlbGVtLmdldFBhcmVudE5vZGUoKTsKLQkJCU5vZGUgZ3BhcmVudCA9IG51bGw7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQkJZ3BhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgVGFibGVSb3dFbGVtZW50KQotCQkJCQkmJiAoZ3BhcmVudCAhPSBudWxsKQotCQkJCQkmJiAoZ3BhcmVudCBpbnN0YW5jZW9mIFRhYmxlSGVhZGVyUm93c0VsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuICJ0aCI7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAidGQiOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFBFbGVtZW50KQotCQkJdGFnTmFtZSA9ICJwIjsKLQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBBRWxlbWVudCkKLQkJCXRhZ05hbWUgPSAiYSI7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgU3BhbkVsZW1lbnQpCi0JCQl0YWdOYW1lID0gInNwYW4iOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFRhYkVsZW1lbnQpCi0JCQl0YWdOYW1lID0gInNwYW4iOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFNlcXVlbmNlRWxlbWVudCkKLQkJCXRhZ05hbWUgPSAic3BhbiI7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgU0VsZW1lbnQpCi0JCQl0YWdOYW1lID0gInNwYW4iOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIExpc3RJdGVtRWxlbWVudCkKLQkJCXRhZ05hbWUgPSAibGkiOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFRhYmxlRWxlbWVudCkKLQkJCXRhZ05hbWUgPSAidGFibGUiOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFRhYmxlSGVhZGVyUm93c0VsZW1lbnQpCi0JCQl0YWdOYW1lID0gInRoZWFkIjsKLQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBUYWJsZVJvd0VsZW1lbnQpCi0JCQl0YWdOYW1lID0gInRyIjsKLQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBUYWJsZUNvbHVtbnNFbGVtZW50KQotCQkJdGFnTmFtZSA9ICJjb2xncm91cCI7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgVGFibGVDb2x1bW5FbGVtZW50KQotCQkJdGFnTmFtZSA9ICJjb2wiOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIENoYW5nZUVsZW1lbnQpCi0JCQl0YWdOYW1lID0gInNwYW4iOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIENoYW5nZVN0YXJ0RWxlbWVudCkKLQkJCXRhZ05hbWUgPSAic3BhbiI7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgQ2hhbmdlRW5kRWxlbWVudCkKLQkJCXRhZ05hbWUgPSAic3BhbiI7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQl0YWdOYW1lID0gImRpdiI7Ci0JCXJldHVybiB0YWdOYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0eWxlQ2xhc3NOYW1lKE9ERkVsZW1lbnQgZWxlbSkgewotCQlTdHJpbmcgc3R5bGVDbGFzc05hbWUgPSBudWxsOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIExpc3RFbGVtZW50KSB7Ci0JCQlMaXN0RWxlbWVudCB0b3BMaXN0RWxlbSA9ICgoTGlzdEVsZW1lbnQpIGVsZW0pCi0JCQkJCS5nZXRUb3BMZXZlbExpc3RFbGVtZW50KCk7Ci0JCQlsb25nIGxldmVsID0gKChMaXN0RWxlbWVudCkgZWxlbSkuZ2V0TGlzdExldmVsKCk7Ci0JCQlzdHlsZUNsYXNzTmFtZSA9IHRvcExpc3RFbGVtLmdldEF0dHJpYnV0ZU5TKAotCQkJCQlUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGV4dENvbnN0YW50cy5BVFRSX1NUWUxFX05BTUUpCi0JCQkJCSsgbGV2ZWw7Ci0JCX0gZWxzZSB7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBlbGVtLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgYXR0ciA9IGF0dHJzLml0ZW0oaSk7Ci0JCQkJaWYgKCJzdHlsZS1uYW1lIi5lcXVhbHMoYXR0ci5nZXRMb2NhbE5hbWUoKSkpIHsKLQkJCQkJaWYgKHN0eWxlQ2xhc3NOYW1lID09IG51bGwpCi0JCQkJCQlzdHlsZUNsYXNzTmFtZSA9IG5ldyBTdHJpbmcoKTsKLQkJCQkJZWxzZQotCQkJCQkJc3R5bGVDbGFzc05hbWUgKz0gIiAiOwotCQkJCQlzdHlsZUNsYXNzTmFtZSArPSBhdHRyLmdldE5vZGVWYWx1ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3R5bGVDbGFzc05hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXh0cmFjdENvbnRlbnQoV3JpdGVyIHdyaXRlciwgRmlsZSBkaXIsIE9ERkVsZW1lbnQgZWxlbSwKLQkJCWJvb2xlYW4gZW5hYmxlU3R5bGUpIHsKLQkJU3RyaW5nIGh0bWxUYWcgPSBnZXRIVE1MVGFnTmFtZShlbGVtKTsKLQkJLy8gd3JpdGUgdGFnIG5hbWUKLQkJaWYgKGh0bWxUYWcgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl3cml0ZXIud3JpdGUoIjwiICsgaHRtbFRhZyArICIgIiArIE9VVFBVVF9BVFRSX09ERl9UQUdOQU1FCi0JCQkJCQkrICI9JyIgKyBlbGVtLmdldFRhZ05hbWUoKSArICInIGlkPSciCi0JCQkJCQkrIGVsZW0uZ2V0QXR0cmlidXRlKE9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEKQotCQkJCQkJKyAiJyBuYW1lPSciCi0JCQkJCQkrIGVsZW0uZ2V0QXR0cmlidXRlKE9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEKSArICInICIKLQkJCQkJCSsgT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQgKyAiPSciCi0JCQkJCQkrIGVsZW0uZ2V0QXR0cmlidXRlKE9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEKSArICInIik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlmIChlbmFibGVTdHlsZSkgewotCQkJCVN0cmluZyBzdHlsZUNsYXNzTmFtZSA9IGdldFN0eWxlQ2xhc3NOYW1lKGVsZW0pOwotCQkJCWlmIChzdHlsZUNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl3cml0ZXIud3JpdGUoIiBjbGFzcz0nIiArIHN0eWxlQ2xhc3NOYW1lICsgIiciKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBJbWFnZUVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgaHJlZiA9ICgoSW1hZ2VFbGVtZW50KSBlbGVtKS5nZXRBdHRyWGxpbmtIcmVmKCk7Ci0JCQkJaWYgKCFocmVmLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSAmJiAhaHJlZi5zdGFydHNXaXRoKCJodHRwczovLyIpCi0JCQkJCQkmJiAhaHJlZi5zdGFydHNXaXRoKCJmaWxlOi8vIikKLQkJCQkJCSYmICFocmVmLnN0YXJ0c1dpdGgoImNocm9tZTovLyIpKSB7Ci0JCQkJCXRleHRFeHRyYWN0b3IuZXh0cmFjdEVtYmVkRmlsZShlbGVtLCBkaXIsIGhyZWYpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQl3cml0ZXIud3JpdGUoIiBzcmM9JyIgKyBocmVmICsgIiciKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCi0JCQkJT0RGRWxlbWVudCBvZGZFbGVtID0gbnVsbDsKLQkJCQlpZiAodGhpcy5vZGZWZXJzaW9uICE9IC0xLjApIHsKLQkJCQkJb2RmRWxlbSA9ICgoSW1hZ2VFbGVtZW50KSBlbGVtKQotCQkJCQkJCS5nZXRTaG9ydERlc2NFbGVtZW50KG9kZlZlcnNpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9kZkVsZW0gPSAoKEltYWdlRWxlbWVudCkgZWxlbSkuZ2V0U2hvcnREZXNjRWxlbWVudCgpOwotCQkJCX0KLQotCQkJCWlmIChvZGZFbGVtICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGFsdFRleHQgPSAoU3RyaW5nKSAoKElFZGl0YWJsZSkgb2RmRWxlbSkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKGFsdFRleHQgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl3cml0ZXIud3JpdGUoIiBhbHQ9JyIgKyBhbHRUZXh0ICsgIiciKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRnJhbWVFbGVtZW50IGZyYW1lRWxlbSA9ICgoSW1hZ2VFbGVtZW50KSBlbGVtKQotCQkJCQkJCS5nZXRGcmFtZUVsZW1lbnQoKTsKLQkJCQkJaWYgKGZyYW1lRWxlbSAhPSBudWxsKSB7Ci0JCQkJCQlUZXh0Qm94RWxlbWVudCBjYXB0aW9uRWxlbSA9IG51bGw7Ci0JCQkJCQlpZiAob2RmVmVyc2lvbiAhPSAtMS4wKSB7Ci0JCQkJCQkJY2FwdGlvbkVsZW0gPSBmcmFtZUVsZW0KLQkJCQkJCQkJCS5nZXRCb3VuZENhcHRpb25UZXh0Qm94RWxlbWVudChvZGZWZXJzaW9uKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY2FwdGlvbkVsZW0gPSBmcmFtZUVsZW0KLQkJCQkJCQkJCS5nZXRCb3VuZENhcHRpb25UZXh0Qm94RWxlbWVudCgpOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoY2FwdGlvbkVsZW0gIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyBjYXB0aW9uVGV4dCA9IGNhcHRpb25FbGVtLmdldFRleHRDb250ZW50KCk7Ci0JCQkJCQkJaWYgKGNhcHRpb25UZXh0ICE9IG51bGwpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXdyaXRlci53cml0ZSgiIGFsdD0nJyIpOwotCQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlTdHJpbmcgd2lkdGggPSBmcmFtZUVsZW0uZ2V0QXR0clN2Z1dpZHRoKCk7Ci0JCQkJCQlpZiAod2lkdGggPT0gbnVsbCkKLQkJCQkJCQl3aWR0aCA9ICJhdXRvIjsKLQkJCQkJCVN0cmluZyBoZWlnaHQgPSBmcmFtZUVsZW0uZ2V0QXR0clN2Z0hlaWdodCgpOwotCQkJCQkJaWYgKGhlaWdodCA9PSBudWxsKQotCQkJCQkJCWhlaWdodCA9ICJhdXRvIjsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJd3JpdGVyLndyaXRlKCIgc3R5bGU9J3dpZHRoOiIgKyB3aWR0aCArICI7aGVpZ2h0OiIKLQkJCQkJCQkJCSsgaGVpZ2h0ICsgIjsnIik7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIEFFbGVtZW50KSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSAoKEFFbGVtZW50KSBlbGVtKS5nZXRUeXBlKCk7Ci0JCQkJaWYgKFhMaW5rQ29uc3RhbnRzLkxJTktfVFlQRV9TSU1QTEUuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCVN0cmluZyBocmVmID0gKChBRWxlbWVudCkgZWxlbSkuZ2V0SHJlZigpOwotCQkJCQlpZiAoaHJlZi5zdGFydHNXaXRoKCIjIikpIHsKLQkJCQkJCU9ERkVsZW1lbnQgbGlua0VsZW0gPSAoKEFFbGVtZW50KSBlbGVtKQotCQkJCQkJCQkuZ2V0SHJlZkVsZW1lbnQoKTsKLQkJCQkJCWlmIChsaW5rRWxlbSAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJd3JpdGVyCi0JCQkJCQkJCQkJLndyaXRlKCIgaHJlZj0nIyIKLQkJCQkJCQkJCQkJCSsgbGlua0VsZW0KLQkJCQkJCQkJCQkJCQkJLmdldEF0dHJpYnV0ZShPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQpCi0JCQkJCQkJCQkJCQkrICInIik7Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJd3JpdGVyLndyaXRlKCIgaHJlZj0nIiArIGhyZWYgKyAiJyIpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBUYWJsZUNvbHVtbkVsZW1lbnQpIHsKLQkJCQlpbnQgcmVwZWF0ID0gKChUYWJsZUNvbHVtbkVsZW1lbnQpIGVsZW0pCi0JCQkJCQkuZ2V0QXR0clRhYmxlTnVtYmVyQ29sdW1uc1JlcGVhdGVkKCk7Ci0JCQkJaWYgKHJlcGVhdCA+IDEpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXdyaXRlci53cml0ZSgiPiIpOwotCQkJCQkJd3JpdGVyLndyaXRlKCI8LyIgKyBodG1sVGFnICsgIj5cbiIpOwotCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCByZXBlYXQ7IGkrKykKLQkJCQkJCQl3cml0ZXIud3JpdGUoIjwiICsgaHRtbFRhZyArICIvPlxuIik7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIFRhYmxlQ2VsbEVsZW1lbnQpIHsKLQkJCQlpbnQgc3BhbiA9ICgoVGFibGVDZWxsRWxlbWVudCkgZWxlbSkKLQkJCQkJCS5nZXRBdHRyVGFibGVOdW1iZXJDb2x1bW5zU3Bhbm5lZCgpOwotCQkJCWlmIChzcGFuID4gMSkgewotCQkJCQl0cnkgewotCQkJCQkJd3JpdGVyLndyaXRlKCIgY29sc3Bhbj0nIiArIHNwYW4gKyAiJyIpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWludCByZXBlYXQgPSAoKFRhYmxlQ2VsbEVsZW1lbnQpIGVsZW0pCi0JCQkJCQkuZ2V0QXR0clRhYmxlTnVtYmVyQ29sdW1uc1JlcGVhdGVkKCk7Ci0JCQkJaWYgKHJlcGVhdCA+IDEpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXdyaXRlci53cml0ZSgiPiIpOwotCQkJCQkJd3JpdGVyLndyaXRlKCI8LyIgKyBodG1sVGFnICsgIj5cbiIpOwotCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCByZXBlYXQ7IGkrKykKLQkJCQkJCQl3cml0ZXIud3JpdGUoIjwiICsgaHRtbFRhZyArICIvPlxuIik7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQl3cml0ZXIud3JpdGUoIj4iKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBhZGRlZFRleHRDb250ZW50ID0gdGV4dEV4dHJhY3Rvci5leHRyYWN0Q29udGVudCh3cml0ZXIsIGRpciwKLQkJCQllbGVtLCBlbmFibGVTdHlsZSk7Ci0KLQkJLy8gd3JpdGUgY2xvc2UgdGFnCi0JCWlmIChodG1sVGFnICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJd3JpdGVyLndyaXRlKCI8LyIgKyBodG1sVGFnICsgIj5cbiIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYWRkZWRUZXh0Q29udGVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29udmVydFRleHREb2MoUHJpbnRXcml0ZXIgd3JpdGVyLCBGaWxlIGRpciwKLQkJCVRleHRFbGVtZW50IHRleHRFbGVtLCBib29sZWFuIGVuYWJsZVN0eWxlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRleHRFbGVtLmdldENoaWxkSXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPREZFbGVtZW50IGNoaWxkID0gKE9ERkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJZXh0cmFjdENvbnRlbnQod3JpdGVyLCBkaXIsIGNoaWxkLCBlbmFibGVTdHlsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29udmVydFNwcmVhZHNoZWV0RG9jKFByaW50V3JpdGVyIHdyaXRlciwgRmlsZSBkaXIsCi0JCQlTcHJlYWRTaGVldEVsZW1lbnQgc3ByZWFkRWxlbSwgYm9vbGVhbiBlbmFibGVTdHlsZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHNwcmVhZEVsZW0uZ2V0VGFibGVTaXplKCk7IGkrKykgewotCQkJVGFibGVFbGVtZW50IHRhYmxlID0gc3ByZWFkRWxlbS5nZXRUYWJsZShpKTsKLQkJCXdyaXRlci53cml0ZSgiPGgxPiIgKyB0YWJsZS5nZXRBdHRyVGFibGVOYW1lKCkgKyAiPC9oMT4iKTsKLQkJCWV4dHJhY3RDb250ZW50KHdyaXRlciwgZGlyLCB0YWJsZSwgZW5hYmxlU3R5bGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnZlcnRQcmVzZW50YXRpb25Eb2MoUHJpbnRXcml0ZXIgd3JpdGVyLCBGaWxlIGRpciwKLQkJCVByZXNlbnRhdGlvbkVsZW1lbnQgcHJlc2VuRWxlbSwgYm9vbGVhbiBlbmFibGVTdHlsZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHByZXNlbkVsZW0uZ2V0UGFnZVNpemUoKTsgaSsrKSB7Ci0JCQlQYWdlRWxlbWVudCBwYWdlID0gcHJlc2VuRWxlbS5nZXRQYWdlKGkpOwotCQkJd3JpdGVyLndyaXRlKCI8ZGl2IiArICIgIiArIE9VVFBVVF9BVFRSX09ERl9UQUdOQU1FICsgIj0nIgotCQkJCQkrIHBhZ2UuZ2V0VGFnTmFtZSgpICsgIicgaWQ9JyIKLQkJCQkJKyBwYWdlLmdldEF0dHJpYnV0ZShPVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRCkKLQkJCQkJKyAiJyBuYW1lPSciCi0JCQkJCSsgcGFnZS5nZXRBdHRyaWJ1dGUoT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQpICsgIicgIgotCQkJCQkrIE9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEICsgIj0nIgotCQkJCQkrIHBhZ2UuZ2V0QXR0cmlidXRlKE9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEKQotCQkJCQkrICInPjxoMT5QYWdlICIgKyAoaSArIDEpICsgIjwvaDE+Iik7Ci0JCQkvKgotCQkJICogTm9kZUxpc3QgY2hpbGRyZW4gPSBwYWdlLmdldENoaWxkTm9kZXMoKTsgZm9yIChpbnQgaiA9IDA7IGogPAotCQkJICogY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGorKykgeyBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShqKTsKLQkJCSAqLwotCQkJTGlzdDxPREZFbGVtZW50PiBjaGlsZHJlbiA9IHBhZ2UuZ2V0Q2hpbGROb2Rlc0luTmF2T3JkZXIoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4uc2l6ZSgpOyBqKyspIHsKLQkJCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uZ2V0KGopOwotCQkJCWlmICgoY2hpbGQgaW5zdGFuY2VvZiBPREZFbGVtZW50KQotCQkJCQkJJiYgKCEoY2hpbGQgaW5zdGFuY2VvZiBOb3Rlc0VsZW1lbnQpKSkgewotCQkJCQlleHRyYWN0Q29udGVudCh3cml0ZXIsIGRpciwgKE9ERkVsZW1lbnQpIGNoaWxkLCBlbmFibGVTdHlsZSk7Ci0JCQkJfQotCQkJfQotCQkJTm90ZXNFbGVtZW50IG5vdGVzRWxlbSA9IHBhZ2UuZ2V0UHJlc2VudGF0aW9uTm90ZXNFbGVtZW50KCk7Ci0JCQlpZiAobm90ZXNFbGVtICE9IG51bGwpIHsKLQkJCQl3cml0ZXIud3JpdGUoIjxoMj5Ob3RlcyBvZiBQYWdlICIgKyAoaSArIDEpICsgIjwvaDI+Iik7Ci0JCQkJZXh0cmFjdENvbnRlbnQod3JpdGVyLCBkaXIsIChPREZFbGVtZW50KSBub3Rlc0VsZW0sIGVuYWJsZVN0eWxlKTsKLQkJCX0KLQkJCXdyaXRlci53cml0ZSgiPC9kaXY+Iik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29udmVydERvY3VtZW50KFByaW50V3JpdGVyIHdyaXRlciwgRmlsZSBkaXIsCi0JCQlib29sZWFuIGVuYWJsZVN0eWxlKSB7Ci0JCWlmIChjdXJFbGVtID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUVsZW1lbnQgcm9vdCA9IGN1ckVsZW0uZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlpZiAocm9vdCBpbnN0YW5jZW9mIERvY3VtZW50Q29udGVudEVsZW1lbnQpIHsKLQkJCXdyaXRlci53cml0ZShIVE1MX0hFQURFUik7Ci0JCQl3cml0ZXIud3JpdGUoIjxib2R5PiIpOwotCi0JCQlCb2R5RWxlbWVudCBib2R5ID0gKChEb2N1bWVudENvbnRlbnRFbGVtZW50KSByb290KS5nZXRCb2R5RWxlbWVudCgpOwotCQkJQ29udGVudEJhc2VFbGVtZW50IGNvbnRlbnQgPSBib2R5LmdldENvbnRlbnQoKTsKLQkJCUNvbnRlbnRUeXBlIHR5cGUgPSBjb250ZW50LmdldENvbnRlbnRUeXBlKCk7Ci0JCQlpZiAoKHR5cGUuZXF1YWxzKENvbnRlbnRUeXBlLldSSVRFKSkKLQkJCQkJJiYgKGNvbnRlbnQgaW5zdGFuY2VvZiBUZXh0RWxlbWVudCkpIHsKLQkJCQljb252ZXJ0VGV4dERvYyh3cml0ZXIsIGRpciwgKFRleHRFbGVtZW50KSBjb250ZW50LCBlbmFibGVTdHlsZSk7Ci0JCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKENvbnRlbnRUeXBlLlNQUkVBRFNIRUVUKQotCQkJCQkmJiAoY29udGVudCBpbnN0YW5jZW9mIFNwcmVhZFNoZWV0RWxlbWVudCkpIHsKLQkJCQljb252ZXJ0U3ByZWFkc2hlZXREb2Mod3JpdGVyLCBkaXIsCi0JCQkJCQkoU3ByZWFkU2hlZXRFbGVtZW50KSBjb250ZW50LCBlbmFibGVTdHlsZSk7Ci0JCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKENvbnRlbnRUeXBlLlBSRVNFTlRBVElPTikKLQkJCQkJJiYgKGNvbnRlbnQgaW5zdGFuY2VvZiBQcmVzZW50YXRpb25FbGVtZW50KSkgewotCQkJCWNvbnZlcnRQcmVzZW50YXRpb25Eb2Mod3JpdGVyLCBkaXIsCi0JCQkJCQkoUHJlc2VudGF0aW9uRWxlbWVudCkgY29udGVudCwgZW5hYmxlU3R5bGUpOwotCQkJfSBlbHNlIHsKLQkJCQluZXcgT0RGRXhjZXB0aW9uKCJpbnZhbGlkIGNvbnRlbnQgZWxlbWVudCIpLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCQl3cml0ZXIud3JpdGUoIjwvYm9keT48L2h0bWw+Iik7Ci0JCX0gZWxzZSB7Ci0JCQluZXcgT0RGRXhjZXB0aW9uKCJpbnZhbGlkIG9kZiBkb2N1bWVudCIpLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVDc3NWYWx1ZUJ5VGV4dFByb3BlcnRpZXNFbGVtZW50KFByaW50V3JpdGVyIHdyaXRlciwKLQkJCVN0eWxlRWxlbWVudCBzdHlsZUVsZW0pIHsKLQkJTm9kZUxpc3QgdGV4dFByb3BzID0gc3R5bGVFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1RFWFRfUFJPUEVSVElFUyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dFByb3BzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCVRleHRQcm9wZXJ0aWVzRWxlbWVudCBwcm9wID0gKFRleHRQcm9wZXJ0aWVzRWxlbWVudCkgdGV4dFByb3BzCi0JCQkJCS5pdGVtKGkpOwotCQkJU3RyaW5nIGZvbnROYW1lID0gcHJvcC5nZXRBdHRyU3R5bGVGb250TmFtZSgpOwotCQkJaWYgKGZvbnROYW1lICE9IG51bGwpIHsKLQkJCQlPREZFbGVtZW50IGZvbnRGYWNlRWxlbSA9ICgoT0RGRWxlbWVudEltcGwpIHN0eWxlRWxlbSkKLQkJCQkJCS5maW5kRWxlbWVudEJ5QXR0clZhbHVlKAotCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX0ZPTlRfRkFDRSwKLQkJCQkJCQkJU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9OQU1FLCBmb250TmFtZSk7Ci0JCQkJaWYgKGZvbnRGYWNlRWxlbSA9PSBudWxsKSB7Ci0JCQkJCWZvbnRGYWNlRWxlbSA9ICgoT0RGRWxlbWVudEltcGwpIHN0eWxlRWxlbSkKLQkJCQkJCQkuZmluZEVsZW1lbnRCeUF0dHJWYWx1ZUZyb21TdHlsZURvYygKLQkJCQkJCQkJCVN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX0ZPTlRfRkFDRSwKLQkJCQkJCQkJCVN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUsIGZvbnROYW1lKTsKLQkJCQl9Ci0JCQkJaWYgKGZvbnRGYWNlRWxlbSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBmb250RmFtaWx5ID0gKChGb250RmFjZUVsZW1lbnQpIGZvbnRGYWNlRWxlbSkKLQkJCQkJCQkuZ2V0QXR0clN2Z0ZvbnRGYW1pbHkoKTsKLQkJCQkJd3JpdGVyLndyaXRlKCJmb250LWZhbWlseToiICsgZm9udEZhbWlseSArICI7Iik7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIGZvbnRTaXplID0gcHJvcC5nZXRBdHRyRm9ybWF0Rm9udFNpemUoKTsKLQkJCWlmIChmb250U2l6ZSAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJmb250LXNpemU6IiArIGZvbnRTaXplICsgIjsiKTsKLQkJCX0KLQkJCVN0cmluZyBmb250Q29sb3IgPSBwcm9wLmdldEF0dHJGb3JtYXRDb2xvcigpOwotCQkJaWYgKGZvbnRDb2xvciAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJjb2xvcjoiICsgZm9udENvbG9yICsgIjsiKTsKLQkJCX0KLQkJCVN0cmluZyBiYWNrZ3JvdW5kQ29sb3IgPSBwcm9wLmdldEF0dHJGb3JtYXRCYWNrZ3JvdW5kQ29sb3IoKTsKLQkJCWlmIChiYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgewotCQkJCXdyaXRlci53cml0ZSgiYmFja2dyb3VuZC1jb2xvcjoiICsgYmFja2dyb3VuZENvbG9yICsgIjsiKTsKLQkJCX0KLQkJCVN0cmluZyBmb250V2VpZ2h0ID0gcHJvcC5nZXRBdHRyRm9ybWF0Rm9udFdlaWdodCgpOwotCQkJaWYgKChmb250V2VpZ2h0ICE9IG51bGwpICYmIChmb250V2VpZ2h0LmVxdWFscygiYm9sZCIpKSkgewotCQkJCXdyaXRlci53cml0ZSgiZm9udC13ZWlnaHQ6Ym9sZDsiKTsKLQkJCX0KLQkJCVN0cmluZyBmb250U3R5bGUgPSBwcm9wLmdldEF0dHJGb3JtYXRGb250U3R5bGUoKTsKLQkJCWlmICgoZm9udFN0eWxlICE9IG51bGwpICYmIChmb250U3R5bGUuZXF1YWxzKCJpdGFsaWMiKSkpIHsKLQkJCQl3cml0ZXIud3JpdGUoImZvbnQtc3R5bGU6aXRhbGljOyIpOwotCQkJfQotCQkJU3RyaW5nIHVuZGVyTGluZVN0eWxlID0gcHJvcC5nZXRBdHRyU3R5bGVUZXh0VW5kZXJsaW5lU3R5bGUoKTsKLQkJCWlmICgodW5kZXJMaW5lU3R5bGUgIT0gbnVsbCkgJiYgKHVuZGVyTGluZVN0eWxlLmVxdWFscygic29saWQiKSkpIHsKLQkJCQl3cml0ZXIud3JpdGUoInRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Iik7Ci0JCQl9Ci0JCQlTdHJpbmcgdGV4dFBvc2l0aW9uID0gcHJvcC5nZXRBdHRyU3R5bGVUZXh0UG9zaXRpb24oKTsKLQkJCWlmICh0ZXh0UG9zaXRpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHRleHRQb3NpdGlvblZhbHMgPSB0ZXh0UG9zaXRpb24uc3BsaXQoIiAiKTsKLQkJCQlpZiAodGV4dFBvc2l0aW9uVmFscy5sZW5ndGggPT0gMikgewotCQkJCQlpZiAodGV4dFBvc2l0aW9uVmFsc1swXS5lcXVhbHMoInN1cGVyIikpIHsKLQkJCQkJCXdyaXRlci53cml0ZSgidmVydGljYWwtYWxpZ246c3VwZXI7Iik7Ci0JCQkJCX0gZWxzZSBpZiAodGV4dFBvc2l0aW9uVmFsc1swXS5lcXVhbHMoInN1YiIpKSB7Ci0JCQkJCQl3cml0ZXIud3JpdGUoInZlcnRpY2FsLWFsaWduOnN1YjsiKTsKLQkJCQkJfQotCQkJCQl3cml0ZXIud3JpdGUoImZvbnQtc2l6ZToiICsgdGV4dFBvc2l0aW9uVmFsc1sxXSArICI7Iik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ3NzVmFsdWVCeVBhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50KFByaW50V3JpdGVyIHdyaXRlciwKLQkJCVN0eWxlRWxlbWVudCBzdHlsZUVsZW0pIHsKLQkJTm9kZUxpc3QgcGFyYVByb3BzID0gc3R5bGVFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1BBUkFHUkFQSF9QUk9QRVJUSUVTKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhUHJvcHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJUGFyYWdyYXBoUHJvcGVydGllc0VsZW1lbnQgcHJvcCA9IChQYXJhZ3JhcGhQcm9wZXJ0aWVzRWxlbWVudCkgcGFyYVByb3BzCi0JCQkJCS5pdGVtKGkpOwotCQkJU3RyaW5nIGJhY2tncm91bmRDb2xvciA9IHByb3AuZ2V0QXR0ckZvcm1hdEJhY2tncm91bmRDb2xvcigpOwotCQkJaWYgKGJhY2tncm91bmRDb2xvciAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJiYWNrZ3JvdW5kLWNvbG9yOiIgKyBiYWNrZ3JvdW5kQ29sb3IgKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIHRleHRBbGlnbiA9IHByb3AuZ2V0QXR0ckZvcm1hdFRleHRBbGlnbigpOwotCQkJaWYgKHRleHRBbGlnbiAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJ0ZXh0LWFsaWduOiIgKyB0ZXh0QWxpZ24gKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIHZlcnRpY2FsQWxpZ24gPSBwcm9wLmdldEF0dHJTdHlsZVZlcnRpY2FsQWxpZ24oKTsKLQkJCWlmICh2ZXJ0aWNhbEFsaWduICE9IG51bGwpIHsKLQkJCQl3cml0ZXIud3JpdGUoInZlcnRpY2FsLWFsaWduOiIgKyB2ZXJ0aWNhbEFsaWduICsgIjsiKTsKLQkJCX0KLQkJCVN0cmluZyBtYXJnaW5MZWZ0ID0gcHJvcC5nZXRBdHRyRm9ybWF0TWFyZ2luTGVmdCgpOwotCQkJaWYgKG1hcmdpbkxlZnQgIT0gbnVsbCkgewotCQkJCXdyaXRlci53cml0ZSgibWFyZ2luLWxlZnQ6IiArIG1hcmdpbkxlZnQgKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIG1hcmdpblJpZ2h0ID0gcHJvcC5nZXRBdHRyRm9ybWF0TWFyZ2luUmlnaHQoKTsKLQkJCWlmIChtYXJnaW5SaWdodCAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJtYXJnaW4tcmlnaHQ6IiArIG1hcmdpblJpZ2h0ICsgIjsiKTsKLQkJCX0KLQkJCVN0cmluZyBtYXJnaW5Ub3AgPSBwcm9wLmdldEF0dHJGb3JtYXRNYXJnaW5Ub3AoKTsKLQkJCWlmIChtYXJnaW5Ub3AgIT0gbnVsbCkgewotCQkJCXdyaXRlci53cml0ZSgibWFyZ2luLXRvcDoiICsgbWFyZ2luVG9wICsgIjsiKTsKLQkJCX0KLQkJCVN0cmluZyBtYXJnaW5Cb3R0b20gPSBwcm9wLmdldEF0dHJGb3JtYXRNYXJnaW5Cb3R0b20oKTsKLQkJCWlmIChtYXJnaW5Cb3R0b20gIT0gbnVsbCkgewotCQkJCXdyaXRlci53cml0ZSgibWFyZ2luLWJvdHRvbToiICsgbWFyZ2luQm90dG9tICsgIjsiKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUNzc1ZhbHVlQnlHcmFwaGljUHJvcGVydGllc0VsZW1lbnQoUHJpbnRXcml0ZXIgd3JpdGVyLAotCQkJU3R5bGVFbGVtZW50IHN0eWxlRWxlbSkgewotCQlOb2RlTGlzdCBncmFwaGljUHJvcHMgPSBzdHlsZUVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfR1JBUEhJQ19QUk9QRVJUSUVTKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBncmFwaGljUHJvcHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJR3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50IHByb3AgPSAoR3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50KSBncmFwaGljUHJvcHMKLQkJCQkJLml0ZW0oaSk7Ci0JCQlTdHJpbmcgaG9yaXpvbnRhbFBvcyA9IHByb3AuZ2V0QXR0clN0eWxlSG9yaXpvbnRhbFBvcygpOwotCQkJaWYgKGhvcml6b250YWxQb3MgIT0gbnVsbCkgewotCQkJCWlmIChob3Jpem9udGFsUG9zLmVxdWFscygibGVmdCIpKSB7Ci0JCQkJCXdyaXRlci53cml0ZSgidGV4dC1hbGlnbjpsZWZ0OyIpOwotCQkJCX0gZWxzZSBpZiAoaG9yaXpvbnRhbFBvcy5lcXVhbHMoImNlbnRlciIpKSB7Ci0JCQkJCXdyaXRlci53cml0ZSgidGV4dC1hbGlnbjpjZW50ZXI7Iik7Ci0JCQkJfSBlbHNlIGlmIChob3Jpem9udGFsUG9zLmVxdWFscygicmlnaHQiKSkgewotCQkJCQl3cml0ZXIud3JpdGUoInRleHQtYWxpZ246cmlnaHQ7Iik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ3NzVmFsdWVCeVRhYmxlUHJvcGVydGllc0VsZW1lbnQoUHJpbnRXcml0ZXIgd3JpdGVyLAotCQkJU3R5bGVFbGVtZW50IHN0eWxlRWxlbSkgewotCQlOb2RlTGlzdCB0YWJsZVByb3BzID0gc3R5bGVFbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0JCQkJU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1RBQkxFX1BST1BFUlRJRVMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlUHJvcHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJVGFibGVQcm9wZXJ0aWVzRWxlbWVudCBwcm9wID0gKFRhYmxlUHJvcGVydGllc0VsZW1lbnQpIHRhYmxlUHJvcHMKLQkJCQkJLml0ZW0oaSk7Ci0JCQlTdHJpbmcgd2lkdGggPSBwcm9wLmdldEF0dHJTdHlsZVdpZHRoKCk7Ci0JCQlpZiAod2lkdGggIT0gbnVsbCkgewotCQkJCXdyaXRlci53cml0ZSgid2lkdGg6IiArIHdpZHRoICsgIjsiKTsKLQkJCX0KLQkJCVN0cmluZyBib3JkZXJNb2RlbCA9IHByb3AuZ2V0QXR0clRhYmxlQm9yZGVyTW9kZWwoKTsKLQkJCWlmIChib3JkZXJNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGJvcmRlck1vZGVsLmVxdWFscygiY29sbGFwc2luZyIpKSB7Ci0JCQkJCXdyaXRlci53cml0ZSgiYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyIpOwotCQkJCX0gZWxzZSBpZiAoYm9yZGVyTW9kZWwuZXF1YWxzKCJzZXBhcmF0aW5nIikpIHsKLQkJCQkJd3JpdGVyLndyaXRlKCJib3JkZXItY29sbGFwc2U6c2VwYXJhdGU7Iik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ3NzVmFsdWVCeVRhYmxlQ29sdW1uUHJvcGVydGllc0VsZW1lbnQoCi0JCQlQcmludFdyaXRlciB3cml0ZXIsIFN0eWxlRWxlbWVudCBzdHlsZUVsZW0pIHsKLQkJTm9kZUxpc3QgdGFibGVDb2xQcm9wcyA9IHN0eWxlRWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotCQkJCVN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJU3R5bGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRV9DT0xVTU5fUFJPUEVSVElFUyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVDb2xQcm9wcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlUYWJsZUNvbHVtblByb3BlcnRpZXNFbGVtZW50IHByb3AgPSAoVGFibGVDb2x1bW5Qcm9wZXJ0aWVzRWxlbWVudCkgdGFibGVDb2xQcm9wcwotCQkJCQkuaXRlbShpKTsKLQkJCVN0cmluZyB3aWR0aCA9IHByb3AuZ2V0QXR0clN0eWxlQ29sdW1uV2lkdGgoKTsKLQkJCWlmICh3aWR0aCAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJ3aWR0aDoiICsgd2lkdGggKyAiOyIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ3NzVmFsdWVCeVRhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50KFByaW50V3JpdGVyIHdyaXRlciwKLQkJCVN0eWxlRWxlbWVudCBzdHlsZUVsZW0pIHsKLQkJTm9kZUxpc3QgdGFibGVDZWxsUHJvcHMgPSBzdHlsZUVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCVN0eWxlQ29uc3RhbnRzLkVMRU1FTlRfVEFCTEVfQ0VMTF9QUk9QRVJUSUVTKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZUNlbGxQcm9wcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlUYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudCBwcm9wID0gKFRhYmxlQ2VsbFByb3BlcnRpZXNFbGVtZW50KSB0YWJsZUNlbGxQcm9wcwotCQkJCQkuaXRlbShpKTsKLQkJCVN0cmluZyBib3JkZXIgPSBwcm9wLmdldEF0dHJGb3JtYXRCb3JkZXIoKTsKLQkJCWlmIChib3JkZXIgIT0gbnVsbCkgewotCQkJCXdyaXRlci53cml0ZSgiYm9yZGVyOiIgKyBib3JkZXIgKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIGJvcmRlckxlZnQgPSBwcm9wLmdldEF0dHJGb3JtYXRCb3JkZXJMZWZ0KCk7Ci0JCQlpZiAoYm9yZGVyTGVmdCAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJib3JkZXItbGVmdDoiICsgYm9yZGVyTGVmdCArICI7Iik7Ci0JCQl9Ci0JCQlTdHJpbmcgYm9yZGVyUmlnaHQgPSBwcm9wLmdldEF0dHJGb3JtYXRCb3JkZXJSaWdodCgpOwotCQkJaWYgKGJvcmRlclJpZ2h0ICE9IG51bGwpIHsKLQkJCQl3cml0ZXIud3JpdGUoImJvcmRlci1yaWdodDoiICsgYm9yZGVyUmlnaHQgKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIGJvcmRlclRvcCA9IHByb3AuZ2V0QXR0ckZvcm1hdEJvcmRlclRvcCgpOwotCQkJaWYgKGJvcmRlclRvcCAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJib3JkZXItdG9wOiIgKyBib3JkZXJUb3AgKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIGJvcmRlckJvdHRvbSA9IHByb3AuZ2V0QXR0ckZvcm1hdEJvcmRlckJvdHRvbSgpOwotCQkJaWYgKGJvcmRlckJvdHRvbSAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJib3JkZXItYm90dG9tOiIgKyBib3JkZXJCb3R0b20gKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIGJhY2tncm91bmRDb2xvciA9IHByb3AuZ2V0QXR0ckZvcm1hdEJhY2tncm91bmRDb2xvcigpOwotCQkJaWYgKGJhY2tncm91bmRDb2xvciAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJiYWNrZ3JvdW5kLWNvbG9yOiIgKyBiYWNrZ3JvdW5kQ29sb3IgKyAiOyIpOwotCQkJfQotCQkJU3RyaW5nIHBhZGRpbmcgPSBwcm9wLmdldEF0dHJGb3JtYXRQYWRkaW5nKCk7Ci0JCQlpZiAocGFkZGluZyAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLndyaXRlKCJwYWRkaW5nOiIgKyBwYWRkaW5nICsgIjsiKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUNzc1ZhbHVlQnlTdHlsZVN0eWxlRWxlbWVudChQcmludFdyaXRlciB3cml0ZXIsCi0JCQlTdHlsZUVsZW1lbnQgc3R5bGVFbGVtKSB7Ci0JCVN0cmluZyBwYXJlbnRTdHlsZU5hbWUgPSBzdHlsZUVsZW0uZ2V0QXR0clN0eWxlUGFyZW50U3R5bGVOYW1lKCk7Ci0JCWlmIChwYXJlbnRTdHlsZU5hbWUgIT0gbnVsbCkgewotCQkJT0RGRWxlbWVudCBwYXJlbnRTdHlsZSA9ICgoT0RGRWxlbWVudEltcGwpIHN0eWxlRWxlbSkKLQkJCQkJLmZpbmRFbGVtZW50QnlBdHRyVmFsdWUoU3R5bGVDb25zdGFudHMuU1RZTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1NUWUxFLAotCQkJCQkJCVN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkksCi0JCQkJCQkJU3R5bGVDb25zdGFudHMuQVRUUl9OQU1FLCBwYXJlbnRTdHlsZU5hbWUpOwotCQkJaWYgKHBhcmVudFN0eWxlID09IG51bGwpIHsKLQkJCQlwYXJlbnRTdHlsZSA9ICgoT0RGRWxlbWVudEltcGwpIHN0eWxlRWxlbSkKLQkJCQkJCS5maW5kRWxlbWVudEJ5QXR0clZhbHVlRnJvbVN0eWxlRG9jKAotCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5FTEVNRU5UX1NUWUxFLAotCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5TVFlMRV9OQU1FU1BBQ0VfVVJJLAotCQkJCQkJCQlTdHlsZUNvbnN0YW50cy5BVFRSX05BTUUsIHBhcmVudFN0eWxlTmFtZSk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50U3R5bGUgIT0gbnVsbCkgewotCQkJCXdyaXRlQ3NzVmFsdWVCeVN0eWxlU3R5bGVFbGVtZW50KHdyaXRlciwKLQkJCQkJCShTdHlsZUVsZW1lbnQpIHBhcmVudFN0eWxlKTsKLQkJCX0KLQkJfQotCi0JCXdyaXRlQ3NzVmFsdWVCeVRleHRQcm9wZXJ0aWVzRWxlbWVudCh3cml0ZXIsIHN0eWxlRWxlbSk7Ci0JCXdyaXRlQ3NzVmFsdWVCeVBhcmFncmFwaFByb3BlcnRpZXNFbGVtZW50KHdyaXRlciwgc3R5bGVFbGVtKTsKLQkJd3JpdGVDc3NWYWx1ZUJ5R3JhcGhpY1Byb3BlcnRpZXNFbGVtZW50KHdyaXRlciwgc3R5bGVFbGVtKTsKLQkJd3JpdGVDc3NWYWx1ZUJ5VGFibGVQcm9wZXJ0aWVzRWxlbWVudCh3cml0ZXIsIHN0eWxlRWxlbSk7Ci0JCXdyaXRlQ3NzVmFsdWVCeVRhYmxlQ29sdW1uUHJvcGVydGllc0VsZW1lbnQod3JpdGVyLCBzdHlsZUVsZW0pOwotCQl3cml0ZUNzc1ZhbHVlQnlUYWJsZUNlbGxQcm9wZXJ0aWVzRWxlbWVudCh3cml0ZXIsIHN0eWxlRWxlbSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgWFBhdGhTZXJ2aWNlIHhwYXRoU2VydmljZSA9IFhQYXRoU2VydmljZUZhY3RvcnkKLQkJCS5uZXdTZXJ2aWNlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEVYUDEgPSB4cGF0aFNlcnZpY2UKLQkJCS5jb21waWxlKCIuLy8qW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkrIFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkkKLQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciCi0JCQkJCSsgU3R5bGVDb25zdGFudHMuRUxFTUVOVF9ERUZBVUxUX1NUWUxFICsgIiddIik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEVYUDIgPSB4cGF0aFNlcnZpY2UKLQkJCS5jb21waWxlKCIuLy8qW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkrIFN0eWxlQ29uc3RhbnRzLlNUWUxFX05BTUVTUEFDRV9VUkkKLQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciICsgU3R5bGVDb25zdGFudHMuRUxFTUVOVF9TVFlMRQotCQkJCQkrICInXSIpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBFWFAzID0geHBhdGhTZXJ2aWNlCi0JCQkuY29tcGlsZSgiLi8vKltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJKyBUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSArICInIGFuZCBsb2NhbC1uYW1lKCk9JyIKLQkJCQkJKyBUZXh0Q29uc3RhbnRzLkVMRU1FTlRfTElTVF9TVFlMRSArICInXSIpOwotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ3NzQnlTdHlsZURlZmF1bHRTdHlsZUVsZW1lbnQoUHJpbnRXcml0ZXIgd3JpdGVyLAotCQkJT0RGRG9jdW1lbnQgZG9jKSB7Ci0JCUVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJTm9kZUxpc3Qgc3R5bGVEZWZhdWx0U3R5bGVMaXN0ID0geHBhdGhTZXJ2aWNlLmV2YWxGb3JOb2RlTGlzdChFWFAxLAotCQkJCXJvb3QpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0eWxlRGVmYXVsdFN0eWxlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlEZWZhdWx0U3R5bGVFbGVtZW50IHN0eWxlRWxlbSA9IChEZWZhdWx0U3R5bGVFbGVtZW50KSBzdHlsZURlZmF1bHRTdHlsZUxpc3QKLQkJCQkJLml0ZW0oaSk7Ci0JCQlTdHJpbmcgc3R5bGVGYW1pbHkgPSBzdHlsZUVsZW0uZ2V0QXR0clN0eWxlRmFtaWx5KCk7Ci0JCQlpZiAoc3R5bGVGYW1pbHkgIT0gbnVsbCkgewotCQkJCWlmIChzdHlsZUZhbWlseS5lcXVhbHMoInBhcmFncmFwaCIpKSB7Ci0JCQkJCXdyaXRlci53cml0ZSgicCB7Iik7Ci0JCQkJfSBlbHNlIGlmIChzdHlsZUZhbWlseS5lcXVhbHMoInRhYmxlIikpIHsKLQkJCQkJd3JpdGVyLndyaXRlKCJ0YWJsZSB7Iik7Ci0JCQkJfSBlbHNlIGlmIChzdHlsZUZhbWlseS5lcXVhbHMoInRhYmxlLXJvdyIpKSB7Ci0JCQkJCXdyaXRlci53cml0ZSgidHIgeyIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXdyaXRlci53cml0ZSgiLiIgKyBzdHlsZUZhbWlseSArICIgeyIpOwotCQkJCX0KLQkJCQl3cml0ZUNzc1ZhbHVlQnlTdHlsZVN0eWxlRWxlbWVudCh3cml0ZXIsIHN0eWxlRWxlbSk7Ci0JCQkJd3JpdGVyLndyaXRlKCJ9XG4iKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUNzc0J5U3R5bGVTdHlsZUVsZW1lbnQoUHJpbnRXcml0ZXIgd3JpdGVyLCBPREZEb2N1bWVudCBkb2MpIHsKLQkJRWxlbWVudCByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQlOb2RlTGlzdCBzdHlsZVN0eWxlTGlzdCA9IHhwYXRoU2VydmljZS5ldmFsRm9yTm9kZUxpc3QoRVhQMiwgcm9vdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3R5bGVTdHlsZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJU3R5bGVFbGVtZW50IHN0eWxlRWxlbSA9IChTdHlsZUVsZW1lbnQpIHN0eWxlU3R5bGVMaXN0Lml0ZW0oaSk7Ci0JCQlTdHJpbmcgc3R5bGVOYW1lID0gc3R5bGVFbGVtLmdldE5hbWUoKTsKLQkJCXN0eWxlTmFtZSA9IHN0eWxlTmFtZS5yZXBsYWNlQWxsKCJcXC4iLCAiXFxcXFxcLiIpOwotCQkJd3JpdGVyLndyaXRlKCIuIiArIHN0eWxlTmFtZSArICIgeyIpOwotCQkJd3JpdGVDc3NWYWx1ZUJ5U3R5bGVTdHlsZUVsZW1lbnQod3JpdGVyLCBzdHlsZUVsZW0pOwotCQkJd3JpdGVyLndyaXRlKCJ9XG4iKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUNzc0J5TGlzdFN0eWxlRWxlbWVudChQcmludFdyaXRlciB3cml0ZXIsIE9ERkRvY3VtZW50IGRvYykgewotCQlFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IGxpc3RTdHlsZUxpc3QgPSB4cGF0aFNlcnZpY2UuZXZhbEZvck5vZGVMaXN0KEVYUDMsIHJvb3QpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTdHlsZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTGlzdFN0eWxlRWxlbWVudCBzdHlsZUVsZW0gPSAoTGlzdFN0eWxlRWxlbWVudCkgbGlzdFN0eWxlTGlzdAotCQkJCQkuaXRlbShpKTsKLQkJCVN0cmluZyBzdHlsZU5hbWUgPSBzdHlsZUVsZW0uZ2V0TmFtZSgpOwotCQkJc3R5bGVOYW1lID0gc3R5bGVOYW1lLnJlcGxhY2VBbGwoIlxcLiIsICJcXFxcXFwuIik7Ci0JCQlOb2RlTGlzdCBubCA9IHN0eWxlRWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotCQkJCQlUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQkJVGV4dENvbnN0YW50cy5FTEVNRU5UX0xJU1RfTEVWRUxfU1RZTEVfTlVNQkVSKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbmwuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCUxpc3RMZXZlbFN0eWxlTnVtYmVyRWxlbWVudCBzdHlsZU51bUVsZW0gPSAoTGlzdExldmVsU3R5bGVOdW1iZXJFbGVtZW50KSBubAotCQkJCQkJLml0ZW0oaik7Ci0JCQkJd3JpdGVyLndyaXRlKCIuIiArIHN0eWxlTmFtZSArIHN0eWxlTnVtRWxlbS5nZXRBdHRyTGV2ZWwoKQotCQkJCQkJKyAiIHsiKTsKLQkJCQlTdHJpbmcgZm9ybWF0ID0gc3R5bGVOdW1FbGVtLmdldEF0dHJOdW1Gb3JtYXQoKTsKLQkJCQlpZiAoZm9ybWF0LmVxdWFscygiMSIpKSB7Ci0JCQkJCXdyaXRlci53cml0ZSgibGlzdC1zdHlsZS10eXBlOmRlY2ltYWw7Iik7Ci0JCQkJfSBlbHNlIGlmIChmb3JtYXQuZXF1YWxzKCJpIikpIHsKLQkJCQkJd3JpdGVyLndyaXRlKCJsaXN0LXN0eWxlLXR5cGU6bG93ZXItcm9tYW47Iik7Ci0JCQkJfSBlbHNlIGlmIChmb3JtYXQuZXF1YWxzKCJJIikpIHsKLQkJCQkJd3JpdGVyLndyaXRlKCJsaXN0LXN0eWxlLXR5cGU6dXBwZXItcm9tYW47Iik7Ci0JCQkJfSBlbHNlIGlmIChmb3JtYXQuZXF1YWxzKCJhIikpIHsKLQkJCQkJd3JpdGVyLndyaXRlKCJsaXN0LXN0eWxlLXR5cGU6bG93ZXItYWxwaGE7Iik7Ci0JCQkJfSBlbHNlIGlmIChmb3JtYXQuZXF1YWxzKCJBIikpIHsKLQkJCQkJd3JpdGVyLndyaXRlKCJsaXN0LXN0eWxlLXR5cGU6dXBwZXItYWxwaGE7Iik7Ci0JCQkJfQotCQkJCXdyaXRlci53cml0ZSgifVxuIik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVDc3NGaWxlKFN0cmluZyBmaWxlTmFtZSkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCXRyeSB7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zLCBIVE1MX0VOQ09ESU5HKTsKLQkJCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKG9zdyk7Ci0KLQkJCU9ERkRvY3VtZW50IHN0eWxlRG9jID0gKChPREZEb2N1bWVudCkgY3VyRWxlbS5nZXRPd25lckRvY3VtZW50KCkpCi0JCQkJCS5nZXRTdHlsZURvY3VtZW50KCk7Ci0JCQkvLyB3cml0ZSBkZWZhdWx0IGNzcyBzdHlsZSBieSB1c2luZyBzdHlsZXMueG1sCi0JCQl3cml0ZUNzc0J5U3R5bGVEZWZhdWx0U3R5bGVFbGVtZW50KHB3LCBzdHlsZURvYyk7Ci0KLQkJCS8vIHdyaXRlIGNzcyBzdHlsZSBieSB1c2luZyBzdHlsZXMueG1sCi0JCQl3cml0ZUNzc0J5U3R5bGVTdHlsZUVsZW1lbnQocHcsIHN0eWxlRG9jKTsKLQotCQkJLy8gd3JpdGUgY3NzIHN0eWxlIGJ5IHVzaW5nIGNvbnRlbnQueG1sCi0JCQlPREZEb2N1bWVudCBjb250ZW50RG9jID0gKE9ERkRvY3VtZW50KSBjdXJFbGVtLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCXdyaXRlQ3NzQnlTdHlsZVN0eWxlRWxlbWVudChwdywgKE9ERkRvY3VtZW50KSBjdXJFbGVtCi0JCQkJCS5nZXRPd25lckRvY3VtZW50KCkpOwotCi0JCQkvLyB3cml0ZSBhZGRpdGlvbmFsIGNzcyBzdHlsZSBmb3IgbGlzdCBzdHJ1Y3R1cmUKLQkJCXdyaXRlQ3NzQnlMaXN0U3R5bGVFbGVtZW50KHB3LCBjb250ZW50RG9jKTsKLQotCQkJcHcuZmx1c2goKTsKLQkJCXB3LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb252ZXJ0RG9jdW1lbnQoU3RyaW5nIGZpbGVOYW1lLCBib29sZWFuIGVuYWJsZVN0eWxlKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJU3RyaW5nIGRpck5hbWUgPSBmaWxlLmdldFBhcmVudCgpOwotCQlGaWxlIGRpciA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQlpZiAoIWRpci5leGlzdHMoKSkKLQkJCWRpci5ta2RpcnMoKTsKLQotCQlpZiAoZW5hYmxlU3R5bGUpIHsKLQkJCVN0cmluZyBjc3NGaWxlTmFtZSA9IGRpck5hbWUgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIikKLQkJCQkJKyBPREZfQ1NTX0ZJTEU7Ci0JCQl3cml0ZUNzc0ZpbGUoY3NzRmlsZU5hbWUpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MsIEhUTUxfRU5DT0RJTkcpOwotCQkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIob3N3KTsKLQkJCWNvbnZlcnREb2N1bWVudChwdywgZGlyLCBlbmFibGVTdHlsZSk7Ci0JCQlwdy5mbHVzaCgpOwotCQkJcHcuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYvdXRpbC9jb252ZXJ0ZXIvaW1wbC9UZXh0RXh0cmFjdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2NvbnZlcnRlci9pbXBsL1RleHRFeHRyYWN0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZWE3ZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi91dGlsL2NvbnZlcnRlci9pbXBsL1RleHRFeHRyYWN0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuY29udmVydGVyLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLkRyYXdpbmdPYmplY3RCYXNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5FbWJlZERyYXdpbmdPYmplY3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmNvbnRlbnQuSUVkaXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkLlNjZW5lRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5DYXB0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5DaXJjbGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkNvbm5lY3RvckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuQ29udHJvbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuQ3VzdG9tU2hhcGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkVsbGlwc2VFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LkZyYW1lRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5HRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5JbWFnZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuSW1hZ2VNYXBBcmVhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5JbWFnZU1hcEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuTGluZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuT2JqZWN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5QYWdlVGh1bWJuYWlsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5Qb2x5Z29uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5Qb2x5bGluZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuUmVjdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuUmVndWxhclBvbHlnb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcmF3LlRleHRCb3hFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5mb3JtLkZpeGVkVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmZvcm0uRm9ybUNvbnRyb2xFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUNlbGxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlBFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlBhZ2VOdW1iZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50ZXh0LlRhYkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRleHQuVGV4dENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYudGV4dC5UcmFja2VkQ2hhbmdlc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuY29udmVydGVyLk9ERkNvbnZlcnRlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLmNvbnZlcnRlci5UZXh0RXh0cmFjdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgVGV4dEV4dHJhY3RvckltcGwgaW1wbGVtZW50cyBUZXh0RXh0cmFjdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9OT19BTFQgPSAiW2ltYWdlXSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRU1BUF9OT19BTFQgPSAiW2ltYWdlbWFwXSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfTk9fQUxUID0gIltvYmplY3RdIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9UQUJMRSA9ICJbdGFibGVdIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRCT1hfTk9fQUxUID0gIlt0ZXh0IGJveF0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQVElPTl9OT19BTFQgPSAiW2NhcHRpb25dIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENJUkNMRV9OT19BTFQgPSAiW2NpcmNsZV0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX05PX0FMVCA9ICJbY29ubmVjdG9yXSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01TSEFQRV9OT19BTFQgPSAiW2N1c3RvbSBzaGFwZV0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxMSVBTRV9OT19BTFQgPSAiW2VsbGlwc2VdIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FX05PX0FMVCA9ICJbZnJhbWVdIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdfTk9fQUxUID0gIltncm91cF0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VNQVBBUkVBX05PX0FMVCA9ICJbaW1hZ2VtYXAgYXJlYV0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9OT19BTFQgPSAiW2xpbmVdIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPTFlHT05fTk9fQUxUID0gIltwb2x5Z29uXSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT0xZTElORV9OT19BTFQgPSAiW3BvbHlnb24gbGluZV0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDVF9OT19BTFQgPSAiW3JlY3RhbmdsZV0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHVUxBUlBPTFlHT05fTk9fQUxUID0gIltwb2x5Z29uXSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0VORV9OT19BTFQgPSAiWzNEIHNoYXBlXSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOU0hBUEVfTk9fQUxUID0gIltncmFwaGljIHNoYXBlXSI7Ci0KLQlwcml2YXRlIFRleHRFeHRyYWN0b3IgY29udmVydGVyOwotCi0JcHJpdmF0ZSBkb3VibGUgb2RmVmVyc2lvbiA9IC0xLjA7Ci0KLQlwcml2YXRlIE9ERkVsZW1lbnQgY3VyRWxlbSA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChPREZEb2N1bWVudCBkb2N1bWVudCwgVGV4dEV4dHJhY3RvciBjb252ZXJ0ZXIpIHsKLQkJdGhpcy5jdXJFbGVtID0gKE9ERkVsZW1lbnQpIGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQl0aGlzLmNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQl9Ci0KLQkvLyBmb3IgTm90ZXM4LCBOb3Rlczggc2F2ZSBkb2N1bWVudCBieSBPREYgMS4xIHNjaGVtYSwKLQkvLyBidXQgb2RmOnZlcnNpb24gaXMgc2V0IGFzIDEuMAotCS8vIGlmIHNwZWNpZnkgb2RmOnZlcnNpb24gYnkgdGhpcyBmdW5jdGlvbiwKLQkvLyBkbyBub3QgdXNlIG9kZjp2ZXJzaW9uIGRlZmluZWQgaW4gZWFjaCBPREYgZmlsZQotCXB1YmxpYyB2b2lkIHNldE9kZlZlcnNpb24oZG91YmxlIG9kZlZlcnNpb24pIHsKLQkJdGhpcy5vZGZWZXJzaW9uID0gb2RmVmVyc2lvbjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gd3JpdGVDb250cm9sRWxlbWVudENvbnRlbnQoV3JpdGVyIHdyaXRlciwKLQkJCUNvbnRyb2xFbGVtZW50IGVsZW0pIHsKLQkJRm9ybUNvbnRyb2xFbGVtZW50IGZvcm0gPSAoKENvbnRyb2xFbGVtZW50KSBlbGVtKQotCQkJCS5nZXRGb3JtQ29udHJvbEVsZW1lbnQoKTsKLQkJaWYgKGZvcm0gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoIShmb3JtIGluc3RhbmNlb2YgRml4ZWRUZXh0RWxlbWVudCkpIHsKLQkJCQkJd3JpdGVyLndyaXRlKCJbZm9ybSBjb250cm9sXSIpOwotCQkJCX0KLQotCQkJCVN0cmluZyBmb3JtTGFiZWwgPSBmb3JtLmdldEF0dHJGb3JtTGFiZWwoKTsKLQkJCQlpZiAoZm9ybUxhYmVsICE9IG51bGwpIHsKLQkJCQkJaWYgKCEoZm9ybSBpbnN0YW5jZW9mIEZpeGVkVGV4dEVsZW1lbnQpKSB7Ci0JCQkJCQl3cml0ZXIud3JpdGUoIiAiKTsKLQkJCQkJfQotCQkJCQl3cml0ZXIud3JpdGUoZm9ybUxhYmVsKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHdyaXRlRnJhbWVFbGVtZW50Q29udGVudChXcml0ZXIgd3JpdGVyLCBGaWxlIGRpciwKLQkJCUZyYW1lRWxlbWVudCBlbGVtLCBib29sZWFuIGVuYWJsZVN0eWxlKSB7Ci0JCWJvb2xlYW4gYWRkZWRUZXh0Q29udGVudCA9IGZhbHNlOwotCQlJdGVyYXRvciBpdGVyID0gKChGcmFtZUVsZW1lbnQpIGVsZW0pLmdldENoaWxkSXRlcmF0b3IoKTsKLQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPREZFbGVtZW50IGZpcnN0Q29udGVudCA9IChPREZFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChmaXJzdENvbnRlbnQgIT0gbnVsbCkgewotCQkJCWFkZGVkVGV4dENvbnRlbnQgfD0gY29udmVydGVyLmV4dHJhY3RDb250ZW50KHdyaXRlciwgZGlyLAotCQkJCQkJZmlyc3RDb250ZW50LCBlbmFibGVTdHlsZSk7Ci0JCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCS8vIGlmIHRoaXMgZnJhbWUgaGFzIGltYWdlIG1hcAotCQkJCQlPREZFbGVtZW50IHNlY29uZENvbnRlbnQgPSAoT0RGRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmICgoc2Vjb25kQ29udGVudCAhPSBudWxsKQotCQkJCQkJCSYmIChzZWNvbmRDb250ZW50IGluc3RhbmNlb2YgSW1hZ2VNYXBFbGVtZW50KSkgewotCQkJCQkJYWRkZWRUZXh0Q29udGVudCB8PSBjb252ZXJ0ZXIuZXh0cmFjdENvbnRlbnQod3JpdGVyLAotCQkJCQkJCQlkaXIsIHNlY29uZENvbnRlbnQsIGVuYWJsZVN0eWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRkZWRUZXh0Q29udGVudDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gd3JpdGVJbWFnZU1hcEVsZW1lbnRDb250ZW50KFdyaXRlciB3cml0ZXIsIEZpbGUgZGlyLAotCQkJSW1hZ2VNYXBFbGVtZW50IGVsZW0sIGJvb2xlYW4gZW5hYmxlU3R5bGUpIHsKLQkJYm9vbGVhbiBhZGRlZFRleHRDb250ZW50ID0gZmFsc2U7Ci0JCU5vZGVMaXN0IG5sID0gKChJbWFnZU1hcEVsZW1lbnQpIGVsZW0pLmdldEFyZWFFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWFkZGVkVGV4dENvbnRlbnQgfD0gY29udmVydGVyLmV4dHJhY3RDb250ZW50KHdyaXRlciwgZGlyLAotCQkJCQkoSW1hZ2VNYXBBcmVhRWxlbWVudCkgbmwuaXRlbShpKSwgZW5hYmxlU3R5bGUpOwotCQl9Ci0JCXJldHVybiBhZGRlZFRleHRDb250ZW50OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB3cml0ZVRleHRCb3hFbGVtZW50Q29udGVudChXcml0ZXIgd3JpdGVyLCBGaWxlIGRpciwKLQkJCVRleHRCb3hFbGVtZW50IGVsZW0sIGJvb2xlYW4gZW5hYmxlU3R5bGUpIHsKLQkJYm9vbGVhbiBhZGRlZFRleHRDb250ZW50ID0gZmFsc2U7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gZWxlbS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJU3RyaW5nIHN0ciA9ICgoVGV4dCkgY2hpbGQpLmdldERhdGEoKS50cmltKCk7Ci0JCQkJaWYgKHN0ci5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCXN0ciA9IE9ERkNvbnZlcnRlclV0aWxzLmNvbnZlcnRYTUxDaGFyYWN0ZXIoc3RyKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXdyaXRlci53cml0ZShzdHIpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJCWFkZGVkVGV4dENvbnRlbnQgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBPREZFbGVtZW50KSB7Ci0JCQkJYWRkZWRUZXh0Q29udGVudCB8PSBjb252ZXJ0ZXIuZXh0cmFjdENvbnRlbnQod3JpdGVyLCBkaXIsCi0JCQkJCQkoT0RGRWxlbWVudCkgY2hpbGQsIGVuYWJsZVN0eWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRkZWRUZXh0Q29udGVudDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gd3JpdGVUYWJFbGVtZW50Q29udGVudChXcml0ZXIgd3JpdGVyLCBUYWJFbGVtZW50IGVsZW0pIHsKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZSgiXHQiKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gd3JpdGVTRWxlbWVudENvbnRlbnQoV3JpdGVyIHdyaXRlciwgU0VsZW1lbnQgZWxlbSkgewotCQlpZiAoZWxlbS5oYXNBdHRyaWJ1dGVOUyhUZXh0Q29uc3RhbnRzLlRFWFRfTkFNRVNQQUNFX1VSSSwKLQkJCQlUZXh0Q29uc3RhbnRzLkFUVFJfQykpIHsKLQkJCWludCBjID0gKChTRWxlbWVudCkgZWxlbSkuZ2V0QXR0clRleHRDKCk7Ci0JCQlpZiAoYyA+IDApIHsKLQkJCQlTdHJpbmcgdmFsdWUgPSAiIjsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGM7IGkrKykKLQkJCQkJdmFsdWUgKz0gIiAiOwotCQkJCXRyeSB7Ci0JCQkJCXdyaXRlci53cml0ZSh2YWx1ZSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJd3JpdGVyLndyaXRlKCIgIik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gd3JpdGVDdXN0b21TaGFwZUVsZW1lbnRDb250ZW50KFdyaXRlciB3cml0ZXIsIEZpbGUgZGlyLAotCQkJQ3VzdG9tU2hhcGVFbGVtZW50IGVsZW0sIGJvb2xlYW4gZW5hYmxlU3R5bGUpIHsKLQkJYm9vbGVhbiBhZGRlZFRleHRDb250ZW50ID0gZmFsc2U7Ci0JCU5vZGVMaXN0IHBMaXN0ID0gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotCQkJCVRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLCBUZXh0Q29uc3RhbnRzLkVMRU1FTlRfUCk7Ci0JCWlmICgocExpc3QgIT0gbnVsbCkgJiYgKHBMaXN0LmdldExlbmd0aCgpICE9IDApKSB7IC8vIGlmIHRoaXMgY3VzdG9tCi0JCQkJCQkJCQkJCQkJCQkvLyBzaGFwZSBpcyBjYXB0aW9uCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIHBFbGVtID0gcExpc3QuaXRlbShpKTsKLQkJCQlTdHJpbmcgY29udGVudCA9IHBFbGVtLmdldFRleHRDb250ZW50KCk7Ci0JCQkJaWYgKChjb250ZW50ICE9IG51bGwpICYmIChjb250ZW50Lmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJYWRkZWRUZXh0Q29udGVudCB8PSBjb252ZXJ0ZXIuZXh0cmFjdENvbnRlbnQod3JpdGVyLCBkaXIsCi0JCQkJCQkJKE9ERkVsZW1lbnQpIHBMaXN0Lml0ZW0oaSksIGVuYWJsZVN0eWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWFkZGVkVGV4dENvbnRlbnQpIHsKLQkJCUlFZGl0YWJsZSBzaG9ydERlc2MgPSBudWxsOwotCQkJaWYgKG9kZlZlcnNpb24gIT0gLTEuMCkgewotCQkJCXNob3J0RGVzYyA9IChJRWRpdGFibGUpICgoRHJhd2luZ09iamVjdEJhc2VFbGVtZW50KSBlbGVtKQotCQkJCQkJLmdldFNob3J0RGVzY0VsZW1lbnQob2RmVmVyc2lvbik7Ci0JCQl9IGVsc2UgewotCQkJCXNob3J0RGVzYyA9IChJRWRpdGFibGUpICgoRHJhd2luZ09iamVjdEJhc2VFbGVtZW50KSBlbGVtKQotCQkJCQkJLmdldFNob3J0RGVzY0VsZW1lbnQoKTsKLQkJCX0KLQotCQkJaWYgKHNob3J0RGVzYyA9PSBudWxsKSB7Ci0JCQkJT0RGRG9jdW1lbnQgZG9jID0gKE9ERkRvY3VtZW50KSBlbGVtLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCQlpZiAoKGRvYy5nZXRPREZWZXJzaW9uKCkgPiAxLjApCi0JCQkJCQl8fCAoKG9kZlZlcnNpb24gIT0gLTEuMCkgJiYgKG9kZlZlcnNpb24gPiAxLjApKSkgewotCQkJCQl0cnkgewotCQkJCQkJd3JpdGVyLndyaXRlKENVU1RPTVNIQVBFX05PX0FMVCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYWRkZWRUZXh0Q29udGVudCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyBzdHIgPSAoU3RyaW5nKSBzaG9ydERlc2MuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoc3RyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXdyaXRlci53cml0ZShzdHIpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJCWFkZGVkVGV4dENvbnRlbnQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRkZWRUZXh0Q29udGVudDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gd3JpdGVEcmF3aW5nT2JqZWN0QmFzZUVsZW1lbnRDb250ZW50KFdyaXRlciB3cml0ZXIsCi0JCQlGaWxlIGRpciwgRHJhd2luZ09iamVjdEJhc2VFbGVtZW50IGVsZW0sIGJvb2xlYW4gZW5hYmxlU3R5bGUpIHsKLQkJYm9vbGVhbiBhZGRlZFRleHRDb250ZW50ID0gZmFsc2U7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgSW1hZ2VFbGVtZW50KQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFBhZ2VUaHVtYm5haWxFbGVtZW50KQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCU5vZGVMaXN0IHBMaXN0ID0gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotCQkJCVRleHRDb25zdGFudHMuVEVYVF9OQU1FU1BBQ0VfVVJJLCBUZXh0Q29uc3RhbnRzLkVMRU1FTlRfUCk7Ci0JCWlmICgocExpc3QgIT0gbnVsbCkgJiYgKHBMaXN0LmdldExlbmd0aCgpICE9IDApKSB7IC8vIGlmIHRoaXMgY3VzdG9tCi0JCQkJCQkJCQkJCQkJCQkvLyBzaGFwZSBpcyBjYXB0aW9uCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIHBFbGVtID0gcExpc3QuaXRlbShpKTsKLQkJCQlTdHJpbmcgY29udGVudCA9IHBFbGVtLmdldFRleHRDb250ZW50KCk7Ci0JCQkJaWYgKChjb250ZW50ICE9IG51bGwpICYmIChjb250ZW50Lmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJYWRkZWRUZXh0Q29udGVudCB8PSBjb252ZXJ0ZXIuZXh0cmFjdENvbnRlbnQod3JpdGVyLCBkaXIsCi0JCQkJCQkJKE9ERkVsZW1lbnQpIHBMaXN0Lml0ZW0oaSksIGVuYWJsZVN0eWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWFkZGVkVGV4dENvbnRlbnQpIHsKLQkJCUlFZGl0YWJsZSBzaG9ydERlc2MgPSBudWxsOwotCQkJaWYgKG9kZlZlcnNpb24gIT0gLTEuMCkgewotCQkJCXNob3J0RGVzYyA9IChJRWRpdGFibGUpICgoRHJhd2luZ09iamVjdEJhc2VFbGVtZW50KSBlbGVtKQotCQkJCQkJLmdldFNob3J0RGVzY0VsZW1lbnQob2RmVmVyc2lvbik7Ci0JCQl9IGVsc2UgewotCQkJCXNob3J0RGVzYyA9IChJRWRpdGFibGUpICgoRHJhd2luZ09iamVjdEJhc2VFbGVtZW50KSBlbGVtKQotCQkJCQkJLmdldFNob3J0RGVzY0VsZW1lbnQoKTsKLQkJCX0KLQotCQkJaWYgKHNob3J0RGVzYyA9PSBudWxsKSB7Ci0JCQkJT0RGRG9jdW1lbnQgZG9jID0gKE9ERkRvY3VtZW50KSBlbGVtLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCQlpZiAoKGVsZW0gaW5zdGFuY2VvZiBFbWJlZERyYXdpbmdPYmplY3RFbGVtZW50KQotCQkJCQkJfHwgKChkb2MuZ2V0T0RGVmVyc2lvbigpID4gMS4wKSB8fCAoKG9kZlZlcnNpb24gIT0gLTEuMCkgJiYgKG9kZlZlcnNpb24gPiAxLjApKSkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChlbGVtIGluc3RhbmNlb2YgSW1hZ2VFbGVtZW50KQotCQkJCQkJCXdyaXRlci53cml0ZShJTUFHRV9OT19BTFQpOwotCQkJCQkJZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIEltYWdlTWFwRWxlbWVudCkKLQkJCQkJCQl3cml0ZXIud3JpdGUoSU1BR0VNQVBfTk9fQUxUKTsKLQkJCQkJCWVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBPYmplY3RFbGVtZW50KSB7Ci0JCQkJCQkJaWYgKCgoT2JqZWN0RWxlbWVudCkgZWxlbSkuaXNQcmVzZW50YXRpb25UYWJsZSgpKQotCQkJCQkJCQl3cml0ZXIud3JpdGUoT0JKRUNUX1RBQkxFKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXdyaXRlci53cml0ZShPQkpFQ1RfTk9fQUxUKTsKLQkJCQkJCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIENhcHRpb25FbGVtZW50KQotCQkJCQkJCXdyaXRlci53cml0ZShDQVBUSU9OX05PX0FMVCk7Ci0JCQkJCQllbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgVGV4dEJveEVsZW1lbnQpCi0JCQkJCQkJd3JpdGVyLndyaXRlKFRFWFRCT1hfTk9fQUxUKTsKLQkJCQkJCWVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBDaXJjbGVFbGVtZW50KQotCQkJCQkJCXdyaXRlci53cml0ZShDSVJDTEVfTk9fQUxUKTsKLQkJCQkJCWVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBDb25uZWN0b3JFbGVtZW50KQotCQkJCQkJCXdyaXRlci53cml0ZShDT05ORUNUT1JfTk9fQUxUKTsKLQkJCQkJCWVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBDdXN0b21TaGFwZUVsZW1lbnQpCi0JCQkJCQkJd3JpdGVyLndyaXRlKENVU1RPTVNIQVBFX05PX0FMVCk7Ci0JCQkJCQllbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgRWxsaXBzZUVsZW1lbnQpCi0JCQkJCQkJd3JpdGVyLndyaXRlKEVMTElQU0VfTk9fQUxUKTsKLQkJCQkJCWVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBGcmFtZUVsZW1lbnQpCi0JCQkJCQkJd3JpdGVyLndyaXRlKEZSQU1FX05PX0FMVCk7Ci0JCQkJCQllbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgR0VsZW1lbnQpCi0JCQkJCQkJd3JpdGVyLndyaXRlKEdfTk9fQUxUKTsKLQkJCQkJCWVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBJbWFnZU1hcEFyZWFFbGVtZW50KQotCQkJCQkJCXdyaXRlci53cml0ZShJTUFHRU1BUEFSRUFfTk9fQUxUKTsKLQkJCQkJCWVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBMaW5lRWxlbWVudCkKLQkJCQkJCQl3cml0ZXIud3JpdGUoTElORV9OT19BTFQpOwotCQkJCQkJZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIFBvbHlnb25FbGVtZW50KQotCQkJCQkJCXdyaXRlci53cml0ZShQT0xZR09OX05PX0FMVCk7Ci0JCQkJCQllbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgUG9seWxpbmVFbGVtZW50KQotCQkJCQkJCXdyaXRlci53cml0ZShQT0xZTElORV9OT19BTFQpOwotCQkJCQkJZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIFJlY3RFbGVtZW50KQotCQkJCQkJCXdyaXRlci53cml0ZShSRUNUX05PX0FMVCk7Ci0JCQkJCQllbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgUmVndWxhclBvbHlnb25FbGVtZW50KQotCQkJCQkJCXdyaXRlci53cml0ZShSRUdVTEFSUE9MWUdPTl9OT19BTFQpOwotCQkJCQkJZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIFNjZW5lRWxlbWVudCkKLQkJCQkJCQl3cml0ZXIud3JpdGUoU0NFTkVfTk9fQUxUKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQl3cml0ZXIud3JpdGUoVU5LTk9XTlNIQVBFX05PX0FMVCk7Ci0KLQkJCQkJCXdyaXRlci53cml0ZShTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJCWFkZGVkVGV4dENvbnRlbnQgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIHNob3J0RGVzYy5nZXRWYWx1ZSgpOwotCQkJCWlmIChzdHIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJd3JpdGVyLndyaXRlKHN0cik7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJYWRkZWRUZXh0Q29udGVudCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGRlZFRleHRDb250ZW50OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB3cml0ZVRhYmxlQ2VsbEVsZW1lbnRDb250ZW50KFdyaXRlciB3cml0ZXIsIEZpbGUgZGlyLAotCQkJVGFibGVDZWxsRWxlbWVudCBlbGVtLCBib29sZWFuIGVuYWJsZVN0eWxlKSB7Ci0JCWJvb2xlYW4gYWRkZWRUb0NlbGwgPSB3cml0ZU9ERkVsZW1lbnRDb250ZW50KHdyaXRlciwgZGlyLAotCQkJCShPREZFbGVtZW50KSBlbGVtLCBlbmFibGVTdHlsZSk7Ci0JCWlmICghYWRkZWRUb0NlbGwpIHsKLQkJCXRyeSB7Ci0JCQkJd3JpdGVyLndyaXRlKCImbmJzcDsiKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB3cml0ZU9ERkVsZW1lbnRDb250ZW50KFdyaXRlciB3cml0ZXIsIEZpbGUgZGlyLAotCQkJT0RGRWxlbWVudCBlbGVtLCBib29sZWFuIGVuYWJsZVN0eWxlKSB7Ci0JCWJvb2xlYW4gYWRkZWRUZXh0Q29udGVudCA9IGZhbHNlOwotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGVsZW0uZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCVN0cmluZyBzdHIgPSAoKFRleHQpIGNoaWxkKS5nZXREYXRhKCkudHJpbSgpOwotCQkJCWlmIChzdHIubGVuZ3RoKCkgIT0gMCkgewotCQkJCQlzdHIgPSBPREZDb252ZXJ0ZXJVdGlscy5jb252ZXJ0WE1MQ2hhcmFjdGVyKHN0cik7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl3cml0ZXIud3JpdGUoc3RyKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCQlhZGRlZFRleHRDb250ZW50ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgT0RGRWxlbWVudCkgewotCQkJCWFkZGVkVGV4dENvbnRlbnQgfD0gY29udmVydGVyLmV4dHJhY3RDb250ZW50KHdyaXRlciwgZGlyLAotCQkJCQkJKE9ERkVsZW1lbnQpIGNoaWxkLCBlbmFibGVTdHlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkZGVkVGV4dENvbnRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZXh0cmFjdEVtYmVkRmlsZShPREZFbGVtZW50IGVsZW0sIEZpbGUgZGlyLCBTdHJpbmcgaHJlZikgewotCQlpZiAoZGlyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIG91dHB1dEZpbGVOYW1lID0gZGlyLmdldEFic29sdXRlUGF0aCgpCi0JCQkJKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIikgKyBocmVmOwotCQlGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShvdXRwdXRGaWxlTmFtZSk7Ci0KLQkJU3RyaW5nIG91dHB1dERpck5hbWUgPSBvdXRwdXRGaWxlLmdldFBhcmVudCgpOwotCQlGaWxlIG91dHB1dERpciA9IG5ldyBGaWxlKG91dHB1dERpck5hbWUpOwotCQlpZiAoIW91dHB1dERpci5leGlzdHMoKSkKLQkJCW91dHB1dERpci5ta2RpcnMoKTsKLQotCQlPREZQYXJzZXIgcGFyc2VyID0gbmV3IE9ERlBhcnNlcigpOwotCQlEb2N1bWVudCBkb2MgPSBjdXJFbGVtLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIE9ERkRvY3VtZW50KSB7Ci0JCQlwYXJzZXIuY29weUZpbGUoKChPREZEb2N1bWVudCkgZG9jKS5nZXRVUkwoKSwgaHJlZiwKLQkJCQkJb3V0cHV0RmlsZU5hbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXh0cmFjdENvbnRlbnQoV3JpdGVyIHdyaXRlciwgRmlsZSBkaXIsIE9ERkVsZW1lbnQgZWxlbSwKLQkJCWJvb2xlYW4gZW5hYmxlU3R5bGUpIHsKLQkJLy8gd3JpdGUgb2RmIGNvbnRlbnQKLQkJYm9vbGVhbiBhZGRlZFRleHRDb250ZW50ID0gZmFsc2U7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgVGFiRWxlbWVudCkgewotCQkJYWRkZWRUZXh0Q29udGVudCB8PSB3cml0ZVRhYkVsZW1lbnRDb250ZW50KHdyaXRlciwKLQkJCQkJKFRhYkVsZW1lbnQpIGVsZW0pOwotCQl9IGVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBTRWxlbWVudCkgewotCQkJYWRkZWRUZXh0Q29udGVudCB8PSB3cml0ZVNFbGVtZW50Q29udGVudCh3cml0ZXIsIChTRWxlbWVudCkgZWxlbSk7Ci0JCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIFRhYmxlQ2VsbEVsZW1lbnQpIHsKLQkJCWFkZGVkVGV4dENvbnRlbnQgfD0gd3JpdGVUYWJsZUNlbGxFbGVtZW50Q29udGVudCh3cml0ZXIsIGRpciwKLQkJCQkJKFRhYmxlQ2VsbEVsZW1lbnQpIGVsZW0sIGVuYWJsZVN0eWxlKTsKLQkJfSBlbHNlIGlmICgoZWxlbSBpbnN0YW5jZW9mIFRyYWNrZWRDaGFuZ2VzRWxlbWVudCkKLQkJCQl8fCAoZWxlbSBpbnN0YW5jZW9mIFBhZ2VUaHVtYm5haWxFbGVtZW50KQotCQkJCXx8IChlbGVtIGluc3RhbmNlb2YgSW1hZ2VFbGVtZW50KQotCQkJCXx8IChlbGVtIGluc3RhbmNlb2YgUGFnZU51bWJlckVsZW1lbnQpKSB7Ci0JCQkvLyBub3RoaW5nIHRvIHdyaXRlCi0JCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIERyYXdpbmdPYmplY3RCYXNlRWxlbWVudCkgewotCQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBDb250cm9sRWxlbWVudCkgewotCQkJCWFkZGVkVGV4dENvbnRlbnQgfD0gd3JpdGVDb250cm9sRWxlbWVudENvbnRlbnQod3JpdGVyLAotCQkJCQkJKENvbnRyb2xFbGVtZW50KSBlbGVtKTsKLQkJCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIEZyYW1lRWxlbWVudCkgewotCQkJCWFkZGVkVGV4dENvbnRlbnQgfD0gd3JpdGVGcmFtZUVsZW1lbnRDb250ZW50KHdyaXRlciwgZGlyLAotCQkJCQkJKEZyYW1lRWxlbWVudCkgZWxlbSwgZW5hYmxlU3R5bGUpOwotCQkJfSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgSW1hZ2VNYXBFbGVtZW50KSB7Ci0JCQkJYWRkZWRUZXh0Q29udGVudCB8PSB3cml0ZUltYWdlTWFwRWxlbWVudENvbnRlbnQod3JpdGVyLCBkaXIsCi0JCQkJCQkoSW1hZ2VNYXBFbGVtZW50KSBlbGVtLCBlbmFibGVTdHlsZSk7Ci0JCQl9IGVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBUZXh0Qm94RWxlbWVudCkgewotCQkJCWFkZGVkVGV4dENvbnRlbnQgfD0gd3JpdGVUZXh0Qm94RWxlbWVudENvbnRlbnQod3JpdGVyLCBkaXIsCi0JCQkJCQkoVGV4dEJveEVsZW1lbnQpIGVsZW0sIGVuYWJsZVN0eWxlKTsKLQkJCX0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIEN1c3RvbVNoYXBlRWxlbWVudCkgewotCQkJCWFkZGVkVGV4dENvbnRlbnQgfD0gd3JpdGVDdXN0b21TaGFwZUVsZW1lbnRDb250ZW50KHdyaXRlciwgZGlyLAotCQkJCQkJKEN1c3RvbVNoYXBlRWxlbWVudCkgZWxlbSwgZW5hYmxlU3R5bGUpOwotCQkJfSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgR0VsZW1lbnQpIHsKLQkJCQlhZGRlZFRleHRDb250ZW50IHw9IHdyaXRlT0RGRWxlbWVudENvbnRlbnQod3JpdGVyLCBkaXIsCi0JCQkJCQkoT0RGRWxlbWVudCkgZWxlbSwgZW5hYmxlU3R5bGUpOwotCQkJfSBlbHNlIHsKLQkJCQlhZGRlZFRleHRDb250ZW50IHw9IHdyaXRlRHJhd2luZ09iamVjdEJhc2VFbGVtZW50Q29udGVudCgKLQkJCQkJCXdyaXRlciwgZGlyLCAoRHJhd2luZ09iamVjdEJhc2VFbGVtZW50KSBlbGVtLAotCQkJCQkJZW5hYmxlU3R5bGUpOwotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBQRWxlbWVudCkgewotCQkJYWRkZWRUZXh0Q29udGVudCB8PSB3cml0ZU9ERkVsZW1lbnRDb250ZW50KHdyaXRlciwgZGlyLAotCQkJCQkoT0RGRWxlbWVudCkgZWxlbSwgZW5hYmxlU3R5bGUpOwotCQkJaWYgKGFkZGVkVGV4dENvbnRlbnQpIHsKLQkJCQl0cnkgewotCQkJCQl3cml0ZXIud3JpdGUoU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJYWRkZWRUZXh0Q29udGVudCB8PSB3cml0ZU9ERkVsZW1lbnRDb250ZW50KHdyaXRlciwgZGlyLAotCQkJCQkoT0RGRWxlbWVudCkgZWxlbSwgZW5hYmxlU3R5bGUpOwotCQl9Ci0KLQkJcmV0dXJuIGFkZGVkVGV4dENvbnRlbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi94bGluay9YTGlua0NvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZG9tL29kZi94bGluay9YTGlua0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDgzZjUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2RvbS9vZGYveGxpbmsvWExpbmtDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGF0c3V5YSBJU0hJSEFSQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi54bGluazsKLQotLyoqCi0gKiBYTGlua0NvbnN0YW50cyBkZWZpbmVzIHRoZSBjb25zdGFudCB2YWx1ZXMgdXNlZCBieSB4bGluayBuYW1lc3BhY2Ugb2YgT0RGIERPTSBBUEkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhMaW5rQ29uc3RhbnRzIHsKLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBYTElOS19OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgTElOS19UWVBFX1NJTVBMRSA9ICJzaW1wbGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9IUkVGID0gImhyZWYiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9UWVBFID0gInR5cGUiOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9TSE9XID0gInNob3ciOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQVRUUl9BQ1RVQVRFID0gImFjdHVhdGUiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9vZGYvT2RmUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9kb20vb2RmL09kZlBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDIzZDkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2RvbS9vZGYvT2RmUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmRvbS5vZGY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgT2RmUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgT2RmUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwkKLQlwdWJsaWMgT2RmUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwkKLQlwdWJsaWMgc3RhdGljIE9kZlBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZTQxOWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS5kbGwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS5kbGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlY2UzMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkuZGxsCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTQ5YzZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVjbGlwc2UgQUNURiBQcm94eSBQbHVnLWluIChJbmN1YmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHkuUHJveHlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuYWN0Zi5jb3JlLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gsCi0gb3JnLmVjbGlwc2UuYWN0Zi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODFkYmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2I0NjliLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLQkJCSAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS5kbGwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW5famEucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2ljb25zL2FjdGlvbjE2L2NsZWFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9pY29ucy9hY3Rpb24xNi9jbGVhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzBhNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2ljb25zL2FjdGlvbjE2L2NsZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9pY29ucy92aWV3MTYvcHJveHlsb2d2aWV3LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9pY29ucy92aWV3MTYvcHJveHlsb2d2aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmYjNjOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvaWNvbnMvdmlldzE2L3Byb3h5bG9ndmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvbGlicmFyeV9zcmMvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3NmZmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvbGlicmFyeV9zcmMvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1EZWJ1ZwotUmVsZWFzZQotKi5uY2IKLSouc3VvCi0qLnVzZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5L0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkuY3BwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Y2I5MTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBBY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5LmNwcCA6IERlZmluZXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgRExMIGFwcGxpY2F0aW9uLgotLy8KLQotI2luY2x1ZGUgInN0ZGFmeC5oIgotCi0KLSNpZmRlZiBfTUFOQUdFRAotI3ByYWdtYSBtYW5hZ2VkKHB1c2gsIG9mZikKLSNlbmRpZgotCi1CT09MIEFQSUVOVFJZIERsbE1haW4oIEhNT0RVTEUgaE1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgIHVsX3JlYXNvbl9mb3JfY2FsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwUmVzZXJ2ZWQKLQkJCQkJICkKLXsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotI2lmZGVmIF9NQU5BR0VECi0jcHJhZ21hIG1hbmFnZWQocG9wKQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5L0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkuc2xuIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS5zbG4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZGE3ZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS5zbG4KKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi3vu78NCi1NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA5LjAwDQotIyBWaXN1YWwgU3R1ZGlvIDIwMDUNCi1Qcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIkFjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkiLCAiQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS52Y3Byb2oiLCAiezgxREJEMjNCLURCQzktNDZCOC1CODIzLUFEREIwNDk2QUJCNX0iDQotRW5kUHJvamVjdA0KLUdsb2JhbA0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KLQkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMg0KLQkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzINCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KLQkJezgxREJEMjNCLURCQzktNDZCOC1CODIzLUFEREIwNDk2QUJCNX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCi0JCXs4MURCRDIzQi1EQkM5LTQ2QjgtQjgyMy1BRERCMDQ5NkFCQjV9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KLQkJezgxREJEMjNCLURCQzktNDZCOC1CODIzLUFEREIwNDk2QUJCNX0uUmVsZWFzZXxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlfFdpbjMyDQotCQl7ODFEQkQyM0ItREJDOS00NkI4LUI4MjMtQUREQjA0OTZBQkI1fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQotCUVuZEdsb2JhbFNlY3Rpb24NCi0JR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCi0JCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KLQlFbmRHbG9iYWxTZWN0aW9uDQotRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS52Y3Byb2ogYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvbGlicmFyeV9zcmMvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5LnZjcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyNjY4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvbGlicmFyeV9zcmMvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5LnZjcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJzaGlmdF9qaXMiPz4NCi08VmlzdWFsU3R1ZGlvUHJvamVjdA0KLQlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCi0JVmVyc2lvbj0iOC4wMCINCi0JTmFtZT0iQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeSINCi0JUHJvamVjdEdVSUQ9Ins4MURCRDIzQi1EQkM5LTQ2QjgtQjgyMy1BRERCMDQ5NkFCQjV9Ig0KLQlSb290TmFtZXNwYWNlPSJBY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5Ig0KLQlLZXl3b3JkPSJXaW4zMlByb2oiDQotCT4NCi0JPFBsYXRmb3Jtcz4NCi0JCTxQbGF0Zm9ybQ0KLQkJCU5hbWU9IldpbjMyIg0KLQkJLz4NCi0JPC9QbGF0Zm9ybXM+DQotCTxUb29sRmlsZXM+DQotCTwvVG9vbEZpbGVzPg0KLQk8Q29uZmlndXJhdGlvbnM+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KLQkJCUNoYXJhY3RlclNldD0iMSINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiQoSkFWQV9IT01FKVxpbmNsdWRlOyQoSkFWQV9IT01FKVxpbmNsdWRlXHdpbjMyIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19XSU5ET1dTO19VU1JETEw7QUNDRVNTSUJJTElUWVBST1hZTElCUkFSWV9FWFBPUlRTIg0KLQkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSINCi0JCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMyINCi0JCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQotCQkJCVdhcm5pbmdMZXZlbD0iMyINCi0JCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0Ig0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KLQkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ3aW5pbmV0LmxpYiINCi0JCQkJTGlua0luY3JlbWVudGFsPSIyIg0KLQkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQotCQkJCVN1YlN5c3RlbT0iMiINCi0JCQkJVGFyZ2V0TWFjaGluZT0iMSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25EaXIpJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iMiINCi0JCQlDaGFyYWN0ZXJTZXQ9IjEiDQotCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIxIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiQoSkFWQV9IT01FKVxpbmNsdWRlOyQoSkFWQV9IT01FKVxpbmNsdWRlXHdpbjMyIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19XSU5ET1dTO19VU1JETEw7QUNDRVNTSUJJTElUWVBST1hZTElCUkFSWV9FWFBPUlRTIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMCINCi0JCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQotCQkJCVdhcm5pbmdMZXZlbD0iMyINCi0JCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KLQkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJ3aW5pbmV0LmxpYiINCi0JCQkJTGlua0luY3JlbWVudGFsPSIxIg0KLQkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiDQotCQkJCVN1YlN5c3RlbT0iMiINCi0JCQkJT3B0aW1pemVSZWZlcmVuY2VzPSIyIg0KLQkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIg0KLQkJCQlUYXJnZXRNYWNoaW5lPSIxIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQk8L0NvbmZpZ3VyYXRpb25zPg0KLQk8UmVmZXJlbmNlcz4NCi0JPC9SZWZlcmVuY2VzPg0KLQk8RmlsZXM+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iU291cmNlIEZpbGVzIg0KLQkJCUZpbHRlcj0iY3BwO2M7Y2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXgiDQotCQkJVW5pcXVlSWRlbnRpZmllcj0iezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn0iDQotCQkJPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLlxBY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5LmNwcCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii5cb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0LmNwcCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii5cc3RkYWZ4LmNwcCINCi0JCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIxIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJPEZpbGVDb25maWd1cmF0aW9uDQotCQkJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCQkJPg0KLQkJCQkJPFRvb2wNCi0JCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIxIg0KLQkJCQkJLz4NCi0JCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCi0JCQk8L0ZpbGU+DQotCQk8L0ZpbHRlcj4NCi0JCTxGaWx0ZXINCi0JCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQotCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sO2luYzt4c2QiDQotCQkJVW5pcXVlSWRlbnRpZmllcj0iezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn0iDQotCQkJPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLlxzdGRhZnguaCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCTwvRmlsdGVyPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IlJlc291cmNlIEZpbGVzIg0KLQkJCUZpbHRlcj0icmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g7dGlmZjt0aWY7cG5nO3dhdiINCi0JCQlVbmlxdWVJZGVudGlmaWVyPSJ7NjdEQTZBQjYtRjgwMC00YzA4LThCN0EtODNCQjEyMUFBRDAxfSINCi0JCQk+DQotCQk8L0ZpbHRlcj4NCi0JCTxGaWxlDQotCQkJUmVsYXRpdmVQYXRoPSIuXFJlYWRNZS50eHQiDQotCQkJPg0KLQkJPC9GaWxlPg0KLQk8L0ZpbGVzPg0KLQk8R2xvYmFscz4NCi0JPC9HbG9iYWxzPg0KLTwvVmlzdWFsU3R1ZGlvUHJvamVjdD4NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvbGlicmFyeV9zcmMvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS9vcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXQuY3BwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4OWNmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvbGlicmFyeV9zcmMvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS9vcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgInN0ZGFmeC5oIgotI2luY2x1ZGUgIm9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldC5oIgotCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0ludGVybmV0T3BlblcKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBscHN6QWdlbnQsIGppbnQgZHdBY2Nlc3NUeXBlLCBqaW50IGxwc3pQcm94eSwgamludCBscHN6UHJveHlCeXBhc3MsIGppbnQgZHdGbGFncykgCi17Ci0JcmV0dXJuIChqaW50KUludGVybmV0T3BlblcoKExQV1NUUilscHN6QWdlbnQsIGR3QWNjZXNzVHlwZSwgKExQV1NUUilscHN6UHJveHksIChMUFdTVFIpbHBzelByb3h5QnlwYXNzLCBkd0ZsYWdzKTsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSW50ZXJuZXRDbG9zZUhhbmRsZQotICAoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGhJbnRlcm5ldCkKLXsKLQlyZXR1cm4gSW50ZXJuZXRDbG9zZUhhbmRsZSgoSElOVEVSTkVUKWhJbnRlcm5ldCk7Ci19Ci0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0ludGVybmV0U2V0T3B0aW9uVwotICAoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGhJbnRlcm5ldCwgamludCBkd09wdGlvbiwgamludCBscEJ1ZmZlciwgamludCBkd0J1ZmZlckxlbmd0aCkKLXsKLQlyZXR1cm4gSW50ZXJuZXRTZXRPcHRpb25XKChISU5URVJORVQpaEludGVybmV0LCBkd09wdGlvbiwgKExQVk9JRClscEJ1ZmZlciwgZHdCdWZmZXJMZW5ndGgpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JbnRlcm5ldFF1ZXJ5T3B0aW9uVwotICAoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGhJbnRlcm5ldCwgamludCBkd09wdGlvbiwgamludCBscEJ1ZmZlciwgamludEFycmF5IGxwZHdCdWZmZXJMZW5ndGgpCi17Ci0JamludCAqbHBOYXRpdmVMZW5ndGggPSBOVUxMOwotCWlmKCBscGR3QnVmZmVyTGVuZ3RoICkgewotCQlscE5hdGl2ZUxlbmd0aCA9IGVudi0+R2V0SW50QXJyYXlFbGVtZW50cyhscGR3QnVmZmVyTGVuZ3RoLE5VTEwpOwotCX0KLQlqYm9vbGVhbiByYyA9IEludGVybmV0UXVlcnlPcHRpb25XKChISU5URVJORVQpaEludGVybmV0LCBkd09wdGlvbiwgKExQVk9JRClscEJ1ZmZlciwgKExQRFdPUkQpbHBOYXRpdmVMZW5ndGgpOwotCWlmKCBscGR3QnVmZmVyTGVuZ3RoICYmIGxwTmF0aXZlTGVuZ3RoICkgewotCQllbnYtPlJlbGVhc2VJbnRBcnJheUVsZW1lbnRzKGxwZHdCdWZmZXJMZW5ndGgsbHBOYXRpdmVMZW5ndGgsMCk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9GaW5kRmlyc3RVcmxDYWNoZUVudHJ5VwotICAoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGxwc3pVcmxTZWFyY2hQYXR0ZXJuLCBqaW50IGxwRmlyc3RDYWNoZUVudHJ5SW5mbywgamludEFycmF5IGxwY2JDYWNoZUVudHJ5SW5mbykKLXsKLQlqaW50ICpscE5hdGl2ZUxlbmd0aCA9IE5VTEw7Ci0JaWYoIGxwY2JDYWNoZUVudHJ5SW5mbyApIHsKLQkJbHBOYXRpdmVMZW5ndGggPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMobHBjYkNhY2hlRW50cnlJbmZvLE5VTEwpOwotCX0KLQlIQU5ETEUgaGFuZGxlID0gRmluZEZpcnN0VXJsQ2FjaGVFbnRyeVcoKExQV1NUUilscHN6VXJsU2VhcmNoUGF0dGVybiwgKExQSU5URVJORVRfQ0FDSEVfRU5UUllfSU5GT1cpbHBGaXJzdENhY2hlRW50cnlJbmZvLCAoTFBEV09SRClscE5hdGl2ZUxlbmd0aCk7Ci0JaWYoIGxwY2JDYWNoZUVudHJ5SW5mbyAmJiBscE5hdGl2ZUxlbmd0aCApIHsKLQkJZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhscGNiQ2FjaGVFbnRyeUluZm8sbHBOYXRpdmVMZW5ndGgsMCk7Ci0JfQotCXJldHVybiAoamludCloYW5kbGU7Ci19Ci0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0ZpbmROZXh0VXJsQ2FjaGVFbnRyeVcKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBoRW51bUhhbmRsZSwgamludCBscE5leHRDYWNoZUVudHJ5SW5mbywgamludEFycmF5IGxwY2JDYWNoZUVudHJ5SW5mbykKLXsKLQlqaW50ICpscE5hdGl2ZUxlbmd0aCA9IE5VTEw7Ci0JaWYoIGxwY2JDYWNoZUVudHJ5SW5mbyApIHsKLQkJbHBOYXRpdmVMZW5ndGggPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMobHBjYkNhY2hlRW50cnlJbmZvLE5VTEwpOwotCX0KLQlCT09MIHJjID0gRmluZE5leHRVcmxDYWNoZUVudHJ5VygoSEFORExFKWhFbnVtSGFuZGxlLCAoTFBJTlRFUk5FVF9DQUNIRV9FTlRSWV9JTkZPVylscE5leHRDYWNoZUVudHJ5SW5mbywgKExQRFdPUkQpbHBOYXRpdmVMZW5ndGgpOwotCWlmKCBscGNiQ2FjaGVFbnRyeUluZm8gJiYgbHBOYXRpdmVMZW5ndGggKSB7Ci0JCWVudi0+UmVsZWFzZUludEFycmF5RWxlbWVudHMobHBjYkNhY2hlRW50cnlJbmZvLGxwTmF0aXZlTGVuZ3RoLDApOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0ZpbmRDbG9zZVVybENhY2hlCi0gIChKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaEVudW1IYW5kbGUpCi17Ci0JcmV0dXJuIEZpbmRDbG9zZVVybENhY2hlKChIQU5ETEUpaEVudW1IYW5kbGUpOwotfQotCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9EZWxldGVVcmxDYWNoZUVudHJ5VwotICAoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGxwc3pVcmxOYW1lKQotewotCXJldHVybiBEZWxldGVVcmxDYWNoZUVudHJ5VygoTFBXU1RSKWxwc3pVcmxOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5L29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldC5oIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4N2JkY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRE8gTk9UIEVESVQgVEhJUyBGSUxFIC0gaXQgaXMgbWFjaGluZSBnZW5lcmF0ZWQgKi8KLSNpbmNsdWRlIDxqbmkuaD4KLS8qIEhlYWRlciBmb3IgY2xhc3Mgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0ICovCi0KLSNpZm5kZWYgX0luY2x1ZGVkX29yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldAotI2RlZmluZSBfSW5jbHVkZWRfb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0Ci0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QRU5fVFlQRV9QUkVDT05GSUcKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QRU5fVFlQRV9QUkVDT05GSUcgMEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BFTl9UWVBFX0RJUkVDVAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BFTl9UWVBFX0RJUkVDVCAxTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUEVOX1RZUEVfUFJPWFkKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QRU5fVFlQRV9QUk9YWSAzTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUEVOX1RZUEVfUFJFQ09ORklHX1dJVEhfTk9fQVVUT1BST1hZCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUEVOX1RZUEVfUFJFQ09ORklHX1dJVEhfTk9fQVVUT1BST1hZIDRMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DQUxMQkFDSwotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NBTExCQUNLIDFMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DT05ORUNUX1RJTUVPVVQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DT05ORUNUX1RJTUVPVVQgMkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NPTk5FQ1RfUkVUUklFUwotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NPTk5FQ1RfUkVUUklFUyAzTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09OTkVDVF9CQUNLT0ZGCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09OTkVDVF9CQUNLT0ZGIDRMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRU5EX1RJTUVPVVQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRU5EX1RJTUVPVVQgNUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NPTlRST0xfU0VORF9USU1FT1VUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09OVFJPTF9TRU5EX1RJTUVPVVQgNUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1JFQ0VJVkVfVElNRU9VVAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1JFQ0VJVkVfVElNRU9VVCA2TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09OVFJPTF9SRUNFSVZFX1RJTUVPVVQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DT05UUk9MX1JFQ0VJVkVfVElNRU9VVCA2TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fREFUQV9TRU5EX1RJTUVPVVQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9EQVRBX1NFTkRfVElNRU9VVCA3TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fREFUQV9SRUNFSVZFX1RJTUVPVVQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9EQVRBX1JFQ0VJVkVfVElNRU9VVCA4TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fSEFORExFX1RZUEUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9IQU5ETEVfVFlQRSA5TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fTElTVEVOX1RJTUVPVVQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9MSVNURU5fVElNRU9VVCAxMUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1JFQURfQlVGRkVSX1NJWkUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRUFEX0JVRkZFUl9TSVpFIDEyTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fV1JJVEVfQlVGRkVSX1NJWkUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9XUklURV9CVUZGRVJfU0laRSAxM0wKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0FTWU5DX0lECi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQVNZTkNfSUQgMTVMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9BU1lOQ19QUklPUklUWQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0FTWU5DX1BSSU9SSVRZIDE2TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUEFSRU5UX0hBTkRMRQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1BBUkVOVF9IQU5ETEUgMjFMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9LRUVQX0NPTk5FQ1RJT04KLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9LRUVQX0NPTk5FQ1RJT04gMjJMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRVFVRVNUX0ZMQUdTCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUkVRVUVTVF9GTEFHUyAyM0wKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0VYVEVOREVEX0VSUk9SCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fRVhURU5ERURfRVJST1IgMjRMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9PRkZMSU5FX01PREUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9PRkZMSU5FX01PREUgMjZMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DQUNIRV9TVFJFQU1fSEFORExFCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ0FDSEVfU1RSRUFNX0hBTkRMRSAyN0wKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1VTRVJOQU1FCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fVVNFUk5BTUUgMjhMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9QQVNTV09SRAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1BBU1NXT1JEIDI5TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQVNZTkMKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9BU1lOQyAzMEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1NFQ1VSSVRZX0ZMQUdTCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU0VDVVJJVFlfRkxBR1MgMzFMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRUNVUklUWV9DRVJUSUZJQ0FURV9TVFJVQ1QKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRUNVUklUWV9DRVJUSUZJQ0FURV9TVFJVQ1QgMzJMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9EQVRBRklMRV9OQU1FCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fREFUQUZJTEVfTkFNRSAzM0wKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1VSTAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1VSTCAzNEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1NFQ1VSSVRZX0NFUlRJRklDQVRFCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU0VDVVJJVFlfQ0VSVElGSUNBVEUgMzVMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRUNVUklUWV9LRVlfQklUTkVTUwotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1NFQ1VSSVRZX0tFWV9CSVRORVNTIDM2TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUkVGUkVTSAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1JFRlJFU0ggMzdMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9QUk9YWQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1BST1hZIDM4TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU0VUVElOR1NfQ0hBTkdFRAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1NFVFRJTkdTX0NIQU5HRUQgMzlMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9WRVJTSU9OCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fVkVSU0lPTiA0MEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1VTRVJfQUdFTlQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9VU0VSX0FHRU5UIDQxTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fRU5EX0JST1dTRVJfU0VTU0lPTgotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0VORF9CUk9XU0VSX1NFU1NJT04gNDJMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9QUk9YWV9VU0VSTkFNRQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1BST1hZX1VTRVJOQU1FIDQzTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUFJPWFlfUEFTU1dPUkQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9QUk9YWV9QQVNTV09SRCA0NEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NPTlRFWFRfVkFMVUUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DT05URVhUX1ZBTFVFIDQ1TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09OTkVDVF9MSU1JVAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NPTk5FQ1RfTElNSVQgNDZMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRUNVUklUWV9TRUxFQ1RfQ0xJRU5UX0NFUlQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRUNVUklUWV9TRUxFQ1RfQ0xJRU5UX0NFUlQgNDdMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9QT0xJQ1kKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9QT0xJQ1kgNDhMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9ESVNDT05ORUNURURfVElNRU9VVAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0RJU0NPTk5FQ1RFRF9USU1FT1VUIDQ5TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09OTkVDVEVEX1NUQVRFCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09OTkVDVEVEX1NUQVRFIDUwTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fSURMRV9TVEFURQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0lETEVfU1RBVEUgNTFMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9PRkZMSU5FX1NFTUFOVElDUwotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX09GRkxJTkVfU0VNQU5USUNTIDUyTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU0VDT05EQVJZX0NBQ0hFX0tFWQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1NFQ09OREFSWV9DQUNIRV9LRVkgNTNMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DQUxMQkFDS19GSUxURVIKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DQUxMQkFDS19GSUxURVIgNTRMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DT05ORUNUX1RJTUUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DT05ORUNUX1RJTUUgNTVMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRU5EX1RIUk9VR0hQVVQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TRU5EX1RIUk9VR0hQVVQgNTZMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRUNFSVZFX1RIUk9VR0hQVVQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRUNFSVZFX1RIUk9VR0hQVVQgNTdMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRVFVRVNUX1BSSU9SSVRZCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUkVRVUVTVF9QUklPUklUWSA1OEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0hUVFBfVkVSU0lPTgotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0hUVFBfVkVSU0lPTiA1OUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1JFU0VUX1VSTENBQ0hFX1NFU1NJT04KLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRVNFVF9VUkxDQUNIRV9TRVNTSU9OIDYwTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fRVJST1JfTUFTSwotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0VSUk9SX01BU0sgNjJMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9GUk9NX0NBQ0hFX1RJTUVPVVQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9GUk9NX0NBQ0hFX1RJTUVPVVQgNjNMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9CWVBBU1NfRURJVEVEX0VOVFJZCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQllQQVNTX0VESVRFRF9FTlRSWSA2NEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0RJQUdOT1NUSUNfU09DS0VUX0lORk8KLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9ESUFHTk9TVElDX1NPQ0tFVF9JTkZPIDY3TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09ERVBBR0UKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DT0RFUEFHRSA2OEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0NBQ0hFX1RJTUVTVEFNUFMKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DQUNIRV9USU1FU1RBTVBTIDY5TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fRElTQUJMRV9BVVRPRElBTAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0RJU0FCTEVfQVVUT0RJQUwgNzBMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9NQVhfQ09OTlNfUEVSX1NFUlZFUgotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX01BWF9DT05OU19QRVJfU0VSVkVSIDczTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fTUFYX0NPTk5TX1BFUl8xXzBfU0VSVkVSCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fTUFYX0NPTk5TX1BFUl8xXzBfU0VSVkVSIDc0TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUEVSX0NPTk5FQ1RJT05fT1BUSU9OCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fUEVSX0NPTk5FQ1RJT05fT1BUSU9OIDc1TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fRElHRVNUX0FVVEhfVU5MT0FECi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fRElHRVNUX0FVVEhfVU5MT0FEIDc2TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fSUdOT1JFX09GRkxJTkUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9JR05PUkVfT0ZGTElORSA3N0wKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0lERU5USVRZCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fSURFTlRJVFkgNzhMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRU1PVkVfSURFTlRJVFkKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRU1PVkVfSURFTlRJVFkgNzlMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9BTFRFUl9JREVOVElUWQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0FMVEVSX0lERU5USVRZIDgwTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU1VQUFJFU1NfQkVIQVZJT1IKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TVVBQUkVTU19CRUhBVklPUiA4MUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0FVVE9ESUFMX01PREUKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9BVVRPRElBTF9NT0RFIDgyTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQVVUT0RJQUxfQ09OTkVDVElPTgotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0FVVE9ESUFMX0NPTk5FQ1RJT04gODNMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DTElFTlRfQ0VSVF9DT05URVhUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ0xJRU5UX0NFUlRfQ09OVEVYVCA4NEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0FVVEhfRkxBR1MKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9BVVRIX0ZMQUdTIDg1TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQ09PS0lFU18zUkRfUEFSVFkKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9DT09LSUVTXzNSRF9QQVJUWSA4NkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0RJU0FCTEVfUEFTU1BPUlRfQVVUSAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0RJU0FCTEVfUEFTU1BPUlRfQVVUSCA4N0wKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1NFTkRfVVRGOF9TRVJWRVJOQU1FX1RPX1BST1hZCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU0VORF9VVEY4X1NFUlZFUk5BTUVfVE9fUFJPWFkgODhMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9FWEVNUFRfQ09OTkVDVElPTl9MSU1JVAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0VYRU1QVF9DT05ORUNUSU9OX0xJTUlUIDg5TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fRU5BQkxFX1BBU1NQT1JUX0FVVEgKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9FTkFCTEVfUEFTU1BPUlRfQVVUSCA5MEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0hJQkVSTkFURV9JTkFDVElWRV9XT1JLRVJfVEhSRUFEUwotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0hJQkVSTkFURV9JTkFDVElWRV9XT1JLRVJfVEhSRUFEUyA5MUwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX0FDVElWQVRFX1dPUktFUl9USFJFQURTCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fQUNUSVZBVEVfV09SS0VSX1RIUkVBRFMgOTJMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRVNUT1JFX1dPUktFUl9USFJFQURfREVGQVVMVFMKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9SRVNUT1JFX1dPUktFUl9USFJFQURfREVGQVVMVFMgOTNMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9TT0NLRVRfU0VORF9CVUZGRVJfTEVOR1RICi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fU09DS0VUX1NFTkRfQlVGRkVSX0xFTkdUSCA5NEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfT1BUSU9OX1BST1hZX1NFVFRJTkdTX0NIQU5HRUQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX09QVElPTl9QUk9YWV9TRVRUSU5HU19DSEFOR0VEIDk1TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fREFUQUZJTEVfRVhUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9PUFRJT05fREFUQUZJTEVfRVhUIDk2TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9GSVJTVF9PUFRJT04KLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0lOVEVSTkVUX0ZJUlNUX09QVElPTiAxTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldF9JTlRFUk5FVF9MQVNUX09QVElPTgotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSU5URVJORVRfTEFTVF9PUFRJT04gOTZMCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXQKLSAqIE1ldGhvZDogICAgSW50ZXJuZXRPcGVuVwotICogU2lnbmF0dXJlOiAoSUlJSUkpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0ludGVybmV0T3BlblcKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXQKLSAqIE1ldGhvZDogICAgSW50ZXJuZXRDbG9zZUhhbmRsZQotICogU2lnbmF0dXJlOiAoSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0ludGVybmV0Q2xvc2VIYW5kbGUKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXQKLSAqIE1ldGhvZDogICAgSW50ZXJuZXRTZXRPcHRpb25XCi0gKiBTaWduYXR1cmU6IChJSUlJKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfSW50ZXJuZXRTZXRPcHRpb25XCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50LCBqaW50LCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0Ci0gKiBNZXRob2Q6ICAgIEludGVybmV0UXVlcnlPcHRpb25XCi0gKiBTaWduYXR1cmU6IChJSUlbSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0ludGVybmV0UXVlcnlPcHRpb25XCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50LCBqaW50LCBqaW50LCBqaW50QXJyYXkpOwotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXQKLSAqIE1ldGhvZDogICAgRmluZEZpcnN0VXJsQ2FjaGVFbnRyeVcKLSAqIFNpZ25hdHVyZTogKElJW0kpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0ZpbmRGaXJzdFVybENhY2hlRW50cnlXCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50LCBqaW50LCBqaW50QXJyYXkpOwotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXQKLSAqIE1ldGhvZDogICAgRmluZE5leHRVcmxDYWNoZUVudHJ5VwotICogU2lnbmF0dXJlOiAoSUlbSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0ZpbmROZXh0VXJsQ2FjaGVFbnRyeVcKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQsIGppbnQsIGppbnRBcnJheSk7Ci0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfbW9kZWxfZmxhc2hfcHJveHlfaW50ZXJuYWxfV2luSW5ldAotICogTWV0aG9kOiAgICBGaW5kQ2xvc2VVcmxDYWNoZQotICogU2lnbmF0dXJlOiAoSSlaCi0gKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0X0ZpbmRDbG9zZVVybENhY2hlCi0gIChKTklFbnYgKiwgamNsYXNzLCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl9tb2RlbF9mbGFzaF9wcm94eV9pbnRlcm5hbF9XaW5JbmV0Ci0gKiBNZXRob2Q6ICAgIERlbGV0ZVVybENhY2hlRW50cnlXCi0gKiBTaWduYXR1cmU6IChJKVoKLSAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX21vZGVsX2ZsYXNoX3Byb3h5X2ludGVybmFsX1dpbkluZXRfRGVsZXRlVXJsQ2FjaGVFbnRyeVcKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvbGlicmFyeV9zcmMvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS9zdGRhZnguY3BwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvc3RkYWZ4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlNzUyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvbGlicmFyeV9zcmMvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS9zdGRhZnguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gc3RkYWZ4LmNwcCA6IHNvdXJjZSBmaWxlIHRoYXQgaW5jbHVkZXMganVzdCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMKLS8vIEFjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkucGNoIHdpbGwgYmUgdGhlIHByZS1jb21waWxlZCBoZWFkZXIKLS8vIHN0ZGFmeC5vYmogd2lsbCBjb250YWluIHRoZSBwcmUtY29tcGlsZWQgdHlwZSBpbmZvcm1hdGlvbgotCi0jaW5jbHVkZSAic3RkYWZ4LmgiCi0KLS8vIFRPRE86IHJlZmVyZW5jZSBhbnkgYWRkaXRpb25hbCBoZWFkZXJzIHlvdSBuZWVkIGluIFNUREFGWC5ICi0vLyBhbmQgbm90IGluIHRoaXMgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L2xpYnJhcnlfc3JjL0FjY2Vzc2liaWxpdHlQcm94eUxpYnJhcnkvc3RkYWZ4LmggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvbGlicmFyeV9zcmMvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS9zdGRhZnguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiNDQ2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvbGlicmFyeV9zcmMvQWNjZXNzaWJpbGl0eVByb3h5TGlicmFyeS9zdGRhZnguaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIHN0ZGFmeC5oIDogaW5jbHVkZSBmaWxlIGZvciBzdGFuZGFyZCBzeXN0ZW0gaW5jbHVkZSBmaWxlcywKLS8vIG9yIHByb2plY3Qgc3BlY2lmaWMgaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSB1c2VkIGZyZXF1ZW50bHksIGJ1dAotLy8gYXJlIGNoYW5nZWQgaW5mcmVxdWVudGx5Ci0vLwotCi0jcHJhZ21hIG9uY2UKLQotLy8gTW9kaWZ5IHRoZSBmb2xsb3dpbmcgZGVmaW5lcyBpZiB5b3UgaGF2ZSB0byB0YXJnZXQgYSBwbGF0Zm9ybSBwcmlvciB0byB0aGUgb25lcyBzcGVjaWZpZWQgYmVsb3cuCi0vLyBSZWZlciB0byBNU0ROIGZvciB0aGUgbGF0ZXN0IGluZm8gb24gY29ycmVzcG9uZGluZyB2YWx1ZXMgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMuCi0jaWZuZGVmIFdJTlZFUgkJCQkvLyBBbGxvdyB1c2Ugb2YgZmVhdHVyZXMgc3BlY2lmaWMgdG8gV2luZG93cyBYUCBvciBsYXRlci4KLSNkZWZpbmUgV0lOVkVSIDB4MDUwMQkJLy8gQ2hhbmdlIHRoaXMgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIHRvIHRhcmdldCBvdGhlciB2ZXJzaW9ucyBvZiBXaW5kb3dzLgotI2VuZGlmCi0KLSNpZm5kZWYgX1dJTjMyX1dJTk5UCQkvLyBBbGxvdyB1c2Ugb2YgZmVhdHVyZXMgc3BlY2lmaWMgdG8gV2luZG93cyBYUCBvciBsYXRlci4gICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA1MDEJLy8gQ2hhbmdlIHRoaXMgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIHRvIHRhcmdldCBvdGhlciB2ZXJzaW9ucyBvZiBXaW5kb3dzLgotI2VuZGlmCQkJCQkJCi0KLSNpZm5kZWYgX1dJTjMyX1dJTkRPV1MJCS8vIEFsbG93IHVzZSBvZiBmZWF0dXJlcyBzcGVjaWZpYyB0byBXaW5kb3dzIDk4IG9yIGxhdGVyLgotI2RlZmluZSBfV0lOMzJfV0lORE9XUyAweDA0MTAgLy8gQ2hhbmdlIHRoaXMgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIHRvIHRhcmdldCBXaW5kb3dzIE1lIG9yIGxhdGVyLgotI2VuZGlmCi0KLSNpZm5kZWYgX1dJTjMyX0lFCQkJLy8gQWxsb3cgdXNlIG9mIGZlYXR1cmVzIHNwZWNpZmljIHRvIElFIDYuMCBvciBsYXRlci4KLSNkZWZpbmUgX1dJTjMyX0lFIDB4MDYwMAkvLyBDaGFuZ2UgdGhpcyB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgdG8gdGFyZ2V0IG90aGVyIHZlcnNpb25zIG9mIElFLgotI2VuZGlmCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgkJLy8gRXhjbHVkZSByYXJlbHktdXNlZCBzdHVmZiBmcm9tIFdpbmRvd3MgaGVhZGVycwotLy8gV2luZG93cyBIZWFkZXIgRmlsZXM6Ci0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0KLS8vIFRPRE86IHJlZmVyZW5jZSBhZGRpdGlvbmFsIGhlYWRlcnMgeW91ciBwcm9ncmFtIHJlcXVpcmVzIGhlcmUKLSNpbmNsdWRlIDxXaW5JbmV0Lmg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYzNlNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUHJveHlQcmVmZXJlbmNlUGFnZS5uYW1lPUZsYXNoIFByb3h5Ci1Qcm94eUxvZ1ZpZXcubmFtZT1GbGFzaCBQcm94eSBMb2dzCi1Qcm94eU1lbnUubmFtZT0mQ2FjaGUKLURlbGV0ZUFjdGlvbi5uYW1lPUNsZWFyIGludGVybmV0IGNhY2hlCi1EZWxldGVBY3Rpb24udGlwPUNsZWFyIGludGVybmV0IGNhY2hlCi1Qcm94eVByZWZlcmVuY2VzPUZsYXNoIFByb3h5IFByZWZlcmVuY2VzLi4uCi1QcmVmZXJlbmNlcz1QcmVmZXJlbmNlcy4uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5MzZmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5zdGFydHVwIj4KLSAgICAgIDxzdGFydHVwIGNsYXNzPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LlByb3h5U3RhcnR1cCIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5hY3RmLnVpLnByZWZlcmVuY2VzLlJvb3RQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LnByZWZlcmVuY2VzLlByb3h5UHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5wcmVmZXJlbmNlcy5Qcm94eVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgbmFtZT0iJVByb3h5UHJlZmVyZW5jZVBhZ2UubmFtZSIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LnByZWZlcmVuY2VzLlByb3h5UHJlZmVyZW5jZUluaXRpYWxpemVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHkudWkudmlld3MuUHJveHlMb2dWaWV3IgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvdmlldzE2L3Byb3h5bG9ndmlldy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eS51aS52aWV3cy5Qcm94eUxvZ1ZpZXciCi0gICAgICAgICAgICBuYW1lPSIlUHJveHlMb2dWaWV3Lm5hbWUiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5hY3Rpb25TZXQiCi0gICAgICAgICAgICBsYWJlbD0iUHJveHkgQWN0aW9uIFNldHMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHkudWkuYWN0aW9ucy5EZWxldGVDYWNoZUFjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LmFjdGlvbnMuRGVsZXRlQ2FjaGVBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJURlbGV0ZUFjdGlvbi5uYW1lIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImZpbGUvY2FjaGVHcm91cCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVEZWxldGVBY3Rpb24udGlwIi8+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgICAgCi0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld0FjdGlvbnMiPgotICAgIDx2aWV3Q29udHJpYnV0aW9uCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gudmlld2VyQ29udHJpYnV0aW9uMSIKLSAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuYWN0Zi52aXN1YWxpemF0aW9uLmZsYXNoLnVpLnZpZXdzLkZsYXNoRE9NVmlldyI+Ci0gICAgICAgPGFjdGlvbgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LnVpLmFjdGlvbnMuT3BlblByZWZlcmVuY2VzQWN0aW9uIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LmFjdGlvbjEiCi0gICAgICAgICAgICAgbGFiZWw9IiVQcm94eVByZWZlcmVuY2VzIgotICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiLz4KLSAgICA8L3ZpZXdDb250cmlidXRpb24+Ci0gICAgPHZpZXdDb250cmlidXRpb24KLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC52aWV3ZXJDb250cmlidXRpb24yIgotICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LnVpLnZpZXdzLlByb3h5TG9nVmlldyI+Ci0gICAgICAgPGFjdGlvbgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LnVpLmFjdGlvbnMuT3BlblByZWZlcmVuY2VzQWN0aW9uIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LmFjdGlvbjIiCi0gICAgICAgICAgICAgbGFiZWw9IiVQcmVmZXJlbmNlcyIKLSAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIi8+Ci0gICAgPC92aWV3Q29udHJpYnV0aW9uPgotIDwvZXh0ZW5zaW9uPgotICAgCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDllYjA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVByb3h5UHJlZmVyZW5jZVBhZ2UubmFtZT1GbGFzaCBcdTMwZDdcdTMwZWRcdTMwYWRcdTMwYjcKLVByb3h5TG9nVmlldy5uYW1lPUZsYXNoIFx1MzBkN1x1MzBlZFx1MzBhZFx1MzBiNyBcdTMwZWRcdTMwYjAKLVByb3h5TWVudS5uYW1lPVx1MzBhZFx1MzBlM1x1MzBjM1x1MzBiN1x1MzBlNSgmQykKLURlbGV0ZUFjdGlvbi5uYW1lPVx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBjZFx1MzBjM1x1MzBjOFx1MzBhZFx1MzBlM1x1MzBjM1x1MzBiN1x1MzBlNVx1MzA5Mlx1NTI0YVx1OTY2NAotRGVsZXRlQWN0aW9uLnRpcD1cdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwY2RcdTMwYzNcdTMwYzhcdTMwYWRcdTMwZTNcdTMwYzNcdTMwYjdcdTMwZTVcdTMwOTJcdTUyNGFcdTk2NjRcdTMwNTdcdTMwN2VcdTMwNTkKLVByb3h5UHJlZmVyZW5jZXM9Rmxhc2ggXHUzMGQ3XHUzMGVkXHUzMGFkXHUzMGI3XHU4YTJkXHU1YjlhLi4uCi1QcmVmZXJlbmNlcz1cdThhMmRcdTViOWEuLi4KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzgxYTJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI2RvIG5vdCB0cmFuc2xhdGUgdGhlIGZvbGxvd2luZyBtZXNzYWdlcwotTk9fREVMRVRFPXxnaWZ8anBnfGpwZWd8cG5nfGJtcHxpY298cGRmfHR4dHx0ZXh0fGRvY3x4bHN8cHB0fGh0bXxodG1sfHNodG1sfGpzcHxhc3B8cGhwfGh0YXxodGN8YXNoeHx4bWx8Y3NzfGpzfHZifHZic3x2Ynh8YXV8YXZpfG1wM3xhaWZ8YWlmZnxhc2Z8YXN4fHdtfHdtdnx3bWF8bWlkfGV4ZXxjYWJ8emlwfGZsdnwKLSNTcGVjaWZ5IHVybCBleHRlbnNpb25zIHRvIGJlIGJ5cGFzc2VkLiBUaGlzIGlzIGZvciBkZWJ1ZyBwdXJwb3NlIG9ubHkuCi1OT19QUk9YWT0KLQotI3RyYW5zbGF0ZSB0aGUgZm9sbG93aW5nIG1lc3NhZ2VzCi1wcm94eS5jbGVhcl90aXA9Q2xlYXIgTG9ncwotcHJveHkuY2xlYXI9Q2xlYXIKLXByb3h5LnNvdXJjZT1Tb3VyY2UKLXByb3h5Lmdsb2JhbD1TeXN0ZW0gZ2xvYmFsCi1wcm94eS50aW1lPVRpbWUKLXByb3h5LnR5cGU9VXNlIEhUVFAgUHJveHkgRm9yOgotcHJveHkubm9uZT1Ob25lCi1wcm94eS5zaG93X2ZpbmU9U2hvdyB0cmFjZSBsb2dzCi1wcm94eS5tZXNzYWdlPU1lc3NhZ2UKLXByb3h5LmNvcHk9JkNvcHkKLQotcHJveHkuc3dmbWV0aG9kPVNXRiBicmlkZ2UgbWV0aG9kOgotcHJveHkuc3dmbWV0aG9kLm5vbmU9RG8gbm90aGluZy4KLXByb3h5LnN3Zm1ldGhvZC5ib290bG9hZGVyPVVzZSBhbiBTV0YgYm9vdGxvYWRlci4KLXByb3h5LnN3Zm1ldGhvZC50cmFuc2NvZGVyPVRyYW5zY29kZSBpbmNvbWluZyBTV0ZzLgotCi1wcm94eS5wcmVmX2Rlc2NyaXB0aW9uPUhUVFAgUHJveHkgc2V0dGluZ3MKLXByb3h5LmRlbGV0aW5nX2NhY2hlPURlbGV0aW5nIGludGVybmV0IGNhY2hlIC4uLgotcHJveHkuc2Vzc2lvbj1UaGlzIHNlc3Npb24gb25seQotcHJveHkuc3dmX3ZlcnNpb249TWluaW11bSBTV0YgdmVyc2lvbiB0byBiZSBoYW5kbGVkOgotcHJveHkudGltZW91dD1UaW1lb3V0IChzZWNvbmRzKToKLXByb3h5LnBvcnQ9UG9ydCAoMS02NTUzNSwgMD1BdXRvbWF0aWMpOgotCi1wcm94eS5kaWFsb2cudGV4dD1DbGVhciBJbnRlcm5ldCBDYWNoZSBEaWFsb2cKLXByb3h5LmRpYWxvZy5vaz1PSwotcHJveHkuY2FjaGVfY2xlYXI9SW50ZXJuZXQgQ2FjaGUgQ2xlYXIKLQotcHJveHkuY2FjaGVfY29uZmlybWF0aW9uMT13aWxsIGRlbGV0ZSB5b3VyIEludGVybmV0IGNhY2hlIG9mIEZsYXNoIGNvbnRlbnRcbnRvIGFjY2VzcyB0aGUgRmxhc2ggY29udGVudC4KLXByb3h5LmNhY2hlX2NsZWFyX3doZW5fc3RhcnR1cF9hbmRfY2FjaGVfY2xlYXI9Q2xlYXIgSW50ZXJuZXQgY2FjaGUgd2l0aG91dCBjb21maXJtaW5nIChyZWNvbW1lbmRlZCkKLXByb3h5LmNvbmZpcm1fYW5kX2NhY2hlX2NsZWFyPUNsZWFyIEludGVybmV0IGNhY2hlIGZvciB0aGlzIHRpbWUKLXByb3h5LmNvbmZpcm1fYW5kX25vX29wZXJhdGlvbj1EbyBub3QgY2xlYXIgdGhlIGNhY2hlIChGbGFzaCBmdW5jdGlvbmFsaXR5IHdvdWxkIG5vdCB3b3JrISkKLQotcHJveHkuY2FjaGVfY2xlYXJfd2hlbl9zdGFydHVwPUNsZWFyIHdpdGhvdXQgY29uZmlybWluZwotcHJveHkuY29uZmlybV9jYWNoZV9jbGVhcj1Db25maXJtIGJlZm9yZSBjbGVhcgotcHJveHkubm9fY2FjaGVfY2xlYXI9TmV2ZXIgY2xlYXIgdGhlIGNhY2hlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL21lc3NhZ2VzX2phLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL21lc3NhZ2VzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYzU5YjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9tZXNzYWdlc19qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJveHkuY2xlYXJfdGlwPVx1MzBlZFx1MzBiMFx1MzA5Mlx1NmQ4OFx1NTNiYlx1MzA1N1x1MzA3ZVx1MzA1OQotcHJveHkuY2xlYXI9XHUzMGFmXHUzMGVhXHUzMGEyCi1wcm94eS5zaG93X2ZpbmU9XHUzMGM4XHUzMGVjXHUzMGZjXHUzMGI5XHUzMGVkXHUzMGIwXHUzMDkyXHU4ODY4XHU3OTNhXHUzMDU5XHUzMDhiCi1wcm94eS5zb3VyY2U9XHUzMGJkXHUzMGZjXHUzMGI5Ci1wcm94eS5nbG9iYWw9XHUzMGI3XHUzMGI5XHUzMGM2XHUzMGUwXHU1MTY4XHU0ZjUzCi1wcm94eS50aW1lPVx1NjY0Mlx1NTIzYgotcHJveHkudHlwZT1IVFRQXHUzMGQ3XHUzMGVkXHUzMGFkXHUzMGI3XHU5MDY5XHU3NTI4OgotcHJveHkubm9uZT1cdTcxMjFcdTMwNTcKLXByb3h5Lm1lc3NhZ2U9XHUzMGUxXHUzMGMzXHUzMGJiXHUzMGZjXHUzMGI4Ci1wcm94eS5wcmVmX2Rlc2NyaXB0aW9uPUhUVFBcdTMwZDdcdTMwZWRcdTMwYWRcdTMwYjdcdTMwNmVcdThhMmRcdTViOWEKLXByb3h5LmRlbGV0aW5nX2NhY2hlPVx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBjZFx1MzBjM1x1MzBjOFx1MzBhZFx1MzBlM1x1MzBjM1x1MzBiN1x1MzBlNVx1MzA5Mlx1NTI0YVx1OTY2NFx1NGUyZFx1MzA2N1x1MzA1OSAuLi4KLXByb3h5LnNlc3Npb249XHUzMDUzXHUzMDZlXHUzMGJiXHUzMGMzXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHUzMDdmCi1wcm94eS5zd2ZfdmVyc2lvbj1cdTViZmVcdThjNjFcdTMwNjhcdTMwNmFcdTMwOGJTV0ZcdTMwNmVcdTY3MDBcdTRmNGVcdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjM6Ci1wcm94eS50aW1lb3V0PVx1MzBiZlx1MzBhNFx1MzBlMFx1MzBhMlx1MzBhNlx1MzBjOCAoXHU3OWQyKToKLXByb3h5LmNvcHk9XHUzMGIzXHUzMGQ0XHUzMGZjKCZDKQotCi1wcm94eS5kaWFsb2cudGV4dD1cdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwY2RcdTMwYzNcdTMwYzhcdTMwYWRcdTMwZTNcdTMwYzNcdTMwYjdcdTMwZTVcdTMwNmVcdTUyNGFcdTk2NjQKLXByb3h5LmRpYWxvZy5vaz1PSwotcHJveHkuY2FjaGVfY2xlYXI9XHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGNkXHUzMGMzXHUzMGM4XHUzMGFkXHUzMGUzXHUzMGMzXHUzMGI3XHUzMGU1XHUzMDZlXHU1MjRhXHU5NjY0Ci0KLXByb3h5LmNhY2hlX2NvbmZpcm1hdGlvbjE9XHUzMDZmRmxhc2hcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNmJcdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlcdTMwNTlcdTMwOGJcdTMwNWZcdTMwODFcdTMwNmJcdTMwMDFGbGFzaFx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNFx1MzA2ZVxuXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGNkXHUzMGMzXHUzMGM4XHUzMGFkXHUzMGUzXHUzMGMzXHUzMGI3XHUzMGU1XHUzMDkyXHU1MjRhXHU5NjY0XHUzMDU3XHUzMDg4XHUzMDQ2XHUzMDY4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyCi1wcm94eS5jYWNoZV9jbGVhcl93aGVuX3N0YXJ0dXBfYW5kX2NhY2hlX2NsZWFyPVx1NzhiYVx1OGE4ZFx1MzA1Ylx1MzA1YVx1MzA2Ylx1MzBhZFx1MzBlM1x1MzBjM1x1MzBiN1x1MzBlNVx1MzA5Mlx1NTI0YVx1OTY2NFx1MzA1OVx1MzA4Ylx1MzAwMFx1ZmYwOFx1NjNhOFx1NTk2OFx1ZmYwOQotcHJveHkuY29uZmlybV9hbmRfY2FjaGVfY2xlYXI9XHU0ZWNhXHU1NmRlXHUzMDYwXHUzMDUxXHUzMGFkXHUzMGUzXHUzMGMzXHUzMGI3XHUzMGU1XHUzMDkyXHU1MjRhXHU5NjY0XHUzMDU5XHUzMDhiCi1wcm94eS5jb25maXJtX2FuZF9ub19vcGVyYXRpb249XHU0ZWNhXHU1NmRlXHUzMDZmXHUzMGFkXHUzMGUzXHUzMGMzXHUzMGI3XHUzMGU1XHUzMDkyXHU1MjRhXHU5NjY0XHUzMDU3XHUzMDZhXHUzMDQ0XHUzMDAwXHVmZjA4Rmxhc2hcdTMwNmVcdTZhNWZcdTgwZmRcdTMwNGNcdTZiNjNcdTVlMzhcdTMwNmJcdTUyZDVcdTRmNWNcdTMwNTdcdTMwNmFcdTMwNDRcdTUzZWZcdTgwZmRcdTYwMjdcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDJcdWZmMDkKLXByb3h5LnBvcnQ9XHUzMGRkXHUzMGZjXHUzMGM4ICgxLTY1NTM1LCAwPVx1ODFlYVx1NTJkNSk6Ci0KLXByb3h5LmNhY2hlX2NsZWFyX3doZW5fc3RhcnR1cD1cdTc4YmFcdThhOGRcdTMwNWJcdTMwNWFcdTMwNmJcdTUyNGFcdTk2NjRcdTMwNTlcdTMwOGIKLXByb3h5LmNvbmZpcm1fY2FjaGVfY2xlYXI9XHU1MjRhXHU5NjY0XHUzMDU5XHUzMDhiXHU1MjRkXHUzMDZiXHU3OGJhXHU4YThkXHUzMDU5XHUzMDhiCi1wcm94eS5ub19jYWNoZV9jbGVhcj1cdTVlMzhcdTMwNmJcdTUyNGFcdTk2NjRcdTMwNTdcdTMwNmFcdTMwNDQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvRmxhc2hDYWNoZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS9GbGFzaENhY2hlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGMxNjBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS9GbGFzaENhY2hlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eS5Qcm94eVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LnByZWZlcmVuY2VzLlByb3h5UHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LnVpLkNhY2hlQ2xlYXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eS51aS5hY3Rpb25zLkRlbGV0ZUNhY2hlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSB1dGlsaXRpZXMgdG8gY29udHJvbCBJbnRlcm5ldCBjYWNoZSB0byBhY2Nlc3Mgb2JqZWN0IG1vZGVsIG9mIEZsYXNoCi0gKiBjb250ZW50LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBGbGFzaENhY2hlVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FjaGVDaGVja2VkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG93cyBhIGRpYWxvZyB0byBjb25maXJtIHVzZXJzJyBwcmVmZXJlbmNlIGZvciBjYWNoZSBjbGVhci4KLQkgKiBJZiB1c2VycyBhbHJlYWR5IHNlbGVjdGVkIHRoZSAiUmVtb3ZlIGNhY2hlIHdpdGhvdXQgY29uZmlybWF0aW9uIiBvcHRpb24KLQkgKiBpbiB0aGUgcHJlZmVyZW5jZSwgdGhpcyBtZXRob2Qgd2lsbCBzdGFydCB0byByZW1vdmUgY2FjaGUuIElmIHVzZXJzCi0JICogc2VsZWN0ICJEbyBub3QgY2xlYXIgdGhlIGNhY2hlIiwgdGhpcyBtZXRob2Qgd2lsbCBub3QgcmVtb3ZlIGNhY2hlLiBUaGlzCi0JICogbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYXBwbGljYXRpb24gbGF1bmNoIChwb3N0V2luZG93T3BlbiBwaGFzZSBpbgotCSAqIFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0NhY2hlKCkgewotCi0JCVByb3h5UGx1Z2luIHByb3h5UGx1Z2luID0gUHJveHlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlJUHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VTdG9yZSA9IHByb3h5UGx1Z2luLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCVN0cmluZyBzZXR0aW5nID0gcHJlZmVyZW5jZVN0b3JlCi0JCQkJLmdldFN0cmluZyhQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9DQUNIRV9DTEVBUik7Ci0KLQkJYm9vbGVhbiBjbGVhckNhY2hlRmxhZyA9IHRydWUgJiYgIWNhY2hlQ2hlY2tlZDsKLQotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCVNoZWxsIHNoZWxsID0gd2luZG93LmdldFNoZWxsKCk7Ci0JCWlmIChzZXR0aW5nLmVxdWFscyhQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ09ORklSTV9XSEVOX1NUQVJUVVApCi0JCQkJJiYgIWNhY2hlQ2hlY2tlZCkgewotCi0JCQlDYWNoZUNsZWFyRGlhbG9nIGRpYWxvZyA9IG51bGw7Ci0KLQkJCWRpYWxvZyA9IG5ldyBDYWNoZUNsZWFyRGlhbG9nKHNoZWxsLCBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkKLQkJCQkJLmdldE5hbWUoKSk7Ci0JCQl0cnkgewotCQkJCS8vIGludCByZXN1bHQgPQotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBzZWxlY3QgPSBkaWFsb2cuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCWlmIChzZWxlY3QKLQkJCQkJLmVxdWFscyhQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfQ0xFQVJfV0hFTl9TVEFSVFVQX0FORF9DQUNIRV9DTEVBUikpIHsKLQkJCQlwcmVmZXJlbmNlU3RvcmUuc2V0VmFsdWUoCi0JCQkJCQlQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9DQUNIRV9DTEVBUiwKLQkJCQkJCVByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9DTEVBUl9XSEVOX1NUQVJUVVApOwotCQkJfSBlbHNlIGlmIChzZWxlY3QKLQkJCQkJLmVxdWFscyhQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ09ORklSTV9BTkRfQ0FDSEVfQ0xFQVIpKSB7Ci0JCQkJcHJlZmVyZW5jZVN0b3JlLnNldFZhbHVlKAotCQkJCQkJUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBfQ0FDSEVfQ0xFQVIsCi0JCQkJCQlQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ09ORklSTV9XSEVOX1NUQVJUVVApOwotCQkJfSBlbHNlIGlmIChzZWxlY3QKLQkJCQkJLmVxdWFscyhQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ09ORklSTV9BTkRfTk9fT1BFUkFUSU9OKSkgewotCQkJCXByZWZlcmVuY2VTdG9yZS5zZXRWYWx1ZSgKLQkJCQkJCVByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QX0NBQ0hFX0NMRUFSLAotCQkJCQkJUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTkZJUk1fV0hFTl9TVEFSVFVQKTsKLQkJCQljbGVhckNhY2hlRmxhZyA9IGZhbHNlOwotCQkJfQotCQl9IGVsc2UgaWYgKHNldHRpbmcKLQkJCQkuZXF1YWxzKFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9DTEVBUl9XSEVOX1NUQVJUVVApCi0JCQkJJiYgY2FjaGVDaGVja2VkKSB7Ci0JCQljbGVhckNhY2hlRmxhZyA9IGZhbHNlOwotCQl9IGVsc2UgaWYgKHNldHRpbmcuZXF1YWxzKFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5OT19DQUNIRV9DTEVBUikpIHsKLQkJCWNsZWFyQ2FjaGVGbGFnID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAoY2xlYXJDYWNoZUZsYWcpIHsKLQkJCWNsZWFyQ2FjaGUoZmFsc2UsIHdpbmRvdyk7Ci0JCQkvLyBEZWxldGVDYWNoZUFjdGlvbiBkY2EgPSBuZXcgRGVsZXRlQ2FjaGVBY3Rpb24oKTsKLQkJCS8vIGRjYS5pbml0KHdpbmRvdyk7Ci0JCQkvLyBkY2EucnVuKG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2xlYXJzIEludGVybmV0IGNhY2hlIGluIGJhY2tncm91bmQgaWYgdXNlcnMgc2VsZWN0ICJSZW1vdmUKLQkgKiBjYWNoZSB3aXRob3V0IGNvbmZpcm1hdGlvbiIgb3B0aW9uIGluIHRoZSBwcmVmZXJlbmNlLiBJdCBpcyB1c2VmdWwgdG8KLQkgKiBjbGVhciBjYWNoZSBpbiBwcmVXaW5kb3dPcGVuIHBoYXNlIGluIFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyQ2FjaGVGb3JTdGFydHVwKCkgewotCi0JCVN0cmluZyBzZXR0aW5nID0gUHJveHlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJLmdldFN0cmluZyhQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9DQUNIRV9DTEVBUik7Ci0KLQkJaWYgKHNldHRpbmcuZXF1YWxzKFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5DQUNIRV9DTEVBUl9XSEVOX1NUQVJUVVApKSB7Ci0JCQljbGVhckNhY2hlKGZhbHNlLCBudWxsKTsKLQkJCS8vIERlbGV0ZUNhY2hlQWN0aW9uIGRjYSA9IG5ldyBEZWxldGVDYWNoZUFjdGlvbigpOwotCQkJLy8gZGNhLnJ1bihudWxsKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRvIGNsZWFyIFNXRiBjYWNoZQotCSAqIAotCSAqIEBwYXJhbSBiYWNrZ3JvdW5kCi0JICogICAgICAgICAgICBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcgZmxhZwotCSAqIEBwYXJhbSB3aW5kb3cKLQkgKiAgICAgICAgICAgIGFjdGl2ZSBXb3JrYmVuY2hXaW5kb3cgZm9yIHByb2dyZXNzIGRpYWxvZy4gdXNlIG51bGwgZm9yCi0JICogICAgICAgICAgICBzaWxlbnQgbW9kZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJDYWNoZShib29sZWFuIGJhY2tncm91bmQsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCURlbGV0ZUNhY2hlQWN0aW9uIGRjYSA9IG5ldyBEZWxldGVDYWNoZUFjdGlvbihiYWNrZ3JvdW5kKTsKLQkJZGNhLmluaXQod2luZG93KTsKLQkJZGNhLnJ1bihudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS9pbnRlcm5hbC9JTlRFUk5FVF9QRVJfQ09OTl9PUFRJT04uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS9pbnRlcm5hbC9JTlRFUk5FVF9QRVJfQ09OTl9PUFRJT04uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5MDQwNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvaW50ZXJuYWwvSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci0KLQotCi1wdWJsaWMgY2xhc3MgSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OIHsKLSAgICBwdWJsaWMgaW50IGR3T3B0aW9uOyAgICAgCi0gICAgcHVibGljIGludCBkd1ZhbHVlOwotICAgIHB1YmxpYyBXU1RSIHN0clZhbHVlID0gbmV3IFdTVFIoKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSAxMjsgLy8gKzQgZm9yIEZJTEVUSU1FCi0gICAgCi0gICAgLy8KLSAgICAvLyAgT3B0aW9ucyB1c2VkIGluIElOVEVSTkVUX1BFUl9DT05OX09QVE9OIHN0cnVjdAotICAgIC8vCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfUEVSX0NPTk5fRkxBR1MgICAgICAgICAgICAgICAgICAgICAgICA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfUEVSX0NPTk5fUFJPWFlfU0VSVkVSICAgICAgICAgICAgICAgICA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfUEVSX0NPTk5fUFJPWFlfQllQQVNTICAgICAgICAgICAgICAgICA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfUEVSX0NPTk5fQVVUT0NPTkZJR19VUkwgICAgICAgICAgICAgICA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfUEVSX0NPTk5fQVVUT0RJU0NPVkVSWV9GTEFHUyAgICAgICAgICA9IDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfUEVSX0NPTk5fQVVUT0NPTkZJR19TRUNPTkRBUllfVVJMICAgICA9IDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfUEVSX0NPTk5fQVVUT0NPTkZJR19SRUxPQURfREVMQVlfTUlOUyA9IDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfUEVSX0NPTk5fQVVUT0NPTkZJR19MQVNUX0RFVEVDVF9USU1FICA9IDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfUEVSX0NPTk5fQVVUT0NPTkZJR19MQVNUX0RFVEVDVF9VUkwgICA9IDk7Ci0KLSAgICAvLwotICAgIC8vICAgICBQRVJfQ09OTl9GTEFHUwotICAgIC8vCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPWFlfVFlQRV9ESVJFQ1QgICAgICAgICA9IDB4MDAwMDAwMDE7ICAgLy8gZGlyZWN0IHRvIG5ldAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1hZX1RZUEVfUFJPWFkgICAgICAgICAgPSAweDAwMDAwMDAyOyAgIC8vIHZpYSBuYW1lZCBwcm94eQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1hZX1RZUEVfQVVUT19QUk9YWV9VUkwgPSAweDAwMDAwMDA0OyAgIC8vIGF1dG9wcm94eSBVUkwKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9YWV9UWVBFX0FVVE9fREVURUNUICAgID0gMHgwMDAwMDAwODsgICAvLyB1c2UgYXV0b3Byb3h5IGRldGVjdGlvbgotCi0gICAgLy8KLSAgICAvLyBUeXBlIG9mIHZhbHVlCi0gICAgLy8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfSU5UID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfU1RSSU5HID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfRklMRVRJTUUgPSAyOwotCi0gICAgCi0gICAgcHVibGljIHZvaWQgZ2V0RGF0YShpbnQgcERhdGEpIHsKLSAgICAgICAgaWYoIDAgIT0gcERhdGEgKSB7Ci0gICAgICAgICAgICBPUy5Nb3ZlTWVtb3J5KHBEYXRhLG5ldyBpbnRbXXtkd09wdGlvbiwwLDB9LDQqMyk7Ci0gICAgICAgICAgICBzd2l0Y2goIGdldFZhbHVlVHlwZSgpICkgewotICAgICAgICAgICAgICAgIGNhc2UgVkFMVUVfSU5UOgotICAgICAgICAgICAgICAgICAgICBPUy5Nb3ZlTWVtb3J5KHBEYXRhKzQsbmV3IGludFtde2R3VmFsdWV9LDQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFZBTFVFX1NUUklORzoKLSAgICAgICAgICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShwRGF0YSs0LCBuZXcgaW50W10ge3N0clZhbHVlLmdldEFkZHJlc3MoKX0sIDQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhKGludCBwRGF0YSkgewotICAgICAgICBpZiggMCAhPSBwRGF0YSApIHsKLSAgICAgICAgICAgIGludFtdIHBPcHRpb24gPSBuZXcgaW50WzNdOwotICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShwT3B0aW9uLHBEYXRhLDQqcE9wdGlvbi5sZW5ndGgpOwotICAgICAgICAgICAgZHdPcHRpb24gPSBwT3B0aW9uWzBdOwotICAgICAgICAgICAgc3dpdGNoKCBnZXRWYWx1ZVR5cGUoKSApIHsKLSAgICAgICAgICAgICAgICBjYXNlIFZBTFVFX0lOVDoKLSAgICAgICAgICAgICAgICAgICAgZHdWYWx1ZSA9IHBPcHRpb25bMV07Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVkFMVUVfU1RSSU5HOgotICAgICAgICAgICAgICAgICAgICBzdHJWYWx1ZS5zZXREYXRhKHBPcHRpb25bMV0pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzdHJWYWx1ZS5kaXNwb3NlKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGdldFZhbHVlVHlwZSgpIHsKLSAgICAgICAgc3dpdGNoKCBkd09wdGlvbiApIHsKLSAgICAgICAgICAgIGNhc2UgSU5URVJORVRfUEVSX0NPTk5fRkxBR1M6Ci0gICAgICAgICAgICBjYXNlIElOVEVSTkVUX1BFUl9DT05OX0FVVE9ESVNDT1ZFUllfRkxBR1M6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFZBTFVFX0lOVDsKLSAgICAgICAgICAgIGNhc2UgSU5URVJORVRfUEVSX0NPTk5fUFJPWFlfU0VSVkVSOgotICAgICAgICAgICAgY2FzZSBJTlRFUk5FVF9QRVJfQ09OTl9QUk9YWV9CWVBBU1M6Ci0gICAgICAgICAgICBjYXNlIElOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfVVJMOgotICAgICAgICAgICAgY2FzZSBJTlRFUk5FVF9QRVJfQ09OTl9BVVRPQ09ORklHX1NFQ09OREFSWV9VUkw6Ci0gICAgICAgICAgICBjYXNlIElOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfUkVMT0FEX0RFTEFZX01JTlM6Ci0gICAgICAgICAgICBjYXNlIElOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfTEFTVF9ERVRFQ1RfVVJMOgotICAgICAgICAgICAgICAgIHJldHVybiBWQUxVRV9TVFJJTkc7Ci0gICAgICAgICAgICBjYXNlIElOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfTEFTVF9ERVRFQ1RfVElNRToKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImR3T3B0aW9uICIrZHdPcHRpb24rIiBpcyBub3Qgc3VwcG9ydGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIHJldHVybiBWQUxVRV9GSUxFVElNRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyBzOwotICAgICAgICBzd2l0Y2goIGR3T3B0aW9uICkgewotICAgICAgICAgICAgY2FzZSBJTlRFUk5FVF9QRVJfQ09OTl9GTEFHUzoKLSAgICAgICAgICAgICAgICBzID0gIklOVEVSTkVUX1BFUl9DT05OX0ZMQUdTIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJTlRFUk5FVF9QRVJfQ09OTl9QUk9YWV9TRVJWRVI6Ci0gICAgICAgICAgICAgICAgcyA9ICJJTlRFUk5FVF9QRVJfQ09OTl9QUk9YWV9TRVJWRVIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElOVEVSTkVUX1BFUl9DT05OX1BST1hZX0JZUEFTUzoKLSAgICAgICAgICAgICAgICBzID0gIklOVEVSTkVUX1BFUl9DT05OX1BST1hZX0JZUEFTUyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSU5URVJORVRfUEVSX0NPTk5fQVVUT0NPTkZJR19VUkw6Ci0gICAgICAgICAgICAgICAgcyA9ICJJTlRFUk5FVF9QRVJfQ09OTl9BVVRPQ09ORklHX1VSTCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSU5URVJORVRfUEVSX0NPTk5fQVVUT0RJU0NPVkVSWV9GTEFHUzoKLSAgICAgICAgICAgICAgICBzID0gIklOVEVSTkVUX1BFUl9DT05OX0FVVE9ESVNDT1ZFUllfRkxBR1MiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfU0VDT05EQVJZX1VSTDoKLSAgICAgICAgICAgICAgICBzID0gIklOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfU0VDT05EQVJZX1VSTCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSU5URVJORVRfUEVSX0NPTk5fQVVUT0NPTkZJR19SRUxPQURfREVMQVlfTUlOUzoKLSAgICAgICAgICAgICAgICBzID0gIklOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfUkVMT0FEX0RFTEFZX01JTlMiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfTEFTVF9ERVRFQ1RfVElNRToKLSAgICAgICAgICAgICAgICBzID0gIklOVEVSTkVUX1BFUl9DT05OX0FVVE9DT05GSUdfTEFTVF9ERVRFQ1RfVElNRSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSU5URVJORVRfUEVSX0NPTk5fQVVUT0NPTkZJR19MQVNUX0RFVEVDVF9VUkw6Ci0gICAgICAgICAgICAgICAgcyA9ICJJTlRFUk5FVF9QRVJfQ09OTl9BVVRPQ09ORklHX0xBU1RfREVURUNUX1VSTCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcyA9ICJJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT046IGR3T3B0aW9uPSIrZHdPcHRpb247IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2goIGdldFZhbHVlVHlwZSgpICkgewotICAgICAgICAgICAgY2FzZSBWQUxVRV9JTlQ6Ci0gICAgICAgICAgICAgICAgcyArPSAiIGR3VmFsdWU9Iitkd1ZhbHVlOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFZBTFVFX1NUUklORzoKLSAgICAgICAgICAgICAgICBzICs9ICIgc3RyVmFsdWU9IitzdHJWYWx1ZS5nZXRTdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS9pbnRlcm5hbC9JTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05fTElTVC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L2ludGVybmFsL0lOVEVSTkVUX1BFUl9DT05OX09QVElPTl9MSVNULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYzM0YWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L2ludGVybmFsL0lOVEVSTkVUX1BFUl9DT05OX09QVElPTl9MSVNULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLQotCi0KLXB1YmxpYyBjbGFzcyBJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05fTElTVCB7Ci0gICAgcHVibGljIFdTVFIgICB3c0Nvbm5lY3Rpb24gPSBuZXcgV1NUUigpOyAgLy8gY29ubmVjdGlvbiBuYW1lIHRvIHNldC9xdWVyeSBwZXJDb25uT3B0aW9ucwotICAgIHB1YmxpYyBpbnQgICAgZHdPcHRpb25Db3VudCA9IDA7IC8vIG51bWJlciBvZiBwZXJDb25uT3B0aW9ucyB0byBzZXQvcXVlcnkKLSAgICBwdWJsaWMgaW50ICAgIGR3T3B0aW9uRXJyb3IgPSAwOyAvLyBvbiBlcnJvciwgd2hpY2ggb3B0aW9uIGZhaWxlZAotICAgIHB1YmxpYyBJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05bXSBwZXJDb25uT3B0aW9ucyA9IG51bGw7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2l6ZW9mID0gMjA7Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgb3B0aW9uc0FkZHJlc3M7Ci0gICAgCi0gICAgcHVibGljIElOVEVSTkVUX1BFUl9DT05OX09QVElPTl9MSVNUKGludCBvcHRpb25Db3VudCkgewotICAgICAgICBkd09wdGlvbkNvdW50ID0gb3B0aW9uQ291bnQ7Ci0gICAgICAgIHBlckNvbm5PcHRpb25zID0gbmV3IElOVEVSTkVUX1BFUl9DT05OX09QVElPTltkd09wdGlvbkNvdW50XTsKLSAgICAgICAgZm9yKCBpbnQgaT0wOyBpPHBlckNvbm5PcHRpb25zLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgcGVyQ29ubk9wdGlvbnNbaV0gPSBuZXcgSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgCi0gICAgcHVibGljIHZvaWQgZ2V0RGF0YShpbnQgcERhdGEpIHsKLSAgICAgICAgaWYoIDAgIT0gcERhdGEgKSB7Ci0gICAgICAgICAgICBpZiggMCA9PSBvcHRpb25zQWRkcmVzcyApIHsKLSAgICAgICAgICAgICAgICBvcHRpb25zQWRkcmVzcyA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT04uc2l6ZW9mKmR3T3B0aW9uQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIG51bGwgIT0gcGVyQ29ubk9wdGlvbnMgKSB7Ci0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaT0wOyBpPHBlckNvbm5PcHRpb25zLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgICAgICAgICBwZXJDb25uT3B0aW9uc1tpXS5nZXREYXRhKG9wdGlvbnNBZGRyZXNzK0lOVEVSTkVUX1BFUl9DT05OX09QVElPTi5zaXplb2YqaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShwRGF0YSxuZXcgaW50W117c2l6ZW9mLHdzQ29ubmVjdGlvbi5nZXRBZGRyZXNzKCksZHdPcHRpb25Db3VudCxkd09wdGlvbkVycm9yLG9wdGlvbnNBZGRyZXNzfSw0KjUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERhdGEoaW50IHBEYXRhKSB7Ci0gICAgICAgIGlmKCAwICE9IHBEYXRhICkgewotICAgICAgICAgICAgaW50W10gcExpc3QgPSBuZXcgaW50WzVdOwotICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShwTGlzdCxwRGF0YSw0KnBMaXN0Lmxlbmd0aCk7Ci0gICAgICAgICAgICBpZiggc2l6ZW9mID09IHBMaXN0WzBdICkgewotICAgICAgICAgICAgICAgIHdzQ29ubmVjdGlvbi5zZXREYXRhKHBMaXN0WzFdKTsKLSAgICAgICAgICAgICAgICBkd09wdGlvbkNvdW50ID0gcExpc3RbMl07Ci0gICAgICAgICAgICAgICAgZHdPcHRpb25FcnJvciA9IHBMaXN0WzNdOwotICAgICAgICAgICAgICAgIG9wdGlvbnNBZGRyZXNzID0gcExpc3RbNF07Ci0gICAgICAgICAgICAgICAgaWYoIG51bGwgIT0gcGVyQ29ubk9wdGlvbnMgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBwZXJDb25uT3B0aW9ucy5sZW5ndGggPT1kd09wdGlvbkNvdW50ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgaT0wOyBpPHBlckNvbm5PcHRpb25zLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlckNvbm5PcHRpb25zW2ldLnNldERhdGEob3B0aW9uc0FkZHJlc3MrSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLnNpemVvZippKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICB3c0Nvbm5lY3Rpb24uZGlzcG9zZSgpOwotICAgICAgICBpZiggbnVsbCAhPSBwZXJDb25uT3B0aW9ucyApIHsKLSAgICAgICAgICAgIGZvciggaW50IGk9MDsgaTxwZXJDb25uT3B0aW9ucy5sZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgICAgICBwZXJDb25uT3B0aW9uc1tpXS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwZXJDb25uT3B0aW9ucyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoIDAgIT0gb3B0aW9uc0FkZHJlc3MgKSB7Ci0gICAgICAgICAgICBPUy5HbG9iYWxGcmVlKG9wdGlvbnNBZGRyZXNzKTsKLSAgICAgICAgICAgIG9wdGlvbnNBZGRyZXNzID0gMDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS9pbnRlcm5hbC9XU1RSLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvcHJveHkvaW50ZXJuYWwvV1NUUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGRiZDdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS9pbnRlcm5hbC9XU1RSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLQotCi0KLXB1YmxpYyBjbGFzcyBXU1RSIHsKLQotICAgIHByaXZhdGUgaW50IGFkZHJlc3MgPSAwOwotICAgIHByaXZhdGUgU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIFdTVFIoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBXU1RSKFN0cmluZyBuZXdTdHJpbmcpIHsKLSAgICAgICAgc2V0U3RyaW5nKG5ld1N0cmluZyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBXU1RSKGludCBuZXdBZGRyZXNzKSB7Ci0gICAgICAgIHNldERhdGEobmV3QWRkcmVzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZyhTdHJpbmcgbmV3U3RyaW5nKSB7Ci0gICAgICAgIGRpc3Bvc2UoKTsKLSAgICAgICAgc3RyaW5nID0gbmV3U3RyaW5nOwotICAgICAgICBpZiggbnVsbCAhPSBzdHJpbmcgKSB7Ci0gICAgICAgICAgICBjaGFyW10gYnVmZmVyID0gKHN0cmluZyArICJcMCIpLnRvQ2hhckFycmF5KCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGFkZHJlc3MgPSBPUy5HbG9iYWxBbGxvYyhPUy5HTUVNX0ZJWEVEIHwgT1MuR01FTV9aRVJPSU5JVCxidWZmZXIubGVuZ3RoKjIpOwotICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShhZGRyZXNzLGJ1ZmZlcixidWZmZXIubGVuZ3RoKjIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotICAgICAgICByZXR1cm4gc3RyaW5nOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhKGludCBuZXdBZGRyZXNzKSB7Ci0gICAgICAgIGlmKCBhZGRyZXNzICE9IG5ld0FkZHJlc3MgKSB7Ci0gICAgICAgICAgICBkaXNwb3NlKCk7Ci0gICAgICAgICAgICBhZGRyZXNzID0gbmV3QWRkcmVzczsKLSAgICAgICAgfQotICAgICAgICBzdHJpbmcgPSBudWxsOwotICAgICAgICBpZiggMCAhPSBhZGRyZXNzICkgewotICAgICAgICAgICAgaW50IHNpemUgPSBPUy53Y3NsZW4oYWRkcmVzcyk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbc2l6ZV07Ci0gICAgICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShidWZmZXIsIGFkZHJlc3MsIHNpemUqMik7Ci0gICAgICAgICAgICAgICAgc3RyaW5nID0gbmV3IFN0cmluZyhidWZmZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldEFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBhZGRyZXNzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiggMCAhPSBhZGRyZXNzICkgewotICAgICAgICAgICAgT1MuR2xvYmFsRnJlZShhZGRyZXNzKTsKLSAgICAgICAgICAgIGFkZHJlc3MgPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L2ludGVybmFsL1dpbkluZXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9wcm94eS9pbnRlcm5hbC9XaW5JbmV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyY2RhZjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3Byb3h5L2ludGVybmFsL1dpbkluZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5pbnRlcm5hbDsKLQotCi1wdWJsaWMgY2xhc3MgV2luSW5ldCB7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJBY2Nlc3NpYmlsaXR5UHJveHlMaWJyYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyAgYWNjZXNzIHR5cGVzIGZvciBJbnRlcm5ldE9wZW4oKQotICAgIC8vCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BFTl9UWVBFX1BSRUNPTkZJRyAgICAgICAgICAgICAgICAgICA9IDA7ICAgLy8gdXNlIHJlZ2lzdHJ5IGNvbmZpZ3VyYXRpb24KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUEVOX1RZUEVfRElSRUNUICAgICAgICAgICAgICAgICAgICAgID0gMTsgICAvLyBkaXJlY3QgdG8gbmV0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BFTl9UWVBFX1BST1hZICAgICAgICAgICAgICAgICAgICAgICA9IDM7ICAgLy8gdmlhIG5hbWVkIHByb3h5Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BFTl9UWVBFX1BSRUNPTkZJR19XSVRIX05PX0FVVE9QUk9YWSA9IDQ7ICAgLy8gcHJldmVudCB1c2luZyBqYXZhL3NjcmlwdC9JTlMKLQotICAgIC8vCi0gICAgLy8gIHBlckNvbm5PcHRpb25zIG1hbmlmZXN0cyBmb3IgSW50ZXJuZXR7UXVlcnl8U2V0fU9wdGlvbgotICAgIC8vCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0NBTExCQUNLICAgICAgICAgICAgICAgID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQ09OTkVDVF9USU1FT1VUICAgICAgICAgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9DT05ORUNUX1JFVFJJRVMgICAgICAgICA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0NPTk5FQ1RfQkFDS09GRiAgICAgICAgID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fU0VORF9USU1FT1VUICAgICAgICAgICAgPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9DT05UUk9MX1NFTkRfVElNRU9VVCAgICA9IElOVEVSTkVUX09QVElPTl9TRU5EX1RJTUVPVVQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1JFQ0VJVkVfVElNRU9VVCAgICAgICAgID0gNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQ09OVFJPTF9SRUNFSVZFX1RJTUVPVVQgPSBJTlRFUk5FVF9PUFRJT05fUkVDRUlWRV9USU1FT1VUOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9EQVRBX1NFTkRfVElNRU9VVCAgICAgICA9IDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0RBVEFfUkVDRUlWRV9USU1FT1VUICAgID0gODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fSEFORExFX1RZUEUgICAgICAgICAgICAgPSA5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9MSVNURU5fVElNRU9VVCAgICAgICAgICA9IDExOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9SRUFEX0JVRkZFUl9TSVpFICAgICAgICA9IDEyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9XUklURV9CVUZGRVJfU0laRSAgICAgICA9IDEzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9BU1lOQ19JRCAgICAgICAgICAgICAgICA9IDE1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9BU1lOQ19QUklPUklUWSAgICAgICAgICA9IDE2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9QQVJFTlRfSEFORExFICAgICAgICAgICA9IDIxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9LRUVQX0NPTk5FQ1RJT04gICAgICAgICA9IDIyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9SRVFVRVNUX0ZMQUdTICAgICAgICAgICA9IDIzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9FWFRFTkRFRF9FUlJPUiAgICAgICAgICA9IDI0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9PRkZMSU5FX01PREUgICAgICAgICAgICA9IDI2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9DQUNIRV9TVFJFQU1fSEFORExFICAgICA9IDI3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9VU0VSTkFNRSAgICAgICAgICAgICAgICA9IDI4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9QQVNTV09SRCAgICAgICAgICAgICAgICA9IDI5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9BU1lOQyAgICAgICAgICAgICAgICAgICA9IDMwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9TRUNVUklUWV9GTEFHUyAgICAgICAgICA9IDMxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9TRUNVUklUWV9DRVJUSUZJQ0FURV9TVFJVQ1QgPSAzMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fREFUQUZJTEVfTkFNRSAgICAgICAgICAgPSAzMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fVVJMICAgICAgICAgICAgICAgICAgICAgPSAzNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fU0VDVVJJVFlfQ0VSVElGSUNBVEUgICAgPSAzNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fU0VDVVJJVFlfS0VZX0JJVE5FU1MgICAgPSAzNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fUkVGUkVTSCAgICAgICAgICAgICAgICAgPSAzNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fUFJPWFkgICAgICAgICAgICAgICAgICAgPSAzODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fU0VUVElOR1NfQ0hBTkdFRCAgICAgICAgPSAzOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fVkVSU0lPTiAgICAgICAgICAgICAgICAgPSA0MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fVVNFUl9BR0VOVCAgICAgICAgICAgICAgPSA0MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fRU5EX0JST1dTRVJfU0VTU0lPTiAgICAgPSA0MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fUFJPWFlfVVNFUk5BTUUgICAgICAgICAgPSA0MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fUFJPWFlfUEFTU1dPUkQgICAgICAgICAgPSA0NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQ09OVEVYVF9WQUxVRSAgICAgICAgICAgPSA0NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQ09OTkVDVF9MSU1JVCAgICAgICAgICAgPSA0NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fU0VDVVJJVFlfU0VMRUNUX0NMSUVOVF9DRVJUID0gNDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1BPTElDWSAgICAgICAgICAgICAgICAgID0gNDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0RJU0NPTk5FQ1RFRF9USU1FT1VUICAgID0gNDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0NPTk5FQ1RFRF9TVEFURSAgICAgICAgID0gNTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0lETEVfU1RBVEUgICAgICAgICAgICAgID0gNTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX09GRkxJTkVfU0VNQU5USUNTICAgICAgID0gNTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1NFQ09OREFSWV9DQUNIRV9LRVkgICAgID0gNTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0NBTExCQUNLX0ZJTFRFUiAgICAgICAgID0gNTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0NPTk5FQ1RfVElNRSAgICAgICAgICAgID0gNTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1NFTkRfVEhST1VHSFBVVCAgICAgICAgID0gNTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1JFQ0VJVkVfVEhST1VHSFBVVCAgICAgID0gNTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1JFUVVFU1RfUFJJT1JJVFkgICAgICAgID0gNTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0hUVFBfVkVSU0lPTiAgICAgICAgICAgID0gNTk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1JFU0VUX1VSTENBQ0hFX1NFU1NJT04gID0gNjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0VSUk9SX01BU0sgICAgICAgICAgICAgID0gNjI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0ZST01fQ0FDSEVfVElNRU9VVCAgICAgID0gNjM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0JZUEFTU19FRElURURfRU5UUlkgICAgID0gNjQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0RJQUdOT1NUSUNfU09DS0VUX0lORk8gID0gNjc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0NPREVQQUdFICAgICAgICAgICAgICAgID0gNjg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0NBQ0hFX1RJTUVTVEFNUFMgICAgICAgID0gNjk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX0RJU0FCTEVfQVVUT0RJQUwgICAgICAgID0gNzA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX01BWF9DT05OU19QRVJfU0VSVkVSICAgID0gNzM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX01BWF9DT05OU19QRVJfMV8wX1NFUlZFUiA9IDc0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9QRVJfQ09OTkVDVElPTl9PUFRJT04gICA9IDc1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9ESUdFU1RfQVVUSF9VTkxPQUQgICAgICA9IDc2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9JR05PUkVfT0ZGTElORSAgICAgICAgICA9IDc3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9JREVOVElUWSAgICAgICAgICAgICAgICA9IDc4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9SRU1PVkVfSURFTlRJVFkgICAgICAgICA9IDc5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9BTFRFUl9JREVOVElUWSAgICAgICAgICA9IDgwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9TVVBQUkVTU19CRUhBVklPUiAgICAgICA9IDgxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9BVVRPRElBTF9NT0RFICAgICAgICAgICA9IDgyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9BVVRPRElBTF9DT05ORUNUSU9OICAgICA9IDgzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9DTElFTlRfQ0VSVF9DT05URVhUICAgICA9IDg0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9BVVRIX0ZMQUdTICAgICAgICAgICAgICA9IDg1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9DT09LSUVTXzNSRF9QQVJUWSAgICAgICA9IDg2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9ESVNBQkxFX1BBU1NQT1JUX0FVVEggICA9IDg3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9TRU5EX1VURjhfU0VSVkVSTkFNRV9UT19QUk9YWSA9IDg4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9FWEVNUFRfQ09OTkVDVElPTl9MSU1JVCA9IDg5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9FTkFCTEVfUEFTU1BPUlRfQVVUSCAgICA9IDkwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkVUX09QVElPTl9ISUJFUk5BVEVfSU5BQ1RJVkVfV09SS0VSX1RIUkVBRFMgPSA5MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fQUNUSVZBVEVfV09SS0VSX1RIUkVBRFMgPSA5MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fUkVTVE9SRV9XT1JLRVJfVEhSRUFEX0RFRkFVTFRTID0gOTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfT1BUSU9OX1NPQ0tFVF9TRU5EX0JVRkZFUl9MRU5HVEggPSA5NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fUFJPWFlfU0VUVElOR1NfQ0hBTkdFRCAgPSA5NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9PUFRJT05fREFUQUZJTEVfRVhUICAgICAgICAgICAgPSA5NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5FVF9GSVJTVF9PUFRJT04gICAgICAgICAgICAgICAgICAgPSBJTlRFUk5FVF9PUFRJT05fQ0FMTEJBQ0s7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJORVRfTEFTVF9PUFRJT04gICAgICAgICAgICAgICAgICAgID0gSU5URVJORVRfT1BUSU9OX0RBVEFGSUxFX0VYVDsKLQotICAgIC8qKiBOYXRpdmVzICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IEludGVybmV0T3BlblcoaW50IGxwc3pBZ2VudCwgaW50IGR3QWNjZXNzVHlwZSwgaW50IGxwc3pQcm94eSwgaW50IGxwc3pQcm94eUJ5cGFzcywgaW50IGR3RmxhZ3MpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gSW50ZXJuZXRDbG9zZUhhbmRsZShpbnQgaEludGVybmV0KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIEludGVybmV0U2V0T3B0aW9uVyhpbnQgaEludGVybmV0LCBpbnQgZHdPcHRpb24sIGludCBscEJ1ZmZlciwgaW50IGR3QnVmZmVyTGVuZ3RoKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIEludGVybmV0UXVlcnlPcHRpb25XKGludCBoSW50ZXJuZXQsIGludCBkd09wdGlvbiwgaW50IGxwQnVmZmVyLCBpbnRbXSBscGR3QnVmZmVyTGVuZ3RoKTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgRmluZEZpcnN0VXJsQ2FjaGVFbnRyeVcoaW50IGxwc3pVcmxTZWFyY2hQYXR0ZXJuLGludCBscEZpcnN0Q2FjaGVFbnRyeUluZm8sIGludFtdIGxwY2JDYWNoZUVudHJ5SW5mbyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBGaW5kTmV4dFVybENhY2hlRW50cnlXKGludCBoRW51bUhhbmRsZSxpbnQgbHBOZXh0Q2FjaGVFbnRyeUluZm8saW50W10gbHBjYkNhY2hlRW50cnlJbmZvKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIEZpbmRDbG9zZVVybENhY2hlKGludCBoRW51bUhhbmRsZSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBEZWxldGVVcmxDYWNoZUVudHJ5VyhpbnQgbHBzelVybE5hbWUpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDZmNjUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJtZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuICchJyArIGtleSArICchJzsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9Qcm94eU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9Qcm94eU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5M2JiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvUHJveHlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5icmlkZ2UuSVdhWGNvZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmJyaWRnZS5XYVhjb2RpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkuaW50ZXJuYWwuSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkuaW50ZXJuYWwuSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OX0xJU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5pbnRlcm5hbC5XU1RSOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkuaW50ZXJuYWwuV2luSW5ldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LmxvZ3MuUHJveHlMb2dIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLQotCi0KLQotcHVibGljIGNsYXNzIFByb3h5TWFuYWdlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5pdExvZ2dlciA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmb3JjZVByb3h5ID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vUHJveHkgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIk5PX1BST1hZIik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLQlzdGF0aWMgewotCQlTdHJpbmdbXSB0ZW1wID0gUGxhdGZvcm0uZ2V0QXBwbGljYXRpb25BcmdzKCk7Ci0JCWZvciggaW50IGk9MDsgaTx0ZW1wLmxlbmd0aDsgaSsrICkgewotCQkJaWYoICItaW5pdExvZ2dlciIuZXF1YWxzKHRlbXBbaV0pICkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW5pdExvZ2dlciA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmKCAiLWZvcmNlUHJveHkiLmVxdWFscyh0ZW1wW2ldKSApIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZvcmNlUHJveHkgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiggIi1ub1Byb3h5Ii5lcXVhbHModGVtcFtpXSkgKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiggaSA8IHRlbXAubGVuZ3RoLTEgKSB7Ci0JCQkJCVN0cmluZyBuZXh0QXJnID0gdGVtcFtpKzFdOwotCQkJCQlpZiggbmV4dEFyZy5zdGFydHNXaXRoKCJ8IikgJiYgbmV4dEFyZy5lbmRzV2l0aCgifCIpICkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCW5vUHJveHkgPSBuZXh0QXJnOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgICAgIGlmKCBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpICkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpbml0TG9nZ2VyID0gIitpbml0TG9nZ2VyKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmb3JjZVByb3h5ID0gIitmb3JjZVByb3h5KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJub1Byb3h5ID0gIitub1Byb3h5KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0JfQotCi0gICAgcHJpdmF0ZSBJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05fTElTVCBzYXZlZExpc3Q7Ci0gICAgcHJpdmF0ZSBpbnQgc2F2ZWRBZGRyZXNzOwotICAgIHByaXZhdGUgaW50IGhTZXNzaW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkUmVzdG9yZSA9IGZhbHNlOwotICAgIHByaXZhdGUgaW50IGN1cnJlbnRQb3J0ID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJPVENPTF9IVFRQID0gICAiaHR0cCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJPVENPTF9IVFRQUyA9ICAiaHR0cHMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBST1RDT0xfRlRQID0gICAgImZ0cCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJPVENPTF9HT1BIRVIgPSAiZ29waGVyIjsgLy8kTk9OLU5MUy0xJAotLy8gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gUFJPVENPTF9FWFRSQSA9IG5ldyBTdHJpbmdbXXsiaHR0cHMiLCJmdHAiLCJnb3BoZXIifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAKLSAgICBwdWJsaWMgUHJveHlNYW5hZ2VyKCkgewotICAgICAgICAvLyBTYXZlIGRlZmF1bHQgc2V0dGluZ3MKLSAgICAgICAgc2F2ZWRMaXN0ID0gbmV3IElOVEVSTkVUX1BFUl9DT05OX09QVElPTl9MSVNUKDQpOwotICAgICAgICBzYXZlZExpc3QucGVyQ29ubk9wdGlvbnNbMF0uZHdPcHRpb249SU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLklOVEVSTkVUX1BFUl9DT05OX0ZMQUdTOwotICAgICAgICBzYXZlZExpc3QucGVyQ29ubk9wdGlvbnNbMV0uZHdPcHRpb249SU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLklOVEVSTkVUX1BFUl9DT05OX1BST1hZX1NFUlZFUjsKLSAgICAgICAgc2F2ZWRMaXN0LnBlckNvbm5PcHRpb25zWzJdLmR3T3B0aW9uPUlOVEVSTkVUX1BFUl9DT05OX09QVElPTi5JTlRFUk5FVF9QRVJfQ09OTl9QUk9YWV9CWVBBU1M7Ci0gICAgICAgIHNhdmVkTGlzdC5wZXJDb25uT3B0aW9uc1szXS5kd09wdGlvbj1JTlRFUk5FVF9QRVJfQ09OTl9PUFRJT04uSU5URVJORVRfUEVSX0NPTk5fQVVUT0NPTkZJR19VUkw7Ci0gICAgICAgIHNhdmVkQWRkcmVzcyA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05fTElTVC5zaXplb2YpOwotICAgICAgICBzYXZlZExpc3QuZ2V0RGF0YShzYXZlZEFkZHJlc3MpOwotICAgICAgICBpbnRbXSBwSW50ID0gbmV3IGludFtde0lOVEVSTkVUX1BFUl9DT05OX09QVElPTl9MSVNULnNpemVvZn07Ci0gICAgICAgIFdpbkluZXQuSW50ZXJuZXRRdWVyeU9wdGlvblcoMCxXaW5JbmV0LklOVEVSTkVUX09QVElPTl9QRVJfQ09OTkVDVElPTl9PUFRJT04sc2F2ZWRBZGRyZXNzLHBJbnQpOwotICAgICAgICBzYXZlZExpc3Quc2V0RGF0YShzYXZlZEFkZHJlc3MpOwotICAgICAgICBXU1RSIHdzQWdlbnQgPSBuZXcgV1NUUigiQWdlbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBoU2Vzc2lvbiA9IFdpbkluZXQuSW50ZXJuZXRPcGVuVyh3c0FnZW50LmdldEFkZHJlc3MoKSxXaW5JbmV0LklOVEVSTkVUX09QRU5fVFlQRV9ESVJFQ1QsMCwwLDApOwotICAgICAgICB3c0FnZW50LmRpc3Bvc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnRQcm94eShpbnQgcG9ydCwgaW50IHN3ZlZlcnNpb24sIGludCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzd2ZCb290bG9hZGVyLCBib29sZWFuIHN3ZlRyYW5zY29kZXIpIHsKLSAgICAgICAgSVdhWGNvZGluZyB3YVhjb2RpbmcgPSBnZXRJV2FYY29kaW5nKCk7Ci0gICAgICAgIHdhWGNvZGluZy5zZXRQb3J0KHBvcnQpOwotICAgICAgICB3YVhjb2Rpbmcuc2V0U1dGVHJhbnNjb2RpbmdNaW5pbXVtVmVyc2lvbihzd2ZWZXJzaW9uKTsKLSAgICAgICAgd2FYY29kaW5nLnNldFRpbWVvdXQodGltZW91dCk7Ci0gICAgICAgIHdhWGNvZGluZy5zZXRFeHRlcm5hbFByb3h5RmxhZyhmYWxzZSk7Ci0gICAgICAgIHdhWGNvZGluZy5zZXRTV0ZCb290bG9hZGVyRmxhZyhzd2ZCb290bG9hZGVyKTsKLSAgICAgICAgd2FYY29kaW5nLnNldFNXRlRyYW5zY29kaW5nRmxhZyhzd2ZUcmFuc2NvZGVyKTsKLSAgICAgICAgU3RyaW5nIGV4dFByb3h5ID0gZ2V0RGVmYXVsdFByb3h5KFBST1RDT0xfSFRUUCk7Ci0gICAgICAgIGlmKCBudWxsICE9IGV4dFByb3h5ICkgewotICAgICAgICAgICAgaW50IHBvcyA9IGV4dFByb3h5LmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmKCAtMSAhPSBwb3MgKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4dEhvc3QgPSBleHRQcm94eS5zdWJzdHJpbmcoMCxwb3MpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydFN0ciA9IGV4dFByb3h5LnN1YnN0cmluZyhwb3MrMSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBleHRQb3J0ID0gSW50ZWdlci5wYXJzZUludChwb3J0U3RyKTsKLSAgICAgICAgICAgICAgICAgICAgd2FYY29kaW5nLnNldEV4dGVybmFsUHJveHlGbGFnKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB3YVhjb2Rpbmcuc2V0RXh0ZXJuYWxQcm94eShleHRIb3N0LGV4dFBvcnQpOwotICAgICAgICAgICAgICAgICAgICBpZiggUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgZXh0ZXJuYWwgcHJveHkgIitleHRIb3N0KyI6IitleHRQb3J0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoKCBFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUHJveHlMb2dIYW5kbGVyLmNvbmZpZ3VyZSgpOyAgICAgIC8vIENvbmZpZ3VyZSBvdXIgbG9nIGhhbmRsZXIKLSAgICAgICAgd2FYY29kaW5nLnN0YXJ0KGluaXRMb2dnZXIpOyAgICAgICAgICAgLy8gU3RhcnQgV2FYY29kaW5nIHdpdGhvdXQgbG9nIGhhbmRsZXIKLSAgICAgICAgaWYoICFpbml0TG9nZ2VyICkgewotICAgICAgICAJUHJveHlMb2dIYW5kbGVyLnJlc2V0TG9nTGV2ZWwoKTsKLSAgICAgICAgfQotICAgICAgICBjdXJyZW50UG9ydCA9IHdhWGNvZGluZy5nZXRQb3J0KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0b3BQcm94eSgpIHsKLSAgICAgICAgaWYoIDAgIT0gY3VycmVudFBvcnQgKSB7Ci0gICAgICAgICAgICBnZXRJV2FYY29kaW5nKCkuc3RvcCgpOwotICAgICAgICAgICAgY3VycmVudFBvcnQgPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEludGVybmV0T3B0aW9ucyhib29sZWFuIGlzR2xvYmFsKSB7Ci0gICAgICAgIGlmKCAwICE9IHNhdmVkQWRkcmVzcyApIHsKLSAgICAgICAgICAgIGlmKCAwID09IGN1cnJlbnRQb3J0ICkgewotICAgICAgICAgICAgICAgIGludm9rZVNldE9wdGlvbihoU2Vzc2lvbixzYXZlZEFkZHJlc3MpOwotICAgICAgICAgICAgICAgIGludm9rZVNldE9wdGlvbigwLHNhdmVkQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgbmVlZFJlc3RvcmUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotLy8gICAgICAgICAgICAgICAgSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OX0xJU1QgbGlzdCA9IG5ldyBJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05fTElTVCgzKTsKLS8vICAgICAgICAgICAgICAgIGxpc3QucGVyQ29ubk9wdGlvbnNbMF0uZHdPcHRpb249SU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLklOVEVSTkVUX1BFUl9DT05OX0ZMQUdTOwotLy8gICAgICAgICAgICAgICAgbGlzdC5wZXJDb25uT3B0aW9uc1swXS5kd1ZhbHVlPUlOVEVSTkVUX1BFUl9DT05OX09QVElPTi5QUk9YWV9UWVBFX1BST1hZIHwgSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLlBST1hZX1RZUEVfRElSRUNUOwotLy8gICAgICAgICAgICAgICAgbGlzdC5wZXJDb25uT3B0aW9uc1sxXS5kd09wdGlvbj1JTlRFUk5FVF9QRVJfQ09OTl9PUFRJT04uSU5URVJORVRfUEVSX0NPTk5fUFJPWFlfU0VSVkVSOwotLy8gICAgICAgICAgICAgICAgbGlzdC5wZXJDb25uT3B0aW9uc1sxXS5zdHJWYWx1ZS5zZXRTdHJpbmcoZ2V0UHJveHlTdHJpbmcoKSk7Ci0vLyAgICAgICAgICAgICAgICBsaXN0LnBlckNvbm5PcHRpb25zWzJdLmR3T3B0aW9uPUlOVEVSTkVUX1BFUl9DT05OX09QVElPTi5JTlRFUk5FVF9QRVJfQ09OTl9QUk9YWV9CWVBBU1M7Ci0vLyAgICAgICAgICAgICAgICBsaXN0LnBlckNvbm5PcHRpb25zWzJdLnN0clZhbHVlLnNldFN0cmluZyhudWxsKTsKLSAgICAgICAgICAgICAgICBJTlRFUk5FVF9QRVJfQ09OTl9PUFRJT05fTElTVCBsaXN0ID0gbmV3IElOVEVSTkVUX1BFUl9DT05OX09QVElPTl9MSVNUKDIpOwotICAgICAgICAgICAgICAgIGxpc3QucGVyQ29ubk9wdGlvbnNbMF0uZHdPcHRpb249SU5URVJORVRfUEVSX0NPTk5fT1BUSU9OLklOVEVSTkVUX1BFUl9DT05OX0ZMQUdTOwotICAgICAgICAgICAgICAgIGxpc3QucGVyQ29ubk9wdGlvbnNbMF0uZHdWYWx1ZT1JTlRFUk5FVF9QRVJfQ09OTl9PUFRJT04uUFJPWFlfVFlQRV9BVVRPX1BST1hZX1VSTCB8IElOVEVSTkVUX1BFUl9DT05OX09QVElPTi5QUk9YWV9UWVBFX0RJUkVDVDsKLSAgICAgICAgICAgICAgICBsaXN0LnBlckNvbm5PcHRpb25zWzFdLmR3T3B0aW9uPUlOVEVSTkVUX1BFUl9DT05OX09QVElPTi5JTlRFUk5FVF9QRVJfQ09OTl9BVVRPQ09ORklHX1VSTDsKLSAgICAgICAgICAgICAgICBsaXN0LnBlckNvbm5PcHRpb25zWzFdLnN0clZhbHVlLnNldFN0cmluZyhnZXRBdXRvQ29uZmlnVVJMKGlzR2xvYmFsfHxmb3JjZVByb3h5KSk7Ci0gICAgICAgICAgICAgICAgaW50IGFkZHJlc3MgPSBPUy5HbG9iYWxBbGxvYyhPUy5HTUVNX0ZJWEVEIHwgT1MuR01FTV9aRVJPSU5JVCwgSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OX0xJU1Quc2l6ZW9mKTsKLSAgICAgICAgICAgICAgICBsaXN0LmdldERhdGEoYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgaW52b2tlU2V0T3B0aW9uKGhTZXNzaW9uLCBhZGRyZXNzKTsKLSAgICAgICAgICAgICAgICBpbnZva2VTZXRPcHRpb24oMCwgaXNHbG9iYWwgPyBhZGRyZXNzIDogc2F2ZWRBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICBuZWVkUmVzdG9yZSA9IGlzR2xvYmFsOwotICAgICAgICAgICAgICAgIE9TLkdsb2JhbEZyZWUoYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgbGlzdC5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgUHJveHlMb2dIYW5kbGVyLnJlbW92ZUhhbmRsZXIoKTsKLSAgICAgICAgc3RvcFByb3h5KCk7Ci0gICAgICAgIGlmKCAwICE9IGhTZXNzaW9uICkgewotICAgICAgICAgICAgV2luSW5ldC5JbnRlcm5ldENsb3NlSGFuZGxlKGhTZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiggMCAhPSBzYXZlZEFkZHJlc3MgKSB7Ci0gICAgICAgICAgICBpZiggbmVlZFJlc3RvcmUgKSB7Ci0gICAgICAgICAgICAgICAgV2luSW5ldC5JbnRlcm5ldFNldE9wdGlvblcoMCxXaW5JbmV0LklOVEVSTkVUX09QVElPTl9QRVJfQ09OTkVDVElPTl9PUFRJT04sc2F2ZWRBZGRyZXNzLElOVEVSTkVUX1BFUl9DT05OX09QVElPTl9MSVNULnNpemVvZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPUy5HbG9iYWxGcmVlKHNhdmVkQWRkcmVzcyk7Ci0gICAgICAgICAgICBzYXZlZExpc3QuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGludm9rZVNldE9wdGlvbihpbnQgaGFuZGxlLCBpbnQgYWRkcmVzcykgewotICAgICAgICBXaW5JbmV0LkludGVybmV0U2V0T3B0aW9uVyhoYW5kbGUsV2luSW5ldC5JTlRFUk5FVF9PUFRJT05fUEVSX0NPTk5FQ1RJT05fT1BUSU9OLGFkZHJlc3MsSU5URVJORVRfUEVSX0NPTk5fT1BUSU9OX0xJU1Quc2l6ZW9mKTsKLSAgICAgICAgV2luSW5ldC5JbnRlcm5ldFNldE9wdGlvblcoaGFuZGxlLFdpbkluZXQuSU5URVJORVRfT1BUSU9OX1NFVFRJTkdTX0NIQU5HRUQsMCwwKTsKLSAgICAgICAgV2luSW5ldC5JbnRlcm5ldFNldE9wdGlvblcoaGFuZGxlLFdpbkluZXQuSU5URVJORVRfT1BUSU9OX1JFRlJFU0gsMCwwKTsKLSAgICB9Ci0gICAgCi0vLyAgICBwcml2YXRlIFN0cmluZyBnZXRQcm94eVN0cmluZygpIHsKLS8vICAgICAgICBTdHJpbmcgcmVzdWx0ID0gUFJPVENPTF9IVFRQKyI9bG9jYWxob3N0OiIrY3VycmVudFBvcnQ7IC8vJE5PTi1OTFMtMSQKLS8vICAgICAgICBmb3IoIGludCBpPTA7IGk8UFJPVENPTF9FWFRSQS5sZW5ndGg7IGkrKyApIHsKLS8vICAgICAgICAgICAgU3RyaW5nIHMgPSBnZXREZWZhdWx0UHJveHkoUFJPVENPTF9FWFRSQVtpXSk7Ci0vLyAgICAgICAgICAgIGlmKCBudWxsIT1zICYmIHMubGVuZ3RoKCk+MCApIHsKLS8vICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiOyIrUFJPVENPTF9FWFRSQVtpXSsiPSIrczsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgICAgcmV0dXJuIHJlc3VsdDsKLS8vICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0UHJveHkoU3RyaW5nIHByb3RvY29sKSB7Ci0gICAgICAgIGlmKCAwICE9IChzYXZlZExpc3QucGVyQ29ubk9wdGlvbnNbMF0uZHdWYWx1ZSAmIElOVEVSTkVUX1BFUl9DT05OX09QVElPTi5QUk9YWV9UWVBFX1BST1hZKSApIHsKLSAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0UHJveHkgPSBzYXZlZExpc3QucGVyQ29ubk9wdGlvbnNbMV0uc3RyVmFsdWUuZ2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiggbnVsbCAhPSBkZWZhdWx0UHJveHkgKSB7Ci0gICAgICAgICAgICAgICAgaWYoIC0xID09IGRlZmF1bHRQcm94eS5pbmRleE9mKCc9JykgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0UHJveHk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IFBhdHRlcm4uY29tcGlsZShwcm90b2NvbCsiPSguKykiKS5tYXRjaGVyKGRlZmF1bHRQcm94eSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBpZiggbS5maW5kKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gbS5ncm91cCgxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIG51bGwgIT0gcyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXAgPSBzLmluZGV4T2YoJzsnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMT09c2VwID8gcyA6IHMuc3Vic3RyaW5nKDAsc2VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJV2FYY29kaW5nIGdldElXYVhjb2RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBXYVhjb2RpbmdGYWN0b3J5LmdldFdhWGNvZGluZygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRBdXRvQ29uZmlnVVJMKGJvb2xlYW4gZGlzYWJsZUF1dG9Qcm94eSkgewotCQlTdHJpbmcgcGFjID0gcmVhZFBsdWdpbkZpbGUoInRlbXBsYXRlcy9wcm94eS5wYWMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiggbnVsbCAhPSBwYWMgKSB7Ci0gICAgICAgIAlTdHJpbmcgaHR0cFByb3h5ID0gZ2V0UHJveHlTdHJpbmcoImxvY2FsaG9zdDoiK2N1cnJlbnRQb3J0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAJcGFjID0gcGFjLnJlcGxhY2VBbGwoIlxcJE5PUFJPWFlfRVhUU1xcJCIsICBkaXNhYmxlQXV0b1Byb3h5ID8gIiIgOiBub1Byb3h5KSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgICAgICAJIC5yZXBsYWNlQWxsKCJcXCRIVFRQX1BST1hZXFwkIiwgICAgaHR0cFByb3h5KSAvLyROT04tTkxTLTEkCi0JCSAgICAgICAgCSAucmVwbGFjZUFsbCgiXFwkSFRUUF9ESVJFQ1RcXCQiLCAgIGdldFByb3h5U3RyaW5nKGdldERlZmF1bHRQcm94eShQUk9UQ09MX0hUVFApKSkgLy8kTk9OLU5MUy0xJAotCQkgICAgICAgIAkgLnJlcGxhY2VBbGwoIlxcJEhUVFBTX0RJUkVDVFxcJCIsICBnZXRQcm94eVN0cmluZyhnZXREZWZhdWx0UHJveHkoUFJPVENPTF9IVFRQUykpKSAvLyROT04tTkxTLTEkCi0JCSAgICAgICAgCSAucmVwbGFjZUFsbCgiXFwkRlRQX0RJUkVDVFxcJCIsICAgIGdldFByb3h5U3RyaW5nKGdldERlZmF1bHRQcm94eShQUk9UQ09MX0ZUUCkpKSAvLyROT04tTkxTLTEkCi0JCSAgICAgICAgCSAucmVwbGFjZUFsbCgiXFwkR09QSEVSX0RJUkVDVFxcJCIsIGdldFByb3h5U3RyaW5nKGdldERlZmF1bHRQcm94eShQUk9UQ09MX0dPUEhFUikpKTsgLy8kTk9OLU5MUy0xJAotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocGFjKTsKLSAgICAgICAgCU91dHB1dFN0cmVhbSBvcyA9IG51bGw7Ci0gICAgICAgIAl0cnkgewotICAgICAgICAgICAgICAgIElQYXRoIHBhY1BhdGggPSBQcm94eVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgicHJveHkucGFjIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhY1BhdGgudG9GaWxlKCkpOwotICAgIAkJCU91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG9zLCAidXRmLTgiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJCXdyaXRlci53cml0ZShwYWMpOwotICAgIAkJCXdyaXRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiAiZmlsZTovLyIrcGFjUGF0aC50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAl9Ci0gICAgICAgIAljYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgCX0KLSAgICAgICAgCWZpbmFsbHkgewotICAgICAgICAJCWlmKCBudWxsICE9IG9zICkgewotICAgIAkJCQl0cnkgewotICAgIAkJCQkJb3MuY2xvc2UoKTsKLSAgICAJCQkJfSAKLSAgICAJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAJCQkJfQotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb3h5U3RyaW5nKFN0cmluZyBkZWZhdWx0UHJveHkpIHsKLSAgICAJcmV0dXJuIG51bGwgIT0gZGVmYXVsdFByb3h5ID8gTWVzc2FnZUZvcm1hdC5mb3JtYXQoIlBST1hZIHswfTsgRElSRUNUIiwgbmV3IE9iamVjdFtde2RlZmF1bHRQcm94eX0pIDogIkRJUkVDVCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFBsdWdpbkZpbGUoU3RyaW5nIHBhdGgpIHsKLSAgICAJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgIAl0cnkgewotICAgICAgICAJVVJMIHVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoUHJveHlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KHBhdGgpKTsKLQkJCWlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOwotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJY2hhcltdIGJ1ZmYgPSBuZXcgY2hhcls0MDk2XTsKLQkJCWludCByZXN1bHQ7Ci0JCQl3aGlsZSggLTEgIT0gKHJlc3VsdD1yZWFkZXIucmVhZChidWZmKSkgKSB7Ci0JCQkJc2IuYXBwZW5kKGJ1ZmYsIDAsIHJlc3VsdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAJfQotICAgIAljYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0gICAgCQllLnByaW50U3RhY2tUcmFjZSgpOwotICAgIAl9Ci0gICAgCWZpbmFsbHkgewotICAgIAkJaWYoIG51bGwgIT0gaXMgKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9IAotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotICAgIAkJfQotICAgIAl9Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9Qcm94eVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L1Byb3h5UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNDQwNDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L1Byb3h5UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eS5wcmVmZXJlbmNlcy5Qcm94eVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgUHJveHlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIGltcGxlbWVudHMKLQkJSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBQcm94eVBsdWdpbiBwbHVnaW47Ci0KLQkvLyBQcm94eSBtYW5hZ2VyCi0JcHJpdmF0ZSBzdGF0aWMgUHJveHlNYW5hZ2VyIHByb3h5TWFuYWdlciA9IG5ldyBQcm94eU1hbmFnZXIoKTsKLQotCS8vIFByZWZlcmVuY2VzIGNoYW5nZSBsaXN0ZW5lcnMKLQlwcml2YXRlIExpc3Q8SVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyczsKLQotCS8vIEltYWdlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNQUdFX0NMRUFSID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9hY3Rpb24xNi9jbGVhci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBQcm94eVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QX1BST1hZX1RZUEUuZXF1YWxzKGV2ZW50Ci0JCQkJCQkuZ2V0UHJvcGVydHkoKSkKLQkJCQkJCXx8IFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QX1BST1hZX1NXRl9NRVRIT0QKLQkJCQkJCQkJLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKQotCQkJCQkJfHwgUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBfU1dGX01JTklNVU1fVkVSU0lPTgotCQkJCQkJCQkuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpCi0JCQkJCQl8fCBQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9USU1FT1VULmVxdWFscyhldmVudAotCQkJCQkJCQkuZ2V0UHJvcGVydHkoKSkKLQkJCQkJCXx8IFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9QT1JULmVxdWFscyhldmVudAotCQkJCQkJCQkuZ2V0UHJvcGVydHkoKSkpIHsKLQkJCQkJc2V0UHJveHlTZXR0aW5ncygpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNldFByb3h5U2V0dGluZ3MoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJveHlTZXR0aW5ncygpIHsKLQkJcHJveHlNYW5hZ2VyLnN0b3BQcm94eSgpOwotCQlTdHJpbmcgcHJveHlUeXBlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QX1BST1hZX1RZUEUpOwotCQlpbnQgc3dmVmVyc2lvbiA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEludCgKLQkJCQlQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9TV0ZfTUlOSU1VTV9WRVJTSU9OKTsKLQkJaW50IHRpbWVvdXQgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRJbnQoCi0JCQkJUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBfVElNRU9VVCk7Ci0JCWludCBwb3J0ID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0SW50KAotCQkJCVByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9QT1JUKTsKLQkJaWYgKCFQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfTk9ORS5lcXVhbHMocHJveHlUeXBlKSkgewotCQkJU3RyaW5nIHByb3h5U3dmTWV0aG9kID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCQlQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9QUk9YWV9TV0ZfTUVUSE9EKTsKLQkJCWJvb2xlYW4gc3dmQm9vdExvYWRlciA9IGZhbHNlOwotCQkJYm9vbGVhbiBzd2ZUcmFuc2NvZGVyID0gZmFsc2U7Ci0JCQlpZiAoUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1NXRl9NRVRIT0RfQk9PVExPQURFUgotCQkJCQkuZXF1YWxzKHByb3h5U3dmTWV0aG9kKSkgewotCQkJCXN3ZkJvb3RMb2FkZXIgPSB0cnVlOwotCQkJfSBlbHNlIGlmIChQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfU1dGX01FVEhPRF9UUkFOU0NPREVSCi0JCQkJCS5lcXVhbHMocHJveHlTd2ZNZXRob2QpKSB7Ci0JCQkJc3dmVHJhbnNjb2RlciA9IHRydWU7Ci0JCQl9Ci0JCQlwcm94eU1hbmFnZXIuc3RhcnRQcm94eShwb3J0LCBzd2ZWZXJzaW9uLCB0aW1lb3V0ICogMTAwMCwKLQkJCQkJc3dmQm9vdExvYWRlciwgc3dmVHJhbnNjb2Rlcik7Ci0KLQkJfQotCQlwcm94eU1hbmFnZXIuc2V0SW50ZXJuZXRPcHRpb25zKFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9HTE9CQUwKLQkJCQkuZXF1YWxzKHByb3h5VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXByb3h5TWFuYWdlci5kaXNwb3NlKCk7Ci0JCWxpc3RlbmVycyA9IG51bGw7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJveHlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbiBwbHVnLWluCi0JICogcmVsYXRpdmUgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCi0JCQkJIm9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkiLCBwYXRoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLQkJCSgoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVycy5nZXQoaSkpLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKG51bGwgPT0gbGlzdGVuZXJzKSB7Ci0JCQlsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPigpOwotCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L1Byb3h5U3RhcnR1cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L1Byb3h5U3RhcnR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjM1NTM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9Qcm94eVN0YXJ0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5U3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKLQotICAgIHB1YmxpYyB2b2lkIGVhcmx5U3RhcnR1cCgpIHsKLSAgICAgICAgUHJveHlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L2xvZ3MvUHJveHlMb2dIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvbG9ncy9Qcm94eUxvZ0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkOGQ2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvbG9ncy9Qcm94eUxvZ0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eS5sb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlcjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXI7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHkuUHJveHlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eS51aS52aWV3cy5Qcm94eUxvZ1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLQotcHVibGljIGNsYXNzIFByb3h5TG9nSGFuZGxlciBleHRlbmRzIENvbnNvbGVIYW5kbGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3QgbG9nUmVjb3JkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbWF4UmVjb3JkQ291bnQgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIEhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLmdldExvZ2dlcigiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIERpc3BsYXkgZGlzcGxheSA9IFByb3h5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTGV2ZWwgbG9nTGV2ZWwgPSBMZXZlbC5JTkZPOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZSgpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIFJlbW92ZSBjdXJyZW50IGNvbnNvbGUgaGFuZGxlciAKLSAgICAgICAgSGFuZGxlcltdIGhhbmRsZXJzID0gbG9nZ2VyLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgIGZvciggaW50IGk9MDsgaTxoYW5kbGVycy5sZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgIGlmKCBoYW5kbGVyc1tpXSBpbnN0YW5jZW9mIENvbnNvbGVIYW5kbGVyICkgewotICAgICAgICAgICAgICAgIGxvZ2dlci5yZW1vdmVIYW5kbGVyKGhhbmRsZXJzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQWRkIHRoaXMgY2xhc3MKLSAgICAgICAgaWYoIG51bGwgPT0gaGFuZGxlciApIHsKLSAgICAgICAgICAgIGhhbmRsZXIgPSBuZXcgUHJveHlMb2dIYW5kbGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcik7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGp1c3QgbG9nZ2luZyBsZXZlbAotICAgICAgICBzZXRMb2dMZXZlbChsb2dMZXZlbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVIYW5kbGVyKCkgewotICAgICAgICBpZiggbnVsbCAhPSBoYW5kbGVyICkgewotICAgICAgICAgICAgTG9nZ2VyIGxvZ2dlciA9IExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLmdldExvZ2dlcigiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGxvZ2dlci5yZW1vdmVIYW5kbGVyKGhhbmRsZXIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSGFuZGxlciBnZXRIYW5kbGVyKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHVibGlzaChMb2dSZWNvcmQgcmVjb3JkKSB7Ci0vLyAgICAgICAgc3VwZXIucHVibGlzaChyZWNvcmQpOwotICAgICAgICBpZiAoIWlzTG9nZ2FibGUocmVjb3JkKSB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBMb2dSZWNvcmQgdG8gdGhlIGxpc3QKLSAgICAgICAgd2hpbGUoIGxvZ1JlY29yZExpc3Quc2l6ZSgpID49IG1heFJlY29yZENvdW50ICkgewotICAgICAgICAgICAgbG9nUmVjb3JkTGlzdC5yZW1vdmUoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nUmVjb3JkTGlzdC5hZGQobmV3IFByb3h5TG9nUmVjb3JkKHJlY29yZCkpOwotICAgICAgICAKLSAgICAgICAgLy8gUmVmcmVzaCBsb2cgdmlldwotICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKXsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgaWYoIG51bGwgPT0gd2luZG93ICkgcmV0dXJuOwotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgICAgICAgIGlmKCBudWxsICE9IHBhZ2UgKSB7Ci0gICAgICAgICAgICAgICAgICAgIElWaWV3UGFydCBwYXJ0ID0gcGFnZS5maW5kVmlldyhQcm94eUxvZ1ZpZXcuSUQpOwotICAgICAgICAgICAgICAgICAgICBpZiggcGFydCBpbnN0YW5jZW9mIFByb3h5TG9nVmlldyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoUHJveHlMb2dWaWV3KXBhcnQpLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRMb2dzKCkgewotICAgICAgICByZXR1cm4gbG9nUmVjb3JkTGlzdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBsb2dSZWNvcmRMaXN0LmNsZWFyKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMb2dMZXZlbChMZXZlbCBuZXdMZXZlbCkgewotICAgICAgICBsb2dMZXZlbCA9IG5ld0xldmVsOwotICAgICAgICBpZiggbnVsbCAhPSBoYW5kbGVyICkgewotICAgICAgICAgICAgaGFuZGxlci5zZXRMZXZlbChsb2dMZXZlbCk7Ci0gICAgICAgICAgICBsb2dnZXIuc2V0TGV2ZWwobG9nTGV2ZWwpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldExvZ0xldmVsKCkgewotICAgIAlzZXRMb2dMZXZlbChsb2dMZXZlbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNYXhMb2dDb3VudChpbnQgbWF4Q291bnQpIHsKLSAgICAgICAgbWF4UmVjb3JkQ291bnQgPSBtYXhDb3VudDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4TG9nQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBtYXhSZWNvcmRDb3VudDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvbG9ncy9Qcm94eUxvZ1JlY29yZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L2xvZ3MvUHJveHlMb2dSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViYWU3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvbG9ncy9Qcm94eUxvZ1JlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHkubG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotCi0KLXB1YmxpYyBjbGFzcyBQcm94eUxvZ1JlY29yZCB7Ci0KLSAgICBwcml2YXRlIGxvbmcgbWlsbGlzOwotICAgIHByaXZhdGUgTGV2ZWwgbGV2ZWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBsb2dnZXJOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiLShcXGQrKToiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxcW2lkOihcXGQrKVxcXSAoLiopIik7Ci0gICAgCi0gICAgcHVibGljIFByb3h5TG9nUmVjb3JkKExvZ1JlY29yZCByZWNvcmQpIHsKLSAgICAgICAgbWlsbGlzID0gcmVjb3JkLmdldE1pbGxpcygpOwotICAgICAgICBsZXZlbCA9IHJlY29yZC5nZXRMZXZlbCgpOwotICAgICAgICBsb2dnZXJOYW1lID0gcmVjb3JkLmdldExvZ2dlck5hbWUoKTsKLSAgICAgICAgbWVzc2FnZSA9IHJlY29yZC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlkID0gIiI7Ci0gICAgICAgIGlmKCBudWxsICE9IG1lc3NhZ2UgKSB7Ci0gICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobWVzc2FnZSk7Ci0gICAgICAgICAgICBpZiggbWF0Y2hlci5maW5kKCkgKSB7Ci0gICAgICAgICAgICAgICAgaWQ9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgLy8gbWVzc2FnZSA9IG1hdGNoZXIucmVwbGFjZUZpcnN0KCI6Iik7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZT1tYXRjaGVyLmdyb3VwKDIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIG1lc3NhZ2UubGVuZ3RoKCk+MjU2ICkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnN1YnN0cmluZygwLDI1NikrIi4uLiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRNaWxsaXMoKSB7Ci0gICAgICAgIHJldHVybiBtaWxsaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMZXZlbCBnZXRMZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIGxldmVsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldElEKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9nZ2VyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGxvZ2dlck5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L3ByZWZlcmVuY2VzL1Byb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L3ByZWZlcmVuY2VzL1Byb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTNiMmVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9wcmVmZXJlbmNlcy9Qcm94eVByZWZlcmVuY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHkucHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eVByZWZlcmVuY2VDb25zdGFudHMgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9QUk9YWV9UWVBFID0gIlByb3h5VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX05PTkUgPSAiUFJPWFlfTk9ORSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9TRVNTSU9OID0gIlBST1hZX1NFU1NJT04iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfR0xPQkFMID0gIlBST1hZX0dMT0JBTCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9QT1JUID0gIlBST1hZX1BPUlQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1BST1hZX1NXRl9NRVRIT0QgPSAiUHJveHlTV0ZNZXRob2QiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfU1dGX01FVEhPRF9OT05FID0gIlBST1hZX1NXRl9NRVRIT0RfTk9ORSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9TV0ZfTUVUSE9EX0JPT1RMT0FERVIgPSAiUFJPWFlfU1dGX01FVEhPRF9CT09UTE9BREVSIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1NXRl9NRVRIT0RfVFJBTlNDT0RFUiA9ICJQUk9YWV9TV0ZfTUVUSE9EX1RSQU5TQ09ERVIiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9TV0ZfTUlOSU1VTV9WRVJTSU9OID0gIlNXRk1pbmltdW1WZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfVElNRU9VVCA9ICJUaW1lb3V0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9DQUNIRV9DTEVBUiA9ICJDYWNoZUNsZWFyTW9kZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0NMRUFSX1dIRU5fU1RBUlRVUCA9ICJDQUNIRV9DTEVBUl9XSEVOX1NUQVJUVVAiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSVJNX1dIRU5fU1RBUlRVUCA9ICJDT05GSVJNX1dIRU5fU1RBUlRVUCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19DQUNIRV9DTEVBUiA9ICJOT19DQUNIRV9DTEVBUiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSVJNX0FORF9DQUNIRV9DTEVBUiA9ICJDT05GSVJNX0FORF9DQUNIRV9DTEVBUiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJUk1fQU5EX05PX09QRVJBVElPTiA9ICJDT05GSVJNX0FORF9OT19PUEVSQVRJT04iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9DTEVBUl9XSEVOX1NUQVJUVVBfQU5EX0NBQ0hFX0NMRUFSID0gIkNBQ0hFX0NMRUFSX1dIRU5fU1RBUlRVUF9BTkRfQ0FDSEVfQ0xFQVIiOwotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L3ByZWZlcmVuY2VzL1Byb3h5UHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvcHJlZmVyZW5jZXMvUHJveHlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4YWMyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvcHJlZmVyZW5jZXMvUHJveHlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LlByb3h5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5UHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLSAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFByb3h5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9QUk9YWV9UWVBFLFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9TRVNTSU9OKTsKLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9QUk9YWV9TV0ZfTUVUSE9ELFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9TV0ZfTUVUSE9EX0JPT1RMT0FERVIpOwotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QX1NXRl9NSU5JTVVNX1ZFUlNJT04sNSk7Ci0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBfVElNRU9VVCwzMCk7Ci0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1BPUlQsIDApOyAvL2F1dG9tYXRpYwotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QX0NBQ0hFX0NMRUFSLCBQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ09ORklSTV9XSEVOX1NUQVJUVVApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L3ByZWZlcmVuY2VzL1Byb3h5UHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9wcmVmZXJlbmNlcy9Qcm94eVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhN2RkY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L3ByZWZlcmVuY2VzL1Byb3h5UHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eS5Qcm94eVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSW50ZWdlckZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUmFkaW9Hcm91cEZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotcHVibGljIGNsYXNzIFByb3h5UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotICAgIHByaXZhdGUgTGlzdDxHcm91cD4gZ3JvdXBzID0gbmV3IEFycmF5TGlzdDxHcm91cD4oKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlRmllbGRHcm91cChTdHJpbmcgbmFtZSkgewotICAgICAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChnZXRGaWVsZEVkaXRvclBhcmVudCgpLFNXVC5OT05FKTsKLSAgICAgICAgaWYoIG51bGwgIT0gbmFtZSApIHsKLSAgICAgICAgICAgIGdyb3VwLnNldFRleHQobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBncm91cHMuYWRkKGdyb3VwKTsKLSAgICAgICAgcmV0dXJuIGdyb3VwOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGp1c3RHcmlkTGF5b3V0KCkgewotICAgICAgICBzdXBlci5hZGp1c3RHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGludCBudW1Db2x1bW5zID0gKChHcmlkTGF5b3V0KWdldEZpZWxkRWRpdG9yUGFyZW50KCkuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnM7Ci0gICAgICAgIGZvciggaW50IGk9MDsgaTwgZ3JvdXBzLnNpemUoKTsgaSsrICkgewotICAgICAgICAgICAgR3JvdXAgZ3JvdXAgPSAoR3JvdXApZ3JvdXBzLmdldChpKTsKLSAgICAgICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpZ3JvdXAuZ2V0TGF5b3V0KCk7Ci0gICAgICAgICAgICBHcmlkRGF0YSBkYXRhID0gKEdyaWREYXRhKWdyb3VwLmdldExheW91dERhdGEoKTsgCi0gICAgICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSA1OwotICAgICAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0gICAgICAgICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gbnVtQ29sdW1uczsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUHJveHlQcmVmZXJlbmNlUGFnZSgpIHsKLSAgICAgICAgc3VwZXIoR1JJRCk7Ci0vLyAgICAgICAgc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5wcmVmX2Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldFByZWZlcmVuY2VTdG9yZShQcm94eVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0gICAgICAgIEdyb3VwIGh0dHBQcm94eUdyb3VwID0gY3JlYXRlRmllbGRHcm91cChNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LnByZWZfZGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkRmllbGQobmV3IFJhZGlvR3JvdXBGaWVsZEVkaXRvcihQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9QUk9YWV9UWVBFLAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldFN0cmluZygicHJveHkudHlwZSIpLDEsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW11bXXsKLSAgICAgICAgICAgICAgICAgICAge01lc3NhZ2VzLmdldFN0cmluZygicHJveHkubm9uZSIpLFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9OT05FfSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB7TWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5zZXNzaW9uIiksUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1NFU1NJT059LCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHtNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5Lmdsb2JhbCIpLFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QUk9YWV9HTE9CQUx9IH0sIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBodHRwUHJveHlHcm91cCkpOwotCi0gICAgICAgIGlmKCBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpICkgewotICAgICAgICAgICAgYWRkRmllbGQobmV3IFJhZGlvR3JvdXBGaWVsZEVkaXRvcihQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9QUk9YWV9TV0ZfTUVUSE9ELAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LnN3Zm1ldGhvZCIpLDEsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdW117Ci0gICAgICAgICAgICAgICAgICAgICAgICB7TWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5zd2ZtZXRob2Qubm9uZSIpLCBQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUFJPWFlfU1dGX01FVEhPRF9OT05FfSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAge01lc3NhZ2VzLmdldFN0cmluZygicHJveHkuc3dmbWV0aG9kLmJvb3Rsb2FkZXIiKSwgUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1NXRl9NRVRIT0RfQk9PVExPQURFUn0vKiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAge01lc3NhZ2VzLmdldFN0cmluZygicHJveHkuc3dmbWV0aG9kLnRyYW5zY29kZXIiKSwgUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1NXRl9NRVRIT0RfVFJBTlNDT0RFUn0qLyB9LCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGh0dHBQcm94eUdyb3VwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlZ2VyRmllbGRFZGl0b3IgcG9ydCA9IG5ldyBJbnRlZ2VyRmllbGRFZGl0b3IoUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1hZX1BPUlQsIE1lc3NhZ2VzLmdldFN0cmluZygicHJveHkucG9ydCIpLCBodHRwUHJveHlHcm91cCk7Ci0gICAgICAgIHBvcnQuc2V0VmFsaWRSYW5nZSgwLCA2NTUzNSk7Ci0gICAgICAgIGFkZEZpZWxkKHBvcnQpOwotICAgICAgICAKLSAgICAgICAgSW50ZWdlckZpZWxkRWRpdG9yIHRpbWVvdXQgPSBuZXcgSW50ZWdlckZpZWxkRWRpdG9yKFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5QX1RJTUVPVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LnRpbWVvdXQiKSxodHRwUHJveHlHcm91cCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGltZW91dC5zZXRWYWxpZFJhbmdlKDAsOTkpOwotICAgICAgICBhZGRGaWVsZCh0aW1lb3V0KTsKLQotICAgICAgICBJbnRlZ2VyRmllbGRFZGl0b3IgdmVyc2lvbiA9IG5ldyBJbnRlZ2VyRmllbGRFZGl0b3IoUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLlBfU1dGX01JTklNVU1fVkVSU0lPTiwKLSAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LnN3Zl92ZXJzaW9uIiksaHR0cFByb3h5R3JvdXApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHZlcnNpb24uc2V0VmFsaWRSYW5nZSgzLDk5KTsKLSAgICAgICAgYWRkRmllbGQodmVyc2lvbik7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgYWRkRmllbGQobmV3IFJhZGlvR3JvdXBGaWVsZEVkaXRvcihQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9DQUNIRV9DTEVBUiwKLSAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LmNhY2hlX2NsZWFyIiksMSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXVtdewotICAgICAgICAgICAgICAgICAgICB7TWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5jYWNoZV9jbGVhcl93aGVuX3N0YXJ0dXAiKSwgUHJveHlQcmVmZXJlbmNlQ29uc3RhbnRzLkNBQ0hFX0NMRUFSX1dIRU5fU1RBUlRVUH0sIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAge01lc3NhZ2VzLmdldFN0cmluZygicHJveHkuY29uZmlybV9jYWNoZV9jbGVhciIpLCBQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ09ORklSTV9XSEVOX1NUQVJUVVB9LCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHtNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5Lm5vX2NhY2hlX2NsZWFyIiksIFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5OT19DQUNIRV9DTEVBUn0gfSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGdldEZpZWxkRWRpdG9yUGFyZW50KCksdHJ1ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS91aS9DYWNoZUNsZWFyRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvdWkvQ2FjaGVDbGVhckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjVmY2ZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS91aS9DYWNoZUNsZWFyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHkudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5Lk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHkuUHJveHlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eS5wcmVmZXJlbmNlcy5Qcm94eVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0KLQotcHVibGljIGNsYXNzIENhY2hlQ2xlYXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RhdHVzOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGFwcE5hbWU7Ci0KLSAgICBwdWJsaWMgQ2FjaGVDbGVhckRpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIGFwcE5hbWUpIHsKLSAgICAgICAgc3VwZXIoc2hlbGwpOwotICAgICAgICB0aGlzLmFwcE5hbWUgPSBhcHBOYW1lOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAKLSAgICAgICAgcGFyZW50LmdldFNoZWxsKCkuc2V0VGV4dChNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LmRpYWxvZy50ZXh0IikpOwotICAgICAgICAKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9FTkQpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMjA7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAyMDsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHNldHRpbmdzID0gUHJveHlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICBQcm94eVByZWZlcmVuY2VDb25zdGFudHMuUF9DQUNIRV9DTEVBUik7Ci0gICAgICAgIAotICAgICAgICBMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBsYWJlbDEuc2V0VGV4dCgiICAgICIrYXBwTmFtZSsiICIrTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5jYWNoZV9jb25maXJtYXRpb24xIikpOwotCi0gICAgICAgIEZvbnQgZiA9IGxhYmVsMS5nZXRGb250KCk7Ci0gICAgICAgIEZvbnQgZjliID0gbmV3IEZvbnQoZi5nZXREZXZpY2UoKSwgZi5nZXRGb250RGF0YSgpWzBdLmdldE5hbWUoKSwgOSwgU1dULkJPTEQpOwotICAgICAgICBGb250IGY5ID0gbmV3IEZvbnQoZi5nZXREZXZpY2UoKSwgZi5nZXRGb250RGF0YSgpWzBdLmdldE5hbWUoKSwgOSwgU1dULk5PUk1BTCk7Ci0gICAgICAgIGxhYmVsMS5zZXRGb250KGY5Yik7Ci0gICAgICAgIAotICAgICAgICBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIAotICAgICAgICBzdGF0dXMgPSBQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfQ0xFQVJfV0hFTl9TVEFSVFVQX0FORF9DQUNIRV9DTEVBUjsKLQotICAgICAgICBjcmVhdGVSYWRpb0J1dHRvbihQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ0FDSEVfQ0xFQVJfV0hFTl9TVEFSVFVQX0FORF9DQUNIRV9DTEVBUiwgLy8KLSAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LmNhY2hlX2NsZWFyX3doZW5fc3RhcnR1cF9hbmRfY2FjaGVfY2xlYXIiKSwgY29tcG9zaXRlLCB0cnVlKS5zZXRGb250KGY5Yik7Ci0gICAgICAgIGNyZWF0ZVJhZGlvQnV0dG9uKFByb3h5UHJlZmVyZW5jZUNvbnN0YW50cy5DT05GSVJNX0FORF9DQUNIRV9DTEVBUiwgLy8KLSAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LmNvbmZpcm1fYW5kX2NhY2hlX2NsZWFyIiksIGNvbXBvc2l0ZSwgZmFsc2UpLnNldEZvbnQoZjkpOwotICAgICAgICBjcmVhdGVSYWRpb0J1dHRvbihQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ09ORklSTV9BTkRfTk9fT1BFUkFUSU9OLCAvLwotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldFN0cmluZygicHJveHkuY29uZmlybV9hbmRfbm9fb3BlcmF0aW9uIiksIGNvbXBvc2l0ZSwgZmFsc2UpLnNldEZvbnQoZjkpOwotCi0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oZmluYWwgU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCwgQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBmbGFnKSB7Ci0gICAgICAgIEJ1dHRvbiByYWRpbyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgICAgICByYWRpby5zZXRUZXh0KHRleHQpOwotICAgICAgICByYWRpby5zZXRTZWxlY3Rpb24oZmxhZyk7Ci0KLSAgICAgICAgcmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBpZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGlkOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHJhZGlvOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotICAgICAgICBpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVNoZWxsQ2xvc2VFdmVudCgpIHsKLSAgICAgICAgdGhpcy5zdGF0dXMgPSBQcm94eVByZWZlcmVuY2VDb25zdGFudHMuQ09ORklSTV9BTkRfTk9fT1BFUkFUSU9OOwotICAgICAgICBzdXBlci5oYW5kbGVTaGVsbENsb3NlRXZlbnQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvdWkvYWN0aW9ucy9EZWxldGVDYWNoZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L3VpL2FjdGlvbnMvRGVsZXRlQ2FjaGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ1ZTM5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvdWkvYWN0aW9ucy9EZWxldGVDYWNoZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eS51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5GbGFzaENhY2hlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5LmludGVybmFsLldTVFI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5pbnRlcm5hbC5XaW5JbmV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51aS51dGlsLlByb2dyZXNzQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBEZWxldGVDYWNoZUFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAzMiAqIDEwMjQ7Ly8gNDA5NjsKLQotICAgIHByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVWRVJfREVMRVRFID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJOT19ERUxFVEUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBib29sZWFuIGJhY2tncm91bmQgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBEZWxldGVDYWNoZUFjdGlvbigpIHsKLSAgICAgICAgdGhpcyhmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIERlbGV0ZUNhY2hlQWN0aW9uKGJvb2xlYW4gYmFja2dyb3VuZCkgewotICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLSAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9ncmVzc0NvbnRyaWJ1dGlvbiBwYzsKLQotICAgIHByaXZhdGUgSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZsYXNoQ2FjaGVVdGlsLmNhY2hlQ2hlY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nOwotCi0gICAgICAgICAgICBpZiAoYmFja2dyb3VuZCkgewotICAgICAgICAgICAgICAgIGluaXRQcm9ncmVzcygpOwotICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVDYWNoZUVudHJpZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZFByb2dyZXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KS5zdGFydCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAod2luZG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyh3aW5kb3cuZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5ydW4odHJ1ZSwgdHJ1ZSwgbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG90YWwgPSBjb3VudENhY2hlRW50cmllcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmdldFN0cmluZygicHJveHkuZGVsZXRpbmdfY2FjaGUiKSwgdG90YWwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ2FjaGVFbnRyaWVzKG1vbml0b3IsIHRvdGFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlQ2FjaGVFbnRyaWVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmVzcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldFByb2dyZXNzQ29udHJpYnV0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYyAhPSBudWxsICYmIG1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGMuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBjLnNldFRleHQoIkRlbGV0aW5nIEludGVybmV0IENhY2hlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZXRQcm9ncmVzc0NvbnRyaWJ1dGlvbigpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gUHJvZ3Jlc3NDb250cmlidXRpb24uUFJPR1JFU1NfQ09OVFJJQlVUSU9OX0lEOwotICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgIElWaWV3UGFydCBwYXJ0ID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRWaWV3UmVmZXJlbmNlcygpWzBdLmdldFZpZXcoZmFsc2UpOwotICAgICAgICBJVmlld1NpdGUgdmlld1NpdGUgPSBwYXJ0LmdldFZpZXdTaXRlKCk7Ci0gICAgICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSB2aWV3U2l0ZS5nZXRBY3Rpb25CYXJzKCk7Ci0gICAgICAgIG1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0gICAgICAgIHBjID0gKFByb2dyZXNzQ29udHJpYnV0aW9uKSBtYW5hZ2VyLmZpbmQoaWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmRQcm9ncmVzcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocGMgIT0gbnVsbCAmJiBtYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBjLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY291bnRDYWNoZUVudHJpZXMoKSB7Ci0gICAgICAgIGludCBjb3VudCA9IDE7Ci0gICAgICAgIGludCBwQ2FjaGVFbnRyeSA9IE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBCVUZGRVJfU0laRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnRbXSBwU2l6ZSA9IG5ldyBpbnRbXSB7IEJVRkZFUl9TSVpFIH07Ci0gICAgICAgICAgICBPUy5Nb3ZlTWVtb3J5KHBDYWNoZUVudHJ5LCBwU2l6ZSwgNCk7Ci0gICAgICAgICAgICBpbnQgaEVudW0gPSBXaW5JbmV0LkZpbmRGaXJzdFVybENhY2hlRW50cnlXKDAsIHBDYWNoZUVudHJ5LCBwU2l6ZSk7Ci0gICAgICAgICAgICBpZiAoMCAhPSBoRW51bSkgewotICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludFtdIHBFbnRyaWVzID0gbmV3IGludFsyMF07Ci0gICAgICAgICAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkocEVudHJpZXMsIHBDYWNoZUVudHJ5LCA0ICogcEVudHJpZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gKHBFbnRyaWVzWzNdICYgMHgwMDMwMDAwMCkpIHsgLy8gU2tpcCBDb29raWUgJiBIaXN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxGaWxlTmFtZSA9IG5ldyBXU1RSKHBFbnRyaWVzWzJdKS5nZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2tpcCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRmlsZU5hbWUuaW5kZXhPZignPycpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3MgPSBsb2NhbEZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0xICE9IHBvcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXh0ID0gbG9jYWxGaWxlTmFtZS5zdWJzdHJpbmcocG9zICsgMSkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IC0xICE9IE5FVkVSX0RFTEVURS5pbmRleE9mKCJ8IiArIGV4dCArICJ8Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcFNpemVbMF0gPSBCVUZGRVJfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFXaW5JbmV0LkZpbmROZXh0VXJsQ2FjaGVFbnRyeVcoaEVudW0sIHBDYWNoZUVudHJ5LCBwU2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFdpbkluZXQuRmluZENsb3NlVXJsQ2FjaGUoaEVudW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgT1MuR2xvYmFsRnJlZShwQ2FjaGVFbnRyeSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZWxldGVDYWNoZUVudHJpZXMoKSB7Ci0gICAgICAgIGRlbGV0ZUNhY2hlRW50cmllcyhudWxsLCAwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVsZXRlQ2FjaGVFbnRyaWVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRvdGFsKSB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgaW50IHBDYWNoZUVudHJ5ID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsIEJVRkZFUl9TSVpFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludFtdIHBTaXplID0gbmV3IGludFtdIHsgQlVGRkVSX1NJWkUgfTsKLSAgICAgICAgICAgIE9TLk1vdmVNZW1vcnkocENhY2hlRW50cnksIHBTaXplLCA0KTsKLSAgICAgICAgICAgIGludCBoRW51bSA9IFdpbkluZXQuRmluZEZpcnN0VXJsQ2FjaGVFbnRyeVcoMCwgcENhY2hlRW50cnksIHBTaXplKTsKLSAgICAgICAgICAgIGlmICgwICE9IGhFbnVtKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG1vbml0b3IgPT0gbnVsbCB8fCAhbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50W10gcEVudHJpZXMgPSBuZXcgaW50WzIwXTsKLSAgICAgICAgICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShwRW50cmllcywgcENhY2hlRW50cnksIDQgKiBwRW50cmllcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSAocEVudHJpZXNbM10gJiAweDAwMzAwMDAwKSkgeyAvLyBTa2lwIENvb2tpZSAmIEhpc3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbEZpbGVOYW1lID0gbmV3IFdTVFIocEVudHJpZXNbMl0pLmdldFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBza2lwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxGaWxlTmFtZS5pbmRleE9mKCc/JykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IGxvY2FsRmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgIT0gcG9zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHQgPSBsb2NhbEZpbGVOYW1lLnN1YnN0cmluZyhwb3MgKyAxKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gLTEgIT0gTkVWRVJfREVMRVRFLmluZGV4T2YoInwiICsgZXh0ICsgInwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmKCBza2lwICkgU3lzdGVtLm91dC5wcmludChleHQrInwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU1RSIHdzU291cmNlVXJsTmFtZSA9IG5ldyBXU1RSKHBFbnRyaWVzWzFdKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5zdWJUYXNrKHdzU291cmNlVXJsTmFtZS5nZXRTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRGVsZXRlOiAiICsgbG9jYWxGaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5JbmV0LkRlbGV0ZVVybENhY2hlRW50cnlXKHdzU291cmNlVXJsTmFtZS5nZXRBZGRyZXNzKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhY2tncm91bmQgJiYgdG90YWw+MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VQcm9ncmVzcyhjb3VudCAqIDEwMCAvIHRvdGFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcFNpemVbMF0gPSBCVUZGRVJfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFXaW5JbmV0LkZpbmROZXh0VXJsQ2FjaGVFbnRyeVcoaEVudW0sIHBDYWNoZUVudHJ5LCBwU2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFdpbkluZXQuRmluZENsb3NlVXJsQ2FjaGUoaEVudW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgT1MuR2xvYmFsRnJlZShwQ2FjaGVFbnRyeSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VQcm9ncmVzcyhmaW5hbCBpbnQgdmFsdWUpIHsKLSAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAocGMgIT0gbnVsbCAmJiBtYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGMuc2V0VmFsdWUodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L3VpL2FjdGlvbnMvT3BlblByZWZlcmVuY2VzQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvdWkvYWN0aW9ucy9PcGVuUHJlZmVyZW5jZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmZWJiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvdWkvYWN0aW9ucy9PcGVuUHJlZmVyZW5jZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotCi0KLQotcHVibGljIGNsYXNzIE9wZW5QcmVmZXJlbmNlc0FjdGlvbiBleHRlbmRzIEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0KLSAgICBJVmlld1BhcnQgdmlldzsKLQotICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotICAgICAgICBQcmVmZXJlbmNlc1V0aWwKLSAgICAgICAgLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbih2aWV3LmdldFNpdGUoKS5nZXRTaGVsbCgpLCAib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS5wcmVmZXJlbmNlcy5Qcm94eVByZWZlcmVuY2VQYWdlIiwgbnVsbCwgbnVsbCkKLSAgICAgICAgLm9wZW4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0gICAgICAgIHRoaXMudmlldyA9IHZpZXc7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvdWkvdmlld3MvUHJveHlMb2dWaWV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvdWkvdmlld3MvUHJveHlMb2dWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZjI1NWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L3VpL3ZpZXdzL1Byb3h5TG9nVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eS51aS52aWV3czsKLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5Lk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHkuUHJveHlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eS5sb2dzLlByb3h5TG9nSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LmxvZ3MuUHJveHlMb2dSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUHJveHlMb2dWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gUHJveHlMb2dWaWV3LmNsYXNzLmdldE5hbWUoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhFQURJTkdTID0geyBNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5Lm1lc3NhZ2UiKSwgIklEIiwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5zb3VyY2UiKSwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS50aW1lIikgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBXRUlHSFRTID0gICAgIHsgMzAsIDMsIDEwLCA1IH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQUxJR05NRU5UUyA9ICB7IFNXVC5MRUZULCBTV1QuTEVGVCwgU1dULkxFRlQsIFNXVC5MRUZUICB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBST1dfTUVTU0FHRSA9IDA7IAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBST1dfSUQgPSAxOyAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9XX1NPVVJDRSA9IDI7IAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBST1dfVElNRSA9IDM7IAotICAgIAotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyOwotICAgIHByaXZhdGUgUHJveHlMb2dWaWV3U29ydGVyIHNvcnRlciA9IG5ldyBQcm94eUxvZ1ZpZXdTb3J0ZXIoKTsgCi0KLSAgICBwcml2YXRlIEFjdGlvbiBjbGVhckFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBzaG93RmluZUFjdGlvbjsKLSAgICBwcml2YXRlIEFjdGlvbiBjb3B5QWN0aW9uOwotICAgIHByaXZhdGUgVmlld0xhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0KLQljbGFzcyBWaWV3Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHYsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotICAgICAgICAgICAgcmV0dXJuIFByb3h5TG9nSGFuZGxlci5nZXRMb2dzKCkudG9BcnJheSgpOwotCQl9Ci0JfQotCWNsYXNzIFZpZXdMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBpZiggb2JqIGluc3RhbmNlb2YgUHJveHlMb2dSZWNvcmQgKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBpbmRleCApIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBST1dfVElNRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZSA9ICgoUHJveHlMb2dSZWNvcmQpb2JqKS5nZXRNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdCgiezAsdGltZX0iLG5ldyBPYmplY3RbXXtuZXcgRGF0ZSh0aW1lKX0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgUk9XX01FU1NBR0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChQcm94eUxvZ1JlY29yZClvYmopLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBST1dfSUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChQcm94eUxvZ1JlY29yZClvYmopLmdldElEKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUk9XX1NPVVJDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2dnZXIgPSAoKFByb3h5TG9nUmVjb3JkKW9iaikuZ2V0TG9nZ2VyTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlcCA9IGxvZ2dlci5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIC0xICE9IHNlcCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyLnN1YnN0cmluZyhzZXArMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQkJCXJldHVybiBnZXRUZXh0KG9iaik7Ci0JCX0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmosIGludCBpbmRleCkgewotICAgICAgICAgICAgaWYoIFJPV19NRVNTQUdFPT1pbmRleCAmJiBvYmogaW5zdGFuY2VvZiBQcm94eUxvZ1JlY29yZCApIHsKLSAgICAgICAgICAgICAgICBJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0gICAgICAgICAgICAgICAgaW50IGxldmVsID0gKChQcm94eUxvZ1JlY29yZClvYmopLmdldExldmVsKCkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiggbGV2ZWwgPiBMZXZlbC5XQVJOSU5HLmludFZhbHVlKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FUlJPUl9UU0spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiggbGV2ZWwgPiBMZXZlbC5JTkZPLmludFZhbHVlKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19XQVJOX1RTSyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKCBsZXZlbCA+IExldmVsLkZJTkUuaW50VmFsdWUoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNoYXJlZEltYWdlcy5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lORk9fVFNLKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUHJveHlMb2dWaWV3KCkgewotCX0KLQotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgfQotICAgIAotCS8qKgotCSAqIFRoaXMgaXMgYSBjYWxsYmFjayB0aGF0IHdpbGwgYWxsb3cgdXMKLQkgKiB0byBjcmVhdGUgdGhlIHZpZXdlciBhbmQgaW5pdGlhbGl6ZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCxTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgICAgIFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgICAgICB0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBmb3IoIGludCBpPTA7IGk8SEVBRElOR1MubGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgICAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YShXRUlHSFRTW2ldKSk7Ci0gICAgICAgICAgICBUYWJsZUNvbHVtbiB0YyA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgdGMuc2V0VGV4dChIRUFESU5HU1tpXSk7Ci0gICAgICAgICAgICB0Yy5zZXRBbGlnbm1lbnQoQUxJR05NRU5UU1tpXSk7Ci0gICAgICAgICAgICB0Yy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbmV3U29ydGluZ0NvbHVtbiA9IGkrMTsKLSAgICAgICAgICAgIHRjLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBpZiggbmV3U29ydGluZ0NvbHVtbj09IHNvcnRlci5zb3J0aW5nQ29sdW1uICkgewotICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVyLnNvcnRpbmdDb2x1bW4gPSAtbmV3U29ydGluZ0NvbHVtbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlci5zb3J0aW5nQ29sdW1uID0gbmV3U29ydGluZ0NvbHVtbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0gICAgICAgIAotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBWaWV3Q29udGVudFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyID0gbmV3IFZpZXdMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICB2aWV3ZXIuc2V0U29ydGVyKHNvcnRlcik7Ci0gICAgICAgIHZpZXdlci5zZXRJbnB1dChnZXRWaWV3U2l0ZSgpKTsKLQkJbWFrZUFjdGlvbnMoKTsKLQkJaG9va0NvbnRleHRNZW51KCk7Ci0JCWNvbnRyaWJ1dGVUb0FjdGlvbkJhcnMoKTsKLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSBjbGFzcyBQcm94eUxvZ1ZpZXdTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotICAgICAgICBwdWJsaWMgaW50IHNvcnRpbmdDb2x1bW4gPSAwOwotICAgICAgICAKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0gICAgICAgICAgICBpZiAoMCAhPSBzb3J0aW5nQ29sdW1uICYmIHZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVmlld2VyKSB7Ci0gICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSAoKFRhYmxlVmlld2VyKXZpZXdlcikuZ2V0TGFiZWxQcm92aWRlcigpOwotICAgICAgICAgICAgICAgIGlmKCBsYWJlbFByb3ZpZGVyIGluc3RhbmNlb2YgSVRhYmxlTGFiZWxQcm92aWRlciApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbkluZGV4ID0gTWF0aC5hYnMoc29ydGluZ0NvbHVtbiktMTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMxID0gKChJVGFibGVMYWJlbFByb3ZpZGVyKWxhYmVsUHJvdmlkZXIpLmdldENvbHVtblRleHQoZTEsY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgczIgPSAoKElUYWJsZUxhYmVsUHJvdmlkZXIpbGFiZWxQcm92aWRlcikuZ2V0Q29sdW1uVGV4dChlMixjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIGNvbHVtbkluZGV4ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBST1dfVElNRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoaW50KSgoKFByb3h5TG9nUmVjb3JkKWUxKS5nZXRNaWxsaXMoKS0oKFByb3h5TG9nUmVjb3JkKWUyKS5nZXRNaWxsaXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJPV19NRVNTQUdFOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBST1dfU09VUkNFOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBST1dfSUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShzMSxzMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnRpbmdDb2x1bW4gPiAwID8gcmVzdWx0IDogLXJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotCXByaXZhdGUgdm9pZCBob29rQ29udGV4dE1lbnUoKSB7Ci0JCU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsgLy8kTk9OLU5MUy0xJAotCQltZW51TWdyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJbWVudU1nci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCQlQcm94eUxvZ1ZpZXcudGhpcy5maWxsQ29udGV4dE1lbnUobWFuYWdlcik7Ci0JCQl9Ci0JCX0pOwotCQlNZW51IG1lbnUgPSBtZW51TWdyLmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KG1lbnVNZ3IsIHZpZXdlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVUb0FjdGlvbkJhcnMoKSB7Ci0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJZmlsbExvY2FsUHVsbERvd24oYmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQkJZmlsbExvY2FsVG9vbEJhcihiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsTG9jYWxQdWxsRG93bihJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQltYW5hZ2VyLmFkZChzaG93RmluZUFjdGlvbik7Ci0gICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIG1hbmFnZXIuYWRkKGNsZWFyQWN0aW9uKTsKLSAgICAgICAgbWFuYWdlci5hZGQoY29weUFjdGlvbik7Ci0JCS8vIE90aGVyIHBsdWctaW5zIGNhbiBjb250cmlidXRlIHRoZXJlIGFjdGlvbnMgaGVyZQotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaWxsTG9jYWxUb29sQmFyKElUb29sQmFyTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKGNsZWFyQWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0JCWNsZWFyQWN0aW9uID0gbmV3IEFjdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LmNsZWFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIFByb3h5TG9nSGFuZGxlci5jbGVhcigpOwotICAgICAgICAgICAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX07Ci0JCWNsZWFyQWN0aW9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLmdldFN0cmluZygicHJveHkuY2xlYXJfdGlwIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNsZWFyQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihQcm94eVBsdWdpbi5JTUFHRV9DTEVBUik7Ci0JCQotCQlzaG93RmluZUFjdGlvbiA9IG5ldyBBY3Rpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJwcm94eS5zaG93X2ZpbmUiKSxBY3Rpb24uQVNfQ0hFQ0tfQk9YKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBQcm94eUxvZ0hhbmRsZXIuc2V0TG9nTGV2ZWwoc2hvd0ZpbmVBY3Rpb24uaXNDaGVja2VkKCkgPyBMZXZlbC5GSU5FIDogTGV2ZWwuSU5GTyk7Ci0JCQl9Ci0JCX07Ci0gICAgICAgIAotICAgICAgICBjb3B5QWN0aW9uID0gbmV3IEFjdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoInByb3h5LmNvcHkiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGZvciggaW50IGluZGV4PTA7O2luZGV4KysgKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gdmlld2VyLmdldEVsZW1lbnRBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBudWxsPT1lbGVtZW50ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgY29sPTA7IGNvbDxIRUFESU5HUy5sZW5ndGg7IGNvbCsrICkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChlbGVtZW50LCBjb2wpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjb2w9PUhFQURJTkdTLmxlbmd0aC0xID8gIlxyXG4iOiJcdCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKCBzYi5sZW5ndGgoKT4wICkgewotICAgICAgICAgICAgICAgICAgICBuZXcgQ2xpcGJvYXJkKERpc3BsYXkuZ2V0Q3VycmVudCgpKS5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10geyBzYi50b1N0cmluZygpIH0sIG5ldyBUcmFuc2ZlcltdIHsgVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBjb3B5QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ09QWSkpOwotCX0KLQotCS8qKgotCSAqIFBhc3NpbmcgdGhlIGZvY3VzIHJlcXVlc3QgdG8gdGhlIHZpZXdlcidzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gucHJveHkvdGVtcGxhdGVzL3Byb3h5LnBhYyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS90ZW1wbGF0ZXMvcHJveHkucGFjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjc5N2NlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5wcm94eS90ZW1wbGF0ZXMvcHJveHkucGFjCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotdmFyIE5PX1BST1hZID0gIiROT1BST1hZX0VYVFMkIjsNCi0NCi1mdW5jdGlvbiBGaW5kUHJveHlGb3JVUkwodXJsLCBob3N0KSB7DQotICBpZiggdXJsLnN1YnN0cmluZygwLDUpID09ICJodHRwOiIgKSB7DQotICAgIGlmKCBOT19QUk9YWS5sZW5ndGggPiAwICYmIHVybC5pbmRleE9mKCI/IikgPT0gLTEgKSB7DQotCSAgdmFyIGV4dFBvcyA9IHVybC5sYXN0SW5kZXhPZigiLiIpOw0KLQkgIGlmKCBleHRQb3MgIT0gLTEgKSB7DQotCSAgICBpZiggTk9fUFJPWFkuaW5kZXhPZigifCIrdXJsLnN1YnN0cmluZyhleHRQb3MrMSkudG9Mb3dlckNhc2UoKSsifCIpICE9IC0xICkgew0KLQkgICAgICByZXR1cm4gIiRIVFRQX0RJUkVDVCQiOw0KLQkgICAgfQ0KLQkgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gIiRIVFRQX1BST1hZJCI7DQotICB9DQotICBpZiggdXJsLnN1YnN0cmluZygwLDYpID09ICJodHRwczoiICkgew0KLSAgICByZXR1cm4gIiRIVFRQU19ESVJFQ1QkIjsNCi0gIH0NCi0gIGlmKCB1cmwuc3Vic3RyaW5nKDAsNCkgPT0gImZ0cDoiICkgew0KLSAgICByZXR1cm4gIiRGVFBfRElSRUNUJCI7DQotICB9DQotICBpZiggdXJsLnN1YnN0cmluZygwLDcpID09ICJnb3BoZXI6IiApIHsNCi0gICAgcmV0dXJuICIkR09QSEVSX0RJUkVDVCQiOw0KLSAgfQ0KLSAgcmV0dXJuICJESVJFQ1QiOw0KLX0NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTc4MzdiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzBlZmU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVjbGlwc2UgQUNURiBGbGFzaCBNb2RlbCBQbHVnLWluIChJbmN1YmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaAotQnVuZGxlLVZlcnNpb246IDAuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5GbGFzaE1vZGVsUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LAotIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMiwKLSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5hcywKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmJyaWRnZSwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnV0aWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MWRiY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvRWNsaXBzZV9BQ1RGX2luaXRpYWxpemVyLmFzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9FY2xpcHNlX0FDVEZfaW5pdGlhbGl6ZXIuYXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYzM4ZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9FY2xpcHNlX0FDVEZfaW5pdGlhbGl6ZXIuYXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoaW4gU0FJVE8sIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgQ29tbW9uIEJyaWRnZSBJbml0aWFsaXphdGlvbiBNb2R1bGUKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1fcm9vdC5FY2xpcHNlX0FDVEZfaXNfYXZhaWxhYmxlID0gInRydWUiOwotX3Jvb3QuRWNsaXBzZV9BQ1RGX1NXRl9CcmlkZ2VfdmVyc2lvbiA9ICIxLjEuMCI7Ci0KLS8vIFVzZWQgYnkgUmVxdWVzdFNlcnZlci4KLV9yb290LkVjbGlwc2VfQUNURl9yZXF1ZXN0X2FyZ3MgPSAiIjsKLV9yb290LkVjbGlwc2VfQUNURl9yZXNwb25zZV92YWx1ZSA9ICIiOwotX3Jvb3QuRWNsaXBzZV9BQ1RGX1NXRl9DT05URU5UX0lEID0gX2dsb2JhbC5FY2xpcHNlX0FDVEZfU1dGX0NPTlRFTlRfSUQ7Ci0vLyBFeHRlcm5hbEludGVyZmFjZS5hZGRDYWxsYmFjaygnZ2V0U3dmVmVyc2lvbicsIG51bGwsIEVjbGlwc2VfQUNURl9Db250cm9sbGVyLmdldFN3ZlZlcnNpb24pOwotRWNsaXBzZV9BQ1RGX1JlcXVlc3RTZXJ2ZXIuc3RhcnQoX2dsb2JhbC5FY2xpcHNlX0FDVEZfU0VDUkVUKTsKLWRlbGV0ZSBfZ2xvYmFsLkVjbGlwc2VfQUNURl9TRUNSRVQ7Ci0KLUVjbGlwc2VfQUNURl9Jbml0LmluaXRpYWxpemUoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9icmlkZ2UuYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfYnJpZGdlLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTMxOTRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9icmlkZ2UuYXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoaW4gU0FJVE8sIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgIEJyaWRnZSBJbml0aWFsaXphdGlvbiBtb2R1bGUgZm9yIFNXRiBib290bG9hZGVyCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW1wb3J0IGZsYXNoLmV4dGVybmFsLkV4dGVybmFsSW50ZXJmYWNlOwotCi12YXIgRWNsaXBzZV9BQ1RGX0RFQlVHOkJvb2xlYW4gPSBmYWxzZTsKLQotdHJhY2UoJ1NXRiBicmlkZ2UgdmVyIDEuMy4yIGlzIGxvYWRlZCcpOwotdHJhY2UoJ3JlZ2lzdGVyaW5nIGdldFN3ZlZlcnNpb24gYWdhaW4uLi4nKTsKLVN5c3RlbS5zZWN1cml0eS5hbGxvd0RvbWFpbignKicpOyAgIC8vIHNoaW4KLUV4dGVybmFsSW50ZXJmYWNlLmFkZENhbGxiYWNrKCdnZXRTd2ZWZXJzaW9uJywgbnVsbCwgRWNsaXBzZV9BQ1RGX0NvbnRyb2xsZXIuZ2V0U3dmVmVyc2lvbik7Ci10cmFjZSgnZG9uZS4nKTsKLQotaWYgKEVjbGlwc2VfQUNURl9ERUJVRyl7Ci0gIHZhciBFY2xpcHNlX0FDVEZfbGM6TG9jYWxDb25uZWN0aW9uID0gbmV3IExvY2FsQ29ubmVjdGlvbigpOwotICB2YXIgbWVzczpTdHJpbmcgPSAiIjsKLSAgbWVzcyA9ICJTV0YgYnJpZGdlIHZlciAxLjMuMiIgKyBuZXdsaW5lICsgInRoaXMuX3VybCA9ICIgKyB0aGlzLl91cmwgKyBuZXdsaW5lOwotfQotCi1mb3IgKHByb3AgaW4gX2dsb2JhbC5FY2xpcHNlX0FDVEZfUFJPUEVSVElFUykgewotICBpZiAoRWNsaXBzZV9BQ1RGX0RFQlVHKXsKLSAgICBtZXNzICs9ICIgOiIgKyBwcm9wICsgIj0iICsgX2dsb2JhbC5FY2xpcHNlX0FDVEZfUFJPUEVSVElFU1twcm9wXSArIG5ld2xpbmU7Ci0gICAgbWVzcyArPSAiIDowOiIgKyBwcm9wICsgIj0iICsgX2xldmVsMFtwcm9wXSArIG5ld2xpbmU7Ci0gIH0KLQotICBpZiAoT2JqZWN0LnByb3RvdHlwZVtwcm9wXSkgewotICAgIGRlbGV0ZSBPYmplY3QucHJvdG90eXBlW3Byb3BdOwotICB9Ci0gIGlmIChfbGV2ZWwwW3Byb3BdID09IHVuZGVmaW5lZCkgewotICAgIF9sZXZlbDBbcHJvcF0gPSBfZ2xvYmFsLkVjbGlwc2VfQUNURl9QUk9QRVJUSUVTW3Byb3BdOwotICB9Ci0KLSAgaWYgKEVjbGlwc2VfQUNURl9ERUJVRyl7Ci0gICAgbWVzcyArPSAiIDpjOiIgKyBwcm9wICsgIj0iICsgX2xldmVsMFtwcm9wXSArIG5ld2xpbmU7Ci0gIH0KLX0KLQotaWYgKEVjbGlwc2VfQUNURl9ERUJVRyl7Ci0gIEVjbGlwc2VfQUNURl9sYy5zZW5kKCJfdGVzdExDIiwgImR1bXAiLCBtZXNzKTsKLX0KLQotX2dsb2JhbC5lbmNvZGVTdHJpbmdGb3JCcmlkZ2UgPSBmdW5jdGlvbihhcmc6U3RyaW5nKSB7Ci0gIHJldHVybiBhcmc7Ci19Ci0KLSNpbmNsdWRlICJFY2xpcHNlX0FDVEZfaW5pdGlhbGl6ZXIuYXMiCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfYnJpZGdlLmZsYSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9icmlkZ2UuZmxhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODVmYzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9icmlkZ2UuZmxhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9ib290X2JyaWRnZS5zd2YgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfYnJpZGdlLnN3ZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZhYzQwYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfYnJpZGdlLnN3ZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9sb2FkZXIuYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfbG9hZGVyLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWEyYzFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9sb2FkZXIuYXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGluIFNBSVRPLCBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBib290X2xvYWRlci5hcwotaW1wb3J0IGZsYXNoLmV4dGVybmFsLkV4dGVybmFsSW50ZXJmYWNlOwotCi12YXIgRWNsaXBzZV9BQ1RGX0RFQlVHOkJvb2xlYW4gPSBmYWxzZTsKLXZhciBFY2xpcHNlX0FDVEZfUkFORE9NX1NUUklOR18xID0gIiI7Ci0KLXRyYWNlKCJTV0YgYm9vdC1sb2FkZXIgdmVyIDEuMy4yIGlzIGxvYWRlZCIpOwotCi1pZiAoRWNsaXBzZV9BQ1RGX0RFQlVHKSB7Ci0gICAgdmFyIEVjbGlwc2VfQUNURl9sYzpMb2NhbENvbm5lY3Rpb24gPSBuZXcgTG9jYWxDb25uZWN0aW9uKCk7Ci0gICAgdmFyIG1lc3M6U3RyaW5nID0gIiI7Ci0gICAgbWVzcyA9ICJTV0YgYm9vdGxvYWRlciB2ZXIgMS4zLjIiICsgbmV3bGluZSArICJ0aGlzLl91cmwgPSAiICsgdGhpcy5fdXJsICsgbmV3bGluZTsKLX0KLQotaWYgKF9sZXZlbDUzNTUzLkVjbGlwc2VfQUNURl9pc19hdmFpbGFibGUpIHsKLSAgICBpZiAoRWNsaXBzZV9BQ1RGX0RFQlVHKSB7Ci0gICAgICAgIG1lc3MgKz0gInRoaXMgaXMgY2hpbGQgU1dGLiIgKyBuZXdsaW5lOwotICAgIH0KLSAgICBmb3IgKHByb3AgaW4gdGhpcykgewotICAgICAgICBpZiAocHJvcCAhPSAiZ2V0U2FtZURvbWFpblVSTCIgJiYgcHJvcCAhPSAibWVzcyIgJiYgcHJvcCAhPSAiRWNsaXBzZV9BQ1RGX2xjIiAmJiBwcm9wICE9ICIkdmVyc2lvbiIgJiYKLSAgICAgICAgICAgIHByb3AgIT0gIkVjbGlwc2VfQUNURl9ERUJVRyIpIHsKLSAgICAgICAgICAgIGlmIChFY2xpcHNlX0FDVEZfREVCVUcpIHsKLSAgICAgICAgICAgICAgICBtZXNzICs9ICIgOiIrcHJvcCArICI9IiArIHRoaXNbcHJvcF0gKyBuZXdsaW5lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2dsb2JhbC5FY2xpcHNlX0FDVEZfUFJPUEVSVElFU1twcm9wXSA9IHRoaXNbcHJvcF07Ci0gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlW3Byb3BdID0gdGhpc1twcm9wXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoRWNsaXBzZV9BQ1RGX0RFQlVHKSB7Ci0gICAgICAgIEVjbGlwc2VfQUNURl9VdGlsLnNlbmQobWVzcyk7Ci0gICAgfQotICAgIHRoaXMubG9hZE1vdmllKHRoaXMuX3VybCwgIlBPU1QiKTsKLX0gZWxzZSB7Ci0gICAgaWYgKEVjbGlwc2VfQUNURl9ERUJVRykgewotICAgICAgICBtZXNzICs9ICJ0aGlzIGlzIHJvb3QgU1dGLiIgKyBuZXdsaW5lOwotICAgIH0KLSAgICBfZ2xvYmFsLkVjbGlwc2VfQUNURl9QUk9QRVJUSUVTID0gbmV3IE9iamVjdCgpOwotICAgIC8vIHRyYWNlKCdyZWdpc3RlcmluZyBnZXRTd2ZWZXJzaW9uLi4uJyk7Ci0gICAgLy8gRXh0ZXJuYWxJbnRlcmZhY2UuYWRkQ2FsbGJhY2soJ2dldFN3ZlZlcnNpb24nLCBudWxsLCBFY2xpcHNlX0FDVEZfQ29udHJvbGxlci5nZXRTd2ZWZXJzaW9uKTsKLSAgICAvLyB0cmFjZSgnZG9uZS4nKTsKLSAgICB2YXIgZ2V0U2FtZURvbWFpblVSTCA9IGZ1bmN0aW9uKHVybDpTdHJpbmcsIGZpbGVuYW1lKSB7Ci0gICAgICAgIGlmICh1cmwuaW5kZXhPZigiaHR0cDoiKTwwICYmIHVybC5pbmRleE9mKCJodHRwczoiKTwwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZW5hbWU7Ci0gICAgICAgIH0KLQl2YXIgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoIj8iKTsKLQlpZiAoaW5kZXggPj0gMCl7Ci0JICAgIHVybCA9IHVybC5zdWJzdHJpbmcoMCxpbmRleCk7Ci0JfQotCWluZGV4ID0gdXJsLmxhc3RJbmRleE9mKCIvIik7Ci0gICAgICAgIGlmICh1cmwuY2hhckF0KGluZGV4LTEpID09ICIvIikgewotICAgICAgICAgICAgcmV0dXJuIHVybCArICIvIiArIGZpbGVuYW1lOyAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KzEpK2ZpbGVuYW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBfZ2xvYmFsLkVjbGlwc2VfQUNURl9WaWRlbyA9IG5ldyBPYmplY3QoKTsKLSAgICBfZ2xvYmFsLkVjbGlwc2VfQUNURl9WaWRlby5zdHJlYW1zID0gbmV3IEFycmF5KCk7Ci0gICAgX2dsb2JhbC5FY2xpcHNlX0FDVEZfVmlkZW8ucmVnaXN0ZXIgPSBmdW5jdGlvbih0YXJnZXQ6T2JqZWN0LCBzb3VyY2U6T2JqZWN0KSB7Ci0gICAgICAgIGlmICgoIXRhcmdldCkgfHwgKCFzb3VyY2UpKSByZXR1cm47Ci0gICAgICAgIHZhciBhcjpBcnJheSA9IF9nbG9iYWwuRWNsaXBzZV9BQ1RGX1ZpZGVvLnN0cmVhbXM7Ci0gICAgICAgIHZhciBzbG90OkVjbGlwc2VfQUNURl9TdHJlYW07Ci0gICAgICAgIGZvciAodmFyIGkgPSAwOyA7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgPT0gYXIubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgc2xvdCA9IG5ldyBFY2xpcHNlX0FDVEZfU3RyZWFtKHRhcmdldCwgc291cmNlKTsKLSAgICAgICAgICAgICAgICBhci5wdXNoKHNsb3QpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xvdCA9IGFyW2ldOwotICAgICAgICAgICAgaWYgKHNsb3QuZXF1YWxzKHRhcmdldCkpIHsKLSAgICAgICAgICAgICAgICBzbG90LnVwZGF0ZShzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgX2dsb2JhbC5FY2xpcHNlX0FDVEZfVmlkZW8uYXR0YWNoVmlkZW8gPSBWaWRlby5wcm90b3R5cGUuYXR0YWNoVmlkZW87Ci0gICAgVmlkZW8ucHJvdG90eXBlLmF0dGFjaFZpZGVvID0gZnVuY3Rpb24oc291cmNlOk9iamVjdCkgewotICAgICAgICAvLyBFY2xpcHNlX0FDVEZfVXRpbC5zZW5kKCJWaWRlby5hdHRhY2hWaWRlbyEhISIpOwotICAgICAgICBfZ2xvYmFsLkVjbGlwc2VfQUNURl9WaWRlby5yZWdpc3Rlcih0aGlzLCBzb3VyY2UpOwotICAgICAgICBfZ2xvYmFsLkVjbGlwc2VfQUNURl9WaWRlby5hdHRhY2hWaWRlby5jYWxsKHRoaXMsIHNvdXJjZSk7Ci0gICAgfTsKLQotICAgIC8vIF9nbG9iYWwuRWNsaXBzZV9BQ1RGX1ZpZGVvLnNvdW5kcCA9IG5ldyBPYmplY3QoKTsKLSAgICAvLyBBU1NldFByb3BGbGFncyhfZ2xvYmFsLlNvdW5kLnByb3RvdHlwZSwgImF0dGFjaFNvdW5kIiwgMCwgdHJ1ZSk7Ci0gICAgLy8gX2dsb2JhbC5FY2xpcHNlX0FDVEZfVmlkZW8uc291bmRwLm9uTG9hZCA9IFNvdW5kLnByb3RvdHlwZS5vbkxvYWQ7Ci0gICAgLy9Tb3VuZC5wcm90b3R5cGUuYXR0YWNoU291bmQgPSBmdW5jdGlvbigpIHsKLSAgICAvLyAgICBFY2xpcHNlX0FDVEZfVXRpbC5zZW5kKCJJbnZva2VkOiAiICsgImF0dGFjaFNvdW5kIik7Ci0gICAgLy8gICAgX2dsb2JhbC5FY2xpcHNlX0FDVEZfVmlkZW8ucmVnaXN0ZXIodGhpcywgdGhpcyk7Ci0gICAgLy8gICAgcmV0dXJuIF9nbG9iYWwuRWNsaXBzZV9BQ1RGX1ZpZGVvLnNvdW5kcC5hdHRhY2hTb3VuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwotICAgIC8vfQotICAgIC8vIEVjbGlwc2VfQUNURl9VdGlsLnNlbmQoIkluaXQuLi4iKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBmb3IgKHByb3AgaW4gdGhpcykgewotICAgICAgICBpZiAocHJvcCAhPSAiZ2V0U2FtZURvbWFpblVSTCIKLSAgICAgICAgICAgICYmIHByb3AgIT0gIm1lc3MiCi0gICAgICAgICAgICAmJiBwcm9wICE9ICJFY2xpcHNlX0FDVEZfbGMiCi0gICAgICAgICAgICAmJiBwcm9wICE9ICIkdmVyc2lvbiIKLSAgICAgICAgICAgICYmIHByb3AgIT0gIkVjbGlwc2VfQUNURl9ERUJVRyIpIHsKLSAgICAgICAgICAgIGlmIChFY2xpcHNlX0FDVEZfREVCVUcpIHsKLSAgICAgICAgICAgICAgICBtZXNzICs9ICIgOiIrcHJvcCArICI9IiArIHRoaXNbcHJvcF0gKyBuZXdsaW5lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2dsb2JhbC5FY2xpcHNlX0FDVEZfUFJPUEVSVElFU1twcm9wXSA9IHRoaXNbcHJvcF07Ci0gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlW3Byb3BdID0gdGhpc1twcm9wXTsKLSAgICAgICAgICAgIEFTU2V0UHJvcEZsYWdzKE9iamVjdC5wcm90b3R5cGUsIHByb3AsIDEpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5zZXRQcm9wZXJ0eUlzRW51bWVyYWJsZSkgewotICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnNldFByb3BlcnR5SXNFbnVtZXJhYmxlKHByb3AsIGZhbHNlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKi8KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoRWNsaXBzZV9BQ1RGX0RFQlVHKSB7Ci0gICAgICAgIEVjbGlwc2VfQUNURl9sYy5zZW5kKCJfdGVzdExDIiwgImR1bXAiLCBtZXNzKTsKLSAgICB9Ci0KLSAgICAvLyBsb2FkIHRoZSBzZWNyZXQuCi0KLSAgICB2YXIgbHY6TG9hZFZhcnMgPSBuZXcgTG9hZFZhcnMoKTsKLSAgICBsdi5vbkxvYWQgPSBmdW5jdGlvbihmbGFnOkJvb2xlYW4pIHsKLSAgICAgICAgaWYgKGZsYWcpIHsKLSAgICAgICAgICAgIF9nbG9iYWwuRWNsaXBzZV9BQ1RGX1NXRl9DT05URU5UX0lEID0gbHYuY29udGVudGlkOwotICAgICAgICAgICAgX2dsb2JhbC5FY2xpcHNlX0FDVEZfU0VDUkVUID0gbHYuc2VjcmV0OwotICAgICAgICAgICAgLy8gbG9hZCB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgIGxvYWRNb3ZpZU51bShfcm9vdC5fdXJsLCAwLCAiUE9TVCIpOwotICAgCi0gICAgICAgICAgICAvLyBsb2FkIGJvb3RfYnJpZGdlLnN3ZgotICAgICAgICAgICAgbG9hZE1vdmllTnVtKGdldFNhbWVEb21haW5VUkwoX3Jvb3QuX3VybCwgIkVjbGlwc2UtQUNURi1TV0YtSW5pdGlhbGl6ZS1CcmlkZ2UtUGFja2FnZS0xMDgyMDE3MzA5MTMwMTg3NDcyLnN3ZiIpLCA1MzU1Myk7Ci0gICAgICAgIH0KLSAgICB9OwotICAgIGx2LmxvYWQoZ2V0U2FtZURvbWFpblVSTCh0aGlzLl91cmwsICJodHRwOi8vbG9jYWxob3N0L0VjbGlwc2UtQUNURi1TV0YtTG9hZFZhcnMtMTA4MjAxNzMwOTEzMDE4NzQ3Mi50eHQiKSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfbG9hZGVyLmZsYSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9sb2FkZXIuZmxhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGI3NTI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvYm9vdF9sb2FkZXIuZmxhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9ib290X2xvYWRlci5zd2YgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfbG9hZGVyLnN3ZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljOTZmYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2Jvb3RfbG9hZGVyLnN3ZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9BU1NlcmlhbGl6ZXIuYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfQVNTZXJpYWxpemVyLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTQ2ZDUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9BU1NlcmlhbGl6ZXIuYXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGluIFNBSVRPLCBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKiAKLSAqIEFTIFNlcmlhbGl6ZXIvRGVzZXJpYWxpemF0aW9uIGxpYnJhcnkKLSovCi1jbGFzcyBFY2xpcHNlX0FDVEZfQVNTZXJpYWxpemVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyB2YXIgaWdub3JlUHJvcGVydGllc1dpdGhVbmRlclNjb3JlczpCb29sZWFuID0gdHJ1ZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2VyaWFsaXplKG86T2JqZWN0KTpTdHJpbmcgewotICAgICAgICBmdW5jdGlvbiBzZXJpYWxpemVBcnJheShvOiBBcnJheSkgewotCSAgICB2YXIgcmV0OlN0cmluZyA9ICJbIjsKLQkgICAgZm9yKHZhciBpID0gMDsgaSA8IG8ubGVuZ3RoOyBpKyspewotCQlyZXQgKz0gc2VyaWFsaXplSW50ZXJuYWwob1tpXSk7Ci0gICAgICAgICAgICAgICAgcmV0ICs9ICIsIjsKLQkgICAgfQotICAgICAgICAgICAgaWYgKHJldC5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gcmV0LnN1YnN0cmluZygwLCByZXQubGVuZ3RoIC0gMSk7Ci0gICAgICAgICAgICB9Ci0JICAgIHJldCArPSAiXSI7Ci0JICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBmdW5jdGlvbiBzZXJpYWxpemVTdHJpbmcobzogU3RyaW5nKSB7Ci0JICAgIHZhciByZXN0OlN0cmluZyA9IF9nbG9iYWwuZW5jb2RlU3RyaW5nRm9yQnJpZGdlKG8pOwotCSAgICB2YXIgcmV0OlN0cmluZyA9ICciJzsKLQkgICAgdmFyIGluZGV4OwotCSAgICB3aGlsZSAoKGluZGV4ID0gcmVzdC5pbmRleE9mKCciJykpID49IDApIHsKLQkJcmV0ICs9IHJlc3Quc3Vic3RyaW5nKDAsaW5kZXgpOwotCQlyZXQgKz0gIlxcXCIiOwotCQlyZXN0ID0gcmVzdC5zdWJzdHIoaW5kZXggKyAxKTsKLQkgICAgfQotCSAgICByZXQrPXJlc3QgKyAnIic7Ci0JICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBmdW5jdGlvbiBzZXJpYWxpemVPYmplY3QobzogT2JqZWN0KSB7Ci0JICAgIHZhciByZXQ6U3RyaW5nID0gJ3snOwotCSAgICBmb3IgKHZhciBwcm9wIGluIG8pewotICAgICAgICAgICAgICAgIGlmIChvW3Byb3BdICE9IG51bGwgJiYgb1twcm9wXSAhPSB1bmRlZmluZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVQcm9wZXJ0aWVzV2l0aFVuZGVyU2NvcmVzIHx8IHByb3Auc3Vic3RyKDAsMikgIT0gJ19fJykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNlcmlhbGl6ZVN0cmluZyhwcm9wKSArICI6IiA7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2VyaWFsaXplSW50ZXJuYWwob1twcm9wXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gIiwiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCSAgICB9Ci0gICAgICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgICAgICByZXQgPSByZXQuc3Vic3RyaW5nKDAsIHJldC5sZW5ndGggLSAxKTsKLSAgICAgICAgICAgIH0KLQkgICAgcmV0ICs9ICJ9IjsKLQkgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1bmN0aW9uIHNlcmlhbGl6ZUludGVybmFsKG86IE9iamVjdCkgewotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBcnJheSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVBcnJheShvKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZihvKSkgewotCSAgICBjYXNlICJ1bmRlZmluZWQiOgotCQlyZXR1cm4gIm51bGwiOwotICAgICAgICAgICAgY2FzZSAic3RyaW5nIjoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplU3RyaW5nKG8pOwotICAgICAgICAgICAgY2FzZSAib2JqZWN0IjoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplT2JqZWN0KG8pOwotCSAgICBjYXNlICJtb3ZpZWNsaXAiOgotCQlyZXR1cm4gIm51bGwiOwotCSAgICBjYXNlICJmdW5jdGlvbiI6Ci0JCXJldHVybiAibnVsbCI7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcobyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZUludGVybmFsKG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVzZXJpYWxpemUoc3RyOlN0cmluZyk6T2JqZWN0IHsKLSAgICAgICAgdmFyIGlkeDpOdW1iZXIgPSAwOwotICAgICAgICB2YXIgb2JqOk9iamVjdCA9IHVuZGVmaW5lZDsKLSAgICAgICAgdmFyIGM6U3RyaW5nID0gc3RyLmNoYXJBdChpZHgpOwotCi0gICAgICAgIGZ1bmN0aW9uIHNraXBTUCgpOkJvb2xlYW4gewotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIGMgPSBzdHIuY2hhckF0KGlkeCk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnICc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICAgICAgICAgIGlkeCsrOwotCQkgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgY2FzZSB1bmRlZmluZWQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmdW5jdGlvbiB0b2tlbkVuZCgpOkJvb2xlYW4gewotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIGMgPSBzdHIuY2hhckF0KGlkeCk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnICc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnLCc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnOic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnXSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnfSc6Ci0gICAgICAgICAgICAgICAgY2FzZSB1bmRlZmluZWQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZHgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZ1bmN0aW9uIGRlc2VyaWFsaXplQXJyYXkoKSB7Ci0JICAgIC8vIHRyYWNlKCJkQSIpOwotCSAgICBpZHgrKzsKLSAgICAgICAgICAgIHZhciByZXQ6QXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICBza2lwU1AoKTsKLSAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXScpIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqID0gcmV0OwotCQkgICAgaWR4Kys7Ci0JCSAgICAvLyB0cmFjZSgiZEEtZXhpdDogIiArIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZGVzZXJpYWxpemVJbnRlcm5hbCgpKSB7Ci0JCSAgICAvLyB0cmFjZSgiZEEtaW50ZXJuYWw6ICIrb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2gob2JqKTsKLQkJfQotICAgICAgICAgICAgICAgIHNraXBTUCgpOwotICAgICAgICAgICAgICAgIGlmIChjID09ICddJykgewotICAgICAgICAgICAgICAgICAgICBvYmogPSByZXQ7Ci0JCSAgICBpZHgrKzsKLQkJICAgIC8vIHRyYWNlKCJkQS1leGl0OiAiICsgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjICE9ICcsJykgcmV0dXJuIGZhbHNlOwotCQlpZHgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZ1bmN0aW9uIGRlc2VyaWFsaXplT2JqZWN0KCkgewotCSAgICBpZHgrKzsKLSAgICAgICAgICAgIHZhciByZXQ6T2JqZWN0ID0gbmV3IE9iamVjdCgpOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIHNraXBTUCgpOwotICAgICAgICAgICAgICAgIGlmIChjID09ICd9JykgewotICAgICAgICAgICAgICAgICAgICBvYmogPSByZXQ7Ci0JCSAgICBpZHgrKzsKLQkJICAgIC8vIHRyYWNlKCJkQS1leGl0OiAiICsgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZXNlcmlhbGl6ZVN0cmluZygpKSB7Ci0JCSAgICB2YXIgcHJvcE5hbWUgPSBvYmo7Ci0JCSAgICAvLyB0cmFjZShwcm9wTmFtZSk7Ci0JCSAgICBza2lwU1AoKTsKLQkJICAgIGlmIChjICE9ICc6JykgcmV0dXJuIGZhbHNlOwotCQkgICAgaWR4Kys7Ci0JCSAgICBza2lwU1AoKTsKLQkJICAgIGlmIChkZXNlcmlhbGl6ZUludGVybmFsKCkpIHsKLQkJCXZhciBwcm9wVmFsOk9iamVjdCA9IG9iajsKLQkJCS8vIHRyYWNlKHByb3BWYWwpOwotCQkJcmV0W3Byb3BOYW1lXSA9IHByb3BWYWw7Ci0JCSAgICB9Ci0JCX0KLSAgICAgICAgICAgICAgICBza2lwU1AoKTsKLSAgICAgICAgICAgICAgICBpZiAoYyA9PSAnfScpIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqID0gcmV0OwotCQkgICAgaWR4Kys7Ci0JCSAgICAvLyB0cmFjZSgiZEEtZXhpdDogIiArIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYyAhPSAnLCcpIHJldHVybiBmYWxzZTsKLQkJaWR4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmdW5jdGlvbiBkZXNlcmlhbGl6ZVN0cmluZygpIHsKLSAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgdmFyIHJldDpTdHJpbmcgPSAiIjsKLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICBjID0gc3RyLmNoYXJBdChpZHgpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgewotICAgICAgICAgICAgICAgIGNhc2UgJyInOgotICAgICAgICAgICAgICAgICAgICBpZHgrKzsKLSAgICAgICAgICAgICAgICAgICAgb2JqID0gcmV0OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgICAgICAgICBjID0gc3RyLmNoYXJBdChpZHgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWMpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICBjYXNlIHVuZGVmaW5lZDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXQgKz0gYzsKLSAgICAgICAgICAgICAgICBpZHgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZ1bmN0aW9uIGRlc2VyaWFsaXplSW50ZXJuYWwoKTpCb29sZWFuIHsKLSAgICAgICAgICAgIGlmICghc2tpcFNQKCkpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICBjYXNlICdbJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVBcnJheSgpOwotICAgICAgICAgICAgY2FzZSAneyc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplT2JqZWN0KCk7Ci0gICAgICAgICAgICBjYXNlICciJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVTdHJpbmcoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdmFyIGlkeFN0Ok51bWJlciA9IGlkeDsKLSAgICAgICAgICAgICAgICBpZiAodG9rZW5FbmQoKSkgewotCQkgICAgdmFyIHN1YnN0ciA9IHN0ci5zdWJzdHJpbmcoaWR4U3QsIGlkeCk7Ci0JCSAgICBpZiAoKCcwJzw9c3Vic3RyLmNoYXJBdCgwKSAmJiBzdWJzdHIuY2hhckF0KDApPD0nOScpCi0JCQl8fCBzdWJzdHIuY2hhckF0KDApPT0nKycgfHwgc3Vic3RyLmNoYXJBdCgwKT09Jy0nKQotCQkJb2JqID0gTnVtYmVyKHN1YnN0cik7Ci0JCSAgICBlbHNlCi0JCQlvYmogPSBldmFsKHN1YnN0cik7Ci0JCSAgICAvLyB0cmFjZShvYmopOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBkZXNlcmlhbGl6ZUludGVybmFsKCk7Ci0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX0FjY0luZm8uYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfQWNjSW5mby5hcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhZjY4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfQWNjSW5mby5hcworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2xhc3MgRWNsaXBzZV9BQ1RGX0FjY0luZm8gewotICAgIHZhciBzaWxlbnQ6Qm9vbGVhbjsKLSAgICB2YXIgZm9yY2VTaW1wbGU6Qm9vbGVhbjsKLSAgICB2YXIgbmFtZTpTdHJpbmc7Ci0gICAgdmFyIGRlc2NyaXB0aW9uOlN0cmluZzsKLSAgICB2YXIgc2hvcnRjdXQ6U3RyaW5nOwotCi0gICAgdmFyIHJvbGU6TnVtYmVyOwotICAgIHZhciBzdGF0ZTpOdW1iZXI7Ci0gICAgdmFyIGRlZmF1bHRBY3Rpb246U3RyaW5nOwotICAgIHZhciBjaGlsZHJlbjpBcnJheTsKLQotICAgIHByaXZhdGUgZnVuY3Rpb24gRWNsaXBzZV9BQ1RGX0FjY0luZm8obzpPYmplY3QpIHsKLSAgICAgICAgaWYgKG8uX2FjY1Byb3BzKSB7Ci0gICAgICAgICAgICB0aGlzLnNpbGVudCA9IG8uX2FjY1Byb3BzLnNpbGVudDsKLSAgICAgICAgICAgIHRoaXMuZm9yY2VTaW1wbGUgPSBvLl9hY2NQcm9wcy5mb3JjZVNpbXBsZTsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG8uX2FjY1Byb3BzLm5hbWU7Ci0gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gby5fYWNjUHJvcHMuZGVzY3JpcHRpb247Ci0gICAgICAgICAgICB0aGlzLnNob3J0Y3V0ID0gby5fYWNjUHJvcHMuc2hvcnRjdXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoby5fYWNjSW1wbCkgewotICAgICAgICAgICAgdmFyIGFpOk9iamVjdCA9IG8uX2FjY0ltcGw7Ci0gICAgICAgICAgICB2YXIgbmFtZUFjY0ltcGw6U3RyaW5nID0gYWkuZ2V0X2FjY05hbWUoMCk7Ci0gICAgICAgICAgICBpZiAobmFtZUFjY0ltcGwpIHRoaXMubmFtZSA9IG5hbWVBY2NJbXBsOwotICAgICAgICAgICAgdGhpcy5yb2xlID0gYWkuZ2V0X2FjY1JvbGUoMCk7Ci0gICAgICAgICAgICB0aGlzLnN0YXRlID0gYWkuZ2V0X2FjY1N0YXRlKDApOwotICAgICAgICAgICAgdGhpcy5kZWZhdWx0QWN0aW9uID0gYWkuZ2V0X2FjY0RlZmF1bHRBY3Rpb24oMCk7Ci0gICAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gYWkuZ2V0Q2hpbGRJZEFycmF5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5ld0FjY0luZm8obzpPYmplY3QpIHsKLSAgICAgICAgaWYgKG8uX2FjY1Byb3BzIHx8IG8uX2FjY0ltcGwpIHJldHVybiBuZXcgRWNsaXBzZV9BQ1RGX0FjY0luZm8obyk7Ci0gICAgICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX0FjY1RhcmdldC5hcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9BY2NUYXJnZXQuYXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZDcxZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX0FjY1RhcmdldC5hcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY2xhc3MgRWNsaXBzZV9BQ1RGX0FjY1RhcmdldCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVwZGF0ZVRhcmdldCh0YXJnZXQ6U3RyaW5nLCBkZXB0aDpOdW1iZXIpOkJvb2xlYW4gewotICAgICAgICB2YXIgb2JqOk9iamVjdCA9IGV2YWwodGFyZ2V0KTsKLSAgICAgICAgdmFyIGxvZzpPYmplY3QgPSBuZXcgT2JqZWN0KCk7Ci0gICAgICAgIHVwZGF0ZUltcGwob2JqLCB0YXJnZXQsIGRlcHRoLCBsb2cpOwotICAgICAgICBBY2Nlc3NpYmlsaXR5LnVwZGF0ZVByb3BlcnRpZXMoKTsKLSAgICAgICAgcmV0dXJuIGxvZy5fRWNsaXBzZV9BQ1RGX3VwZGF0ZWQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHVwZGF0ZUltcGwob2JqOk9iamVjdCwgdGFyZ2V0OlN0cmluZywgZGVwdGg6TnVtYmVyLCBsb2c6T2JqZWN0KSB7Ci0gICAgICAgIGlmIChkZXB0aCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCQlpZiAobG9nW3RhcmdldF0pIHsKLQkJCXJldHVybjsKLQkJfQotICAgICAgICBsb2dbdGFyZ2V0XSA9IHRydWU7Ci0KLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgTW92aWVDbGlwKSAmJiAhKG9iaiBpbnN0YW5jZW9mIEJ1dHRvbikpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHZhciBpc0J1dHRvbjpCb29sZWFuID0gb2JqLm9uUmVsZWFzZSB8fCBvYmoub25QcmVzcyB8fCBvYmogaW5zdGFuY2VvZiBCdXR0b247Ci0KLSAgICAgICAgaWYgKGlzQnV0dG9uKSB7Ci0gICAgICAgICAgICBvYmouX2FjY1Byb3BzID0gb2JqLl9hY2NQcm9wcyB8fCB7fTsKLSAgICAgICAgICAgIG9iai5fYWNjUHJvcHMuc2hvcnRjdXQgPSB0YXJnZXQ7Ci0gICAgICAgICAgICBsb2cuX0VjbGlwc2VfQUNURl91cGRhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBNb3ZpZUNsaXApKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCWZvciAodmFyIGMgaW4gb2JqKSB7Ci0JCQl2YXIgY1RhcmdldDpTdHJpbmcgPSB0YXJnZXQrIi4iK2M7Ci0JCQl2YXIgY286T2JqZWN0ID0gZXZhbChjVGFyZ2V0KTsKLQkJCWNUYXJnZXQgPSB0YXJnZXRQYXRoKGNvKTsKLQkJCWlmICghY28uX3RhcmdldCkgewotCQkJCWNvLl90YXJnZXQgPSBjVGFyZ2V0OwotCQkJfQotCQkJdXBkYXRlSW1wbChjbywgY1RhcmdldCwgZGVwdGggLSAxLCBsb2cpOwotCQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX0F1dG9UcmFuc2xhdG9yLmFzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX0F1dG9UcmFuc2xhdG9yLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWMxYzVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9BdXRvVHJhbnNsYXRvci5hcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2xhc3MgRWNsaXBzZV9BQ1RGX0F1dG9UcmFuc2xhdG9yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc0J1dHRvbihuOkVjbGlwc2VfQUNURl9Ob2RlKTpCb29sZWFuIHsKLSAgICAgICAgaWYgKG4udHlwZSA9PSAib2JqZWN0IiAmJiBuLmNsYXNzTmFtZSA9PSAiQnV0dG9uIikKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAobi50eXBlID09ICJtb3ZpZWNsaXAiICYmIChldmFsKG4udGFyZ2V0KS5vblJlbGVhc2UpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0JCi0gICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNFbXB0eShuOkVjbGlwc2VfQUNURl9Ob2RlKTpCb29sZWFuIHsKLSAgICAgICAgaWYgKG4udGV4dCAmJiBuLnRleHQubGVuZ3RoID4gMCkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobi5hY2NJbmZvICYmIG4uYWNjSW5mby5uYW1lKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChpc0J1dHRvbihuKSkgewotICAgICAgICAgICAgbi50ZXh0ID0gbi50YXJnZXQuc3Vic3RyKG4udGFyZ2V0Lmxhc3RJbmRleE9mKCIuIikgKyAxKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBidWlsZEl0ZW0objpFY2xpcHNlX0FDVEZfTm9kZSwgZGVwdGg6TnVtYmVyKTpBcnJheSB7Ci0gICAgICAgIHZhciByOkFycmF5ID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIGlmIChuLmlzT3BhcXVlT2JqZWN0KSByZXR1cm4gcjsKLSAgICAgICAgaWYgKG4uYWNjSW5mbyAmJiBuLmFjY0luZm8uc2lsZW50KSByZXR1cm4gcjsKLSAgICAgICAgdmFyIGNyOkFycmF5ID0gbi5nZXRDaGlsZE5vZGVzQXJyYXkoKTsKLSAgICAgICAgY3IucmV2ZXJzZSgpOwotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2YXIgYzpFY2xpcHNlX0FDVEZfTm9kZSA9IGNyW2ldOwotCi0gICAgICAgICAgICBpZiAoIShjLnR5cGUgPT0gIm1vdmllY2xpcCIgfHwKLSAgICAgICAgICAgICAgICAgIChjLnR5cGUgPT0gIm9iamVjdCIgJiYgKGMuY2xhc3NOYW1lID09ICJUZXh0RmllbGQiIHx8IGMuY2xhc3NOYW1lID09ICJCdXR0b24iKSkpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCQkJCi0gICAgICAgICAgICBpZiAoaXNFbXB0eShjKSkgewotICAgICAgICAgICAgICAgIGlmICgoZGVwdGggPD0gMCkgJiYgKHIubGVuZ3RoID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgci5wdXNoKGMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHIgPSByLmNvbmNhdChidWlsZEl0ZW0oYywgZGVwdGggLSAxKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByLnB1c2goYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0cmFuc2xhdGUocGF0aDpTdHJpbmcpOkFycmF5IHsKLSAgICAgICAgdmFyIG46RWNsaXBzZV9BQ1RGX05vZGUgPSBFY2xpcHNlX0FDVEZfTm9kZS5nZXROb2RlRnJvbVBhdGgocGF0aCk7Ci0gICAgICAgIGlmICghbikgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBidWlsZEl0ZW0obiwgMSk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfQ29udHJvbGxlci5hcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9Db250cm9sbGVyLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGI2MGE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9Db250cm9sbGVyLmFzCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgU2hpbiBTQUlUTyAtIGFkZGVkIG1ldGhvZCBnZXRTd2ZWZXJzaW9uKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbXBvcnQgZmxhc2guZmlsdGVycy4qOwotCi1jbGFzcyBFY2xpcHNlX0FDVEZfQ29udHJvbGxlciB7Ci0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjYWxsTWV0aG9kKHBhdGg6U3RyaW5nLCBtZXRob2ROYW1lOlN0cmluZywgYXJnczpBcnJheSkgewotICAgICAgICB2YXIgbyA9IGV2YWwocGF0aCk7Ci0gICAgICAgIHZhciBmID0gb1ttZXRob2ROYW1lXTsKLSAgICAgICAgcmV0dXJuIGYuYXBwbHkobywgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjYWxsTWV0aG9kQShwYXRoOlN0cmluZywgbWV0aG9kTmFtZTpTdHJpbmcpIHsKLSAgICAgICAgdmFyIG86T2JqZWN0ID0gZXZhbChwYXRoKTsKLSAgICAgICAgdmFyIGY6RnVuY3Rpb24gPSBvW21ldGhvZE5hbWVdOwotICAgICAgICB2YXIgYTpBcnJheSA9IG5ldyBBcnJheSgpOwotICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYS5wdXNoKGFyZ3VtZW50c1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGYuYXBwbHkobywgYSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQcm9wZXJ0eShwYXRoOlN0cmluZywgcHJvcDpTdHJpbmcpOk9iamVjdCB7Ci0gICAgICAgIHZhciBvOk9iamVjdCA9IGV2YWwocGF0aCk7Ci0gICAgICAgIHJldHVybiBvW3Byb3BdOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0UHJvcGVydHkocGF0aDpTdHJpbmcsIHByb3A6U3RyaW5nLCB2YWx1ZTpPYmplY3QpIHsKLSAgICAgICAgdmFyIG86T2JqZWN0ID0gZXZhbChwYXRoKTsKLSAgICAgICAgb1twcm9wXSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWRkRmlsdGVyKHBhdGg6U3RyaW5nKSB7Ci0gICAgICAgIHZhciBvID0gZXZhbChwYXRoKTsKLSAgICAgICAgdmFyIGJmaWx0ZXI6Qmx1ckZpbHRlciA9IG5ldyBCbHVyRmlsdGVyKDQsIDQsIDIpOwotICAgICAgICBvLmZpbHRlcnMgPSBbYmZpbHRlcl07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZW1vdmVGaWx0ZXIocGF0aDpTdHJpbmcpIHsKLSAgICAgICAgdmFyIG8gPSBldmFsKHBhdGgpOwotICAgICAgICBvLmZpbHRlcnMgPSBbXTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTd2ZWZXJzaW9uKCkgewotICAgICAgcmV0dXJuIDg7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX0luaXQuYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfSW5pdC5hcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiZDAwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfSW5pdC5hcworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBTaGluIFNBSVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWltcG9ydCBmbGFzaC5leHRlcm5hbC5FeHRlcm5hbEludGVyZmFjZTsKLQotY2xhc3MgRWNsaXBzZV9BQ1RGX0luaXQgewotICBwdWJsaWMgc3RhdGljIHZhciBkZWJ1ZzpCb29sZWFuID0gZmFsc2U7Ci0gIHByaXZhdGUgc3RhdGljIHZhciBkZWJ1Z1RleHRGaWVsZDsKLQotICBwdWJsaWMgc3RhdGljIHZhciBjYWxsYmFja3MgPSB7Ci0gICAgZ2V0Um9vdE5vZGUgOiBFY2xpcHNlX0FDVEZfTm9kZS5nZXRSb290Tm9kZSwKLSAgICBnZXROb2RlRnJvbVBhdGggOiBFY2xpcHNlX0FDVEZfTm9kZS5nZXROb2RlRnJvbVBhdGgsCi0KLSAgICBnZXROdW1TdWNjZXNzb3JOb2RlcyA6IEVjbGlwc2VfQUNURl9Ob2RlLmdldE51bVN1Y2Nlc3Nvck5vZGVzLAotICAgIGdldFN1Y2Nlc3Nvck5vZGVzIDogRWNsaXBzZV9BQ1RGX05vZGUuZ2V0U3VjY2Vzc29yTm9kZXMsCi0KLSAgICBnZXROdW1DaGlsZE5vZGVzIDogRWNsaXBzZV9BQ1RGX05vZGUuZ2V0TnVtQ2hpbGROb2RlcywKLSAgICBnZXRDaGlsZE5vZGVzIDogRWNsaXBzZV9BQ1RGX05vZGUuZ2V0Q2hpbGROb2RlcywKLQotICAgIGdldE5vZGVBdERlcHRoIDogRWNsaXBzZV9BQ1RGX05vZGUuZ2V0Tm9kZUF0RGVwdGgsCi0gICAgZ2V0SW5uZXJOb2RlcyA6IEVjbGlwc2VfQUNURl9Ob2RlLmdldElubmVyTm9kZXMsCi0gICAgc2V0Rm9jdXMgOiBFY2xpcHNlX0FDVEZfTm9kZS5zZXRGb2N1cywKLQotICAgIGNhbGxNZXRob2QgOiBFY2xpcHNlX0FDVEZfQ29udHJvbGxlci5jYWxsTWV0aG9kLAotICAgIGNhbGxNZXRob2RBIDogRWNsaXBzZV9BQ1RGX0NvbnRyb2xsZXIuY2FsbE1ldGhvZEEsCi0gICAgZ2V0UHJvcGVydHkgOiBFY2xpcHNlX0FDVEZfQ29udHJvbGxlci5nZXRQcm9wZXJ0eSwKLSAgICBzZXRQcm9wZXJ0eSA6IEVjbGlwc2VfQUNURl9Db250cm9sbGVyLnNldFByb3BlcnR5LAotICAgIGFkZEZpbHRlciA6ICBFY2xpcHNlX0FDVEZfQ29udHJvbGxlci5hZGRGaWx0ZXIsCi0gICAgcmVtb3ZlRmlsdGVyIDogRWNsaXBzZV9BQ1RGX0NvbnRyb2xsZXIucmVtb3ZlRmlsdGVyLAotICAgIGdldFN3ZlZlcnNpb24gOiBFY2xpcHNlX0FDVEZfQ29udHJvbGxlci5nZXRTd2ZWZXJzaW9uLAotCi0gICAgc2VhcmNoVmlkZW8gOiBFY2xpcHNlX0FDVEZfTWVkaWEuc2VhcmNoVmlkZW8sCi0gICAgc2VhcmNoU291bmQgOiBFY2xpcHNlX0FDVEZfTWVkaWEuc2VhcmNoU291bmQsCi0KLSAgICB3YXRjaEluaXQgOiAgRWNsaXBzZV9BQ1RGX1dhdGNoLndhdGNoSW5pdCwKLSAgICB3YXRjaE9iamVjdCA6IEVjbGlwc2VfQUNURl9XYXRjaC53YXRjaE9iamVjdCwKLSAgICByZW1vdmVXYXRjaExpc3QgOiBFY2xpcHNlX0FDVEZfV2F0Y2gucmVtb3ZlV2F0Y2hMaXN0LAotCi0gICAgbmV3TWFya2VyIDogRWNsaXBzZV9BQ1RGX01hcmtlci5uZXdNYXJrZXIsCi0gICAgc2V0TWFya2VyIDogIEVjbGlwc2VfQUNURl9NYXJrZXIuc2V0TWFya2VyLAotICAgIHVuc2V0TWFya2VyIDogRWNsaXBzZV9BQ1RGX01hcmtlci51bnNldE1hcmtlciwKLSAgICBzaG93QWxsTWFya2VycyA6IEVjbGlwc2VfQUNURl9NYXJrZXIuc2hvd0FsbE1hcmtlcnMsCi0gICAgY2xlYXJBbGxNYXJrZXJzIDogRWNsaXBzZV9BQ1RGX01hcmtlci5jbGVhckFsbE1hcmtlcnMsCi0KLSAgICBnZXRTY2FsZU1vZGUgOiBFY2xpcHNlX0FDVEZfU3RhZ2VQcm94eS5nZXRTY2FsZU1vZGUsCi0gICAgc2V0U2NhbGVNb2RlIDogRWNsaXBzZV9BQ1RGX1N0YWdlUHJveHkuc2V0U2NhbGVNb2RlLAotICAgIGdldFN0YWdlV2lkdGggOiBFY2xpcHNlX0FDVEZfU3RhZ2VQcm94eS5nZXRTdGFnZVdpZHRoLAotICAgIGdldFN0YWdlSGVpZ2h0IDogRWNsaXBzZV9BQ1RGX1N0YWdlUHJveHkuZ2V0U3RhZ2VIZWlnaHQsCi0gICAgZ2V0U3RhZ2VBbGlnbiA6IEVjbGlwc2VfQUNURl9TdGFnZVByb3h5LmdldFN0YWdlQWxpZ24sCi0KLSAgICB0cmFuc2xhdGUgOiBFY2xpcHNlX0FDVEZfQXV0b1RyYW5zbGF0b3IudHJhbnNsYXRlLAotCQkKLSAgICAvL3JlcGFpckZsYXNoIDogRWNsaXBzZV9BQ1RGX0FjY1JlcGFpci5yZXBhaXJGbGFzaCwKLQotICAgIHVwZGF0ZVRhcmdldCA6IEVjbGlwc2VfQUNURl9BY2NUYXJnZXQudXBkYXRlVGFyZ2V0Ci0gIH07Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gc2VhcmNoQWNjSW50ZXJuYWwobzpPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDpTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlZDpPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI6QXJyYXkpIHsKLSAgICBpZiAodHJhdmVyc2VkW3RhcmdldF0pIHJldHVybjsKLSAgICB0cmF2ZXJzZWRbdGFyZ2V0XSA9IHRydWU7Ci0gICAgZm9yICh2YXIgYyBpbiBvKSB7Ci0gICAgICBpZiAoYyA9PSAiX2FjY1Byb3BzIikgewotICAgICAgICBkZWJ1Z1RleHRGaWVsZC50ZXh0ICs9ICIgQUNDUFJPUFMhIjsKLSAgICAgICAgLy8gQWxlcnQuc2hvdygiTGF1bmNoIFN0b2NrIEFwcGxpY2F0aW9uPyIsICJTdG9jayBQcmljZSBBbGVydCIsIEFsZXJ0Lk9LIHwgQWxlcnQuQ0FOQ0VMLCB0aGlzLCBteUNsaWNrSGFuZGxlciwgInN0b2NrSWNvbiIsIEFsZXJ0Lk9LKQotICAgICAgfQotICAgICAgaWYgKGMgPT0gIl9hY2NJbXBsIikgewotICAgICAgICBkZWJ1Z1RleHRGaWVsZC50ZXh0ICs9ICIgQUNDSU1QTCEiOwotICAgICAgfQotICAgICAgdmFyIGNUYXJnZXQ6U3RyaW5nID0gdGFyZ2V0ICsgIi4iICsgYzsKLSAgICAgIHZhciBjbzpPYmplY3QgPSBldmFsKGNUYXJnZXQpOwotICAgICAgaWYgKGNvLl90YXJnZXQpIHsKLSAgICAgICAgY1RhcmdldCA9IEVjbGlwc2VfQUNURl9Ob2RlLm5vcm1hbGl6ZVRhcmdldE5hbWUoY28uX3RhcmdldCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjby5fdGFyZ2V0ID0gY1RhcmdldDsKLSAgICAgIH0KLSAgICAgIC8vIEV4dGVybmFsSW50ZXJmYWNlLmNhbGwoImFsZXJ0IiwgY1RhcmdldCk7Ci0gICAgICBzZWFyY2hBY2NJbnRlcm5hbChjbywgY1RhcmdldCwgdHJhdmVyc2VkLCByKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlYXJjaEFjYyhwYXRoOlN0cmluZykgewotICAgIHZhciBvOk9iamVjdCA9IGV2YWwocGF0aCk7Ci0gICAgdmFyIHRyYXZlcnNlZDpPYmplY3QgPSBuZXcgT2JqZWN0KCk7Ci0gICAgdmFyIHI6QXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgICBzZWFyY2hBY2NJbnRlcm5hbChvLCBwYXRoLCB0cmF2ZXJzZWQsIHIpOwotICB9Ci0gICAgCi0gIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGFkZENhbGxiYWNrKG5hbWU6U3RyaW5nLCBmdW5jOkZ1bmN0aW9uKSB7Ci0gICAgdmFyIHJlc3VsdDpCb29sZWFuID0gRXh0ZXJuYWxJbnRlcmZhY2UuYWRkQ2FsbGJhY2sobmFtZSwgbnVsbCwgZnVuYyk7Ci0gICAgaWYgKGRlYnVnKSB7Ci0gICAgICAvLyBkZWJ1Z1RleHRGaWVsZC50ZXh0ICs9ICIgIiArIG5hbWUgKyAiICIgKyByZXN1bHQgKyAiOyAiOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbml0aWFsaXplKCkgewotICAgIC8vIHRyYWNlKCJFY2xpcHNlX0FDVEZfSW5pdC5pbml0aWFsaXplKCkiKTsKLQotICAgIC8vIHZhciBFY2xpcHNlX0FDVEZfaXNfYXZhaWxhYmxlOkJvb2xlYW4gPSBFeHRlcm5hbEludGVyZmFjZS5hdmFpbGFibGU7Ci0gICAgaWYgKGRlYnVnKSB7Ci0gICAgICB2YXIgbHYwT2JqID0gZXZhbCgiX2xldmVsMCIpOyAKLSAgICAgIGRlYnVnVGV4dEZpZWxkID0gbHYwT2JqLmNyZWF0ZVRleHRGaWVsZCgiZGVidWdUZXh0IiwgMSwgMCwgMCwgMTAsIDEwKTsKLSAgICAgIGRlYnVnVGV4dEZpZWxkLl93aWR0aCA9IGx2ME9iai5fd2lkdGg7Ci0gICAgICBkZWJ1Z1RleHRGaWVsZC5faGVpZ2h0ID0gbHYwT2JqLl9oZWlnaHQ7Ci0gICAgICBzZWFyY2hBY2MoIl9sZXZlbDAiKTsKLSAgICAgIHNlYXJjaEFjYygiX2xldmVsMSIpOwotICAgICAgZGVidWdUZXh0RmllbGQudGV4dCArPSAiIERPTkUhISEhIjsKLSAgICAgIC8vRXh0ZXJuYWxJbnRlcmZhY2UuY2FsbCgiYWxlcnQiLCAic3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkIGluaXQuIEFTIik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgIGZvciAodmFyIGggaW4gY2FsbGJhY2tzKSB7Ci0gICAgICB2YXIgcmVzID0gYWRkQ2FsbGJhY2soaCwgY2FsbGJhY2tzW2hdKTsKLSAgICAgIF9sZXZlbDAuRWNsaXBzZV9BQ1RGX3JlZ19yZXN1bHRzLnB1c2gocmVzKTsKLSAgICAgIGlmICghcmVzKSBicmVhazsKLSAgICAgIH0KLSAgICAqLwotICAgIC8vIHRyYWNlKCJFY2xpcHNlX0FDVEZfSW5pdC5pbml0aWFsaXplKCkgZG9uZS4iKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfTWFya2VyLmFzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX01hcmtlci5hcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU5NGU2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfTWFya2VyLmFzCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbXBvcnQgZmxhc2guZXh0ZXJuYWwuRXh0ZXJuYWxJbnRlcmZhY2U7Ci0KLWNsYXNzIEVjbGlwc2VfQUNURl9NYXJrZXIgewotICAgIHByaXZhdGUgc3RhdGljIHZhciBtYXJrZXJzID0gbmV3IEFycmF5KCk7Ci0gICAgdmFyIG1vdmllQ2xpcDpNb3ZpZUNsaXA7Ci0gICAgdmFyIGlkeDpOdW1iZXI7Ci0gICAgdmFyIHgsIHksIHcsIGg6TnVtYmVyOwotICAgIHZhciB0eHQ6VGV4dEZpZWxkOwotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBuZXh0TWFya2VySWR4KCkgewotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghbWFya2Vyc1tpXSkgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcmtlcnMubGVuZ3RoOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gRWNsaXBzZV9BQ1RGX01hcmtlcihpZHg6TnVtYmVyKSB7Ci0gICAgICAgIHZhciBiYXNlTUM6TW92aWVDbGlwID0gZXZhbCgiX2xldmVsMCIpOwotICAgICAgICB0aGlzLmlkeCA9IHRoaXMubmV4dE1hcmtlcklkeCgpOwotICAgICAgICB2YXIgbmV4dERlcHRoOk51bWJlciA9IGJhc2VNQy5nZXROZXh0SGlnaGVzdERlcHRoKCk7Ci0gICAgICAgIC8vIEZvciBBUyB2ZXJzaW9uIDIgY29tcG9uZW50Ci0gICAgICAgIGlmIChuZXh0RGVwdGggPj0gMTA0ODY3NikgewotICAgICAgICAgICAgbmV4dERlcHRoIC09IDEwMDAgKyB0aGlzLmlkeDsKLSAgICAgICAgfQotICAgICAgICB0aGlzLm1vdmllQ2xpcCA9IGJhc2VNQy5jcmVhdGVFbXB0eU1vdmllQ2xpcCgiX19FY2xpcHNlX0FDVEZfbWFya2VyLSIgKyB0aGlzLmlkeCwgbmV4dERlcHRoKTsKLSAgICAgICAgbWFya2Vyc1t0aGlzLmlkeF0gPSB0aGlzOwotICAgICAgICB0aGlzLm1vdmllQ2xpcC5fYWxwaGEgPSAxMDA7Ci0gICAgICAgIHRoaXMubW92aWVDbGlwLl92aXNpYmxlID0gZmFsc2U7Ci0KLSAgICAgICAgdGhpcy50eHQgPSB0aGlzLm1vdmllQ2xpcC5jcmVhdGVUZXh0RmllbGQoInR4dCIsIDEsIDAsIDAsIDEwLCAxMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBzZXRUZXh0KHRleHQ6U3RyaW5nKSB7Ci0gICAgICAgIHZhciBkcHAgPSA0LjAgKiA5NiAvIDcyOwotICAgICAgICB2YXIgaCA9IHRoaXMuaCAvIDI7Ci0gICAgICAgIHRoaXMudHh0Ll94ID0gMDsKLSAgICAgICAgdGhpcy50eHQuX3kgPSAwOwotICAgICAgICB0aGlzLnR4dC5fd2lkdGggPSB0aGlzLnc7Ci0gICAgICAgIHRoaXMudHh0Ll9oZWlnaHQgPSBoOwotICAgICAgICB0aGlzLnR4dC5tdWx0aWxpbmUgPSB0cnVlOwotICAgICAgICB0aGlzLnR4dC5hdXRvU2l6ZSA9ICJyaWdodCI7Ci0gICAgICAgIHZhciBmbXQ6VGV4dEZvcm1hdCA9IG5ldyBUZXh0Rm9ybWF0KCk7Ci0gICAgICAgIGZtdC5mb250ID0gIlRpbWVzIE5ldyBSb21hbiI7Ci0gICAgICAgIHZhciBzaXplID0gaCAvIGRwcCArIDc7Ci0gICAgICAgIGlmIChzaXplID4gMjApIHNpemUgPSAyMDsKLSAgICAgICAgZm10LnNpemUgPSBzaXplOwotICAgICAgICBmbXQuY29sb3IgPSAweDAwMTBGRjsKLSAgICAgICAgdGhpcy50eHQudGV4dCA9IHRleHQ7Ci0gICAgICAgIHRoaXMudHh0LnNldFRleHRGb3JtYXQoMCwgdGV4dC5sZW5ndGgsIGZtdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0TWFya2VyKGlkeDpOdW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIG1hcmtlcnNbaWR4XTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHNldCh4Ok51bWJlciwgeTpOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdzpOdW1iZXIsIGg6TnVtYmVyKSB7Ci0gICAgICAgIHZhciBsdyA9IDQ7Ci0gICAgICAgIHRoaXMueCA9IHg7Ci0gICAgICAgIHRoaXMueSA9IHk7Ci0gICAgICAgIHRoaXMudyA9IHc7Ci0gICAgICAgIHRoaXMuaCA9IGg7Ci0gICAgICAgIHRoaXMubW92aWVDbGlwLmNsZWFyKCk7Ci0gICAgICAgIHRoaXMubW92aWVDbGlwLl94ID0geDsKLSAgICAgICAgdGhpcy5tb3ZpZUNsaXAuX3kgPSB5OwotICAgICAgICB0aGlzLm1vdmllQ2xpcC5fdyA9IHc7Ci0gICAgICAgIHRoaXMubW92aWVDbGlwLl9oID0gaDsKLSAgICAgICAgdGhpcy5tb3ZpZUNsaXAubGluZVN0eWxlKGx3LCAweDAwRkYwMCwgMTAwKTsKLSAgICAgICAgdGhpcy5tb3ZpZUNsaXAubW92ZVRvKDAsIDApOwotICAgICAgICB0aGlzLm1vdmllQ2xpcC5saW5lVG8odywgMCk7Ci0gICAgICAgIHRoaXMubW92aWVDbGlwLmxpbmVUbyh3LCBoKTsKLSAgICAgICAgdGhpcy5tb3ZpZUNsaXAubGluZVRvKDAsIGgpOwotICAgICAgICB0aGlzLm1vdmllQ2xpcC5saW5lVG8oMCwgMCk7Ci0gICAgICAgIHRoaXMubW92aWVDbGlwLl92aXNpYmxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHVuc2V0KHg6TnVtYmVyLCB5Ok51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB3Ok51bWJlciwgaDpOdW1iZXIpIHsKLSAgICAgICAgdGhpcy5tb3ZpZUNsaXAuX3Zpc2libGUgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldE1hcmtlcihpZHg6TnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6TnVtYmVyLCB5Ok51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Ok51bWJlciwgaDpOdW1iZXIpIHsKLSAgICAgICAgdmFyIG1rOkVjbGlwc2VfQUNURl9NYXJrZXIgPSBFY2xpcHNlX0FDVEZfTWFya2VyLmdldE1hcmtlcihpZHgpOwotICAgICAgICBtay5zZXQoeCwgeSwgdywgaCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1bnNldE1hcmtlcihpZHg6TnVtYmVyKSB7Ci0gICAgICAgIHZhciBtazpFY2xpcHNlX0FDVEZfTWFya2VyID0gRWNsaXBzZV9BQ1RGX01hcmtlci5nZXRNYXJrZXIoaWR4KTsKLSAgICAgICAgbWsudW5zZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5ld01hcmtlcigpOk51bWJlciB7Ci0gICAgICAgIHZhciBtazpFY2xpcHNlX0FDVEZfTWFya2VyID0gbmV3IEVjbGlwc2VfQUNURl9NYXJrZXIoKTsKLSAgICAgICAgcmV0dXJuIG1rLmlkeDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2YXIgYnVpbHRNYXJrZXJzOkFycmF5ID0gbmV3IEFycmF5KCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBzaG93TWFya2VycyhhOkFycmF5KSB7Ci0gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdmFyIG1rOkVjbGlwc2VfQUNURl9NYXJrZXIgPSBuZXcgRWNsaXBzZV9BQ1RGX01hcmtlcigpOwotICAgICAgICAgICAgYnVpbHRNYXJrZXJzLnB1c2gobWsuaWR4KTsKLSAgICAgICAgICAgIHZhciBjOkVjbGlwc2VfQUNURl9Ob2RlID0gYVtpXTsKLSAgICAgICAgICAgIG1rLnNldChjLngsIGMueSwgYy53LCBjLmgpOwotICAgICAgICAgICAgbWsuc2V0VGV4dChjLnRhcmdldCArICJ8IiArIGMuY3VycmVudEZyYW1lKTsKLSAgICAgICAgICAgIHZhciBhMjpBcnJheSA9IEVjbGlwc2VfQUNURl9Ob2RlLmdldElubmVyTm9kZXMoYy50YXJnZXQpOwotICAgICAgICAgICAgRWNsaXBzZV9BQ1RGX01hcmtlci5zaG93TWFya2VycyhhMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNob3dBbGxNYXJrZXJzKHBhdGg6U3RyaW5nKSB7Ci0gICAgICAgIHZhciBhOkFycmF5ID0gRWNsaXBzZV9BQ1RGX05vZGUuZ2V0SW5uZXJOb2RlcyhwYXRoKTsKLSAgICAgICAgRWNsaXBzZV9BQ1RGX01hcmtlci5zaG93TWFya2VycyhhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlbW92ZSgpIHsKLSAgICAgICAgdGhpcy5tb3ZpZUNsaXAuY2xlYXIoKTsKLSAgICAgICAgdGhpcy50eHQudGV4dCA9ICIiOwotICAgICAgICB0aGlzLm1vdmllQ2xpcC5yZW1vdmVNb3ZpZUNsaXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsZWFyQWxsTWFya2VycygpIHsKLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWlsdE1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHZhciBqID0gYnVpbHRNYXJrZXJzW2ldOwotICAgICAgICAgICAgbWFya2Vyc1tqXS5yZW1vdmUoKTsKLSAgICAgICAgICAgIG1hcmtlcnNbal0gPSB1bmRlZmluZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9NZWRpYS5hcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9NZWRpYS5hcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1NmQ5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfTWVkaWEuYXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBmbGFzaC5leHRlcm5hbC5FeHRlcm5hbEludGVyZmFjZTsKLQotY2xhc3MgRWNsaXBzZV9BQ1RGX01lZGlhIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBhZGRPYmplY3QobzpPYmplY3QsIHRhcmdldDpTdHJpbmcsIGE6QXJyYXkpIHsKLSAgICAgICAgdmFyIGxlbjpOdW1iZXIgPSBhLmxlbmd0aDsKLSAgICAgICAgZm9yICh2YXIgaTpOdW1iZXIgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgIHZhciBvMjpPYmplY3QgPSBldmFsKGFbaV0udGFyZ2V0KTsKLSAgICAgICAgICAgIGlmIChvID09PSBvMikgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGEucHVzaChuZXcgRWNsaXBzZV9BQ1RGX05vZGUobnVsbCwgdGFyZ2V0KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gc2VhcmNoVmlkZW9JbnRlcm5hbChvOk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDpTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZWQ6T2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjpBcnJheSkgewotICAgICAgICBpZiAodHJhdmVyc2VkW3RhcmdldF0pIHJldHVybjsKLSAgICAgICAgdHJhdmVyc2VkW3RhcmdldF0gPSB0cnVlOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE5ldFN0cmVhbSkgewotICAgICAgICAgICAgYWRkT2JqZWN0KG8sIHRhcmdldCwgcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBlbHNlIGlmIChvIGluc3RhbmNlb2YgWE1MTm9kZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmlzSW5DbGFzcyhvLCBteC5jb3JlLlVJT2JqZWN0KSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSovCi0gICAgICAgIGZvciAodmFyIGMgaW4gbykgewotICAgICAgICAgICAgdmFyIGNvOk9iamVjdCA9IG9bY107Ci0gICAgICAgICAgICB2YXIgY1RhcmdldDpTdHJpbmcgPSB0YXJnZXQgKyAiLiIgKyBjOwotICAgICAgICAgICAgaWYgKGNvLl90YXJnZXQpIHsKLSAgICAgICAgICAgICAgICBjVGFyZ2V0ID0gRWNsaXBzZV9BQ1RGX05vZGUubm9ybWFsaXplVGFyZ2V0TmFtZShjby5fdGFyZ2V0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY28uX3RhcmdldCA9IGNUYXJnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZWFyY2hWaWRlb0ludGVybmFsKGNvLCBjVGFyZ2V0LCB0cmF2ZXJzZWQsIHIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZWFyY2hWaWRlbygpOkFycmF5IHsKLSAgICAgICAgLyoKLSAgICAgICAgdmFyIHRyYXZlcnNlZDpPYmplY3QgPSBuZXcgT2JqZWN0KCk7Ci0gICAgICAgIHZhciByOkFycmF5ID0gbmV3IEFycmF5KCk7Ci0KLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHZhciBwYXRoOlN0cmluZyA9IGFyZ3VtZW50c1tpXTsKLSAgICAgICAgICAgIHZhciBvOk9iamVjdCA9IGV2YWwocGF0aCk7Ci0gICAgICAgICAgICBzZWFyY2hWaWRlb0ludGVybmFsKG8sIHBhdGgsIHRyYXZlcnNlZCwgcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgICovCi0gICAgICAgIHZhciByOkFycmF5ID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIHZhciBzdHJlYW1zOkFycmF5ID0gX2dsb2JhbC5FY2xpcHNlX0FDVEZfVmlkZW8uc3RyZWFtczsKLSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJlYW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2YXIgc2xvdDpPYmplY3QgPSBzdHJlYW1zW2ldOwotICAgICAgICAgICAgYWRkT2JqZWN0KHNsb3QsICJfZ2xvYmFsLkVjbGlwc2VfQUNURl9WaWRlby5zdHJlYW1zLiIgKyBpLCByKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBzZWFyY2hTb3VuZEludGVybmFsKG86T2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OlN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlZDpPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByOkFycmF5KSB7Ci0gICAgICAgIGlmICh0cmF2ZXJzZWRbdGFyZ2V0XSkgcmV0dXJuOwotICAgICAgICB0cmF2ZXJzZWRbdGFyZ2V0XSA9IHRydWU7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgU291bmQpIHsKLSAgICAgICAgICAgIGFkZE9iamVjdChvLCB0YXJnZXQsIHIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAodmFyIGMgaW4gbykgewotICAgICAgICAgICAgdmFyIGNUYXJnZXQ6U3RyaW5nID0gdGFyZ2V0ICsgIi4iICsgYzsKLSAgICAgICAgICAgIHZhciBjbzpPYmplY3QgPSBldmFsKGNUYXJnZXQpOwotICAgICAgICAgICAgaWYgKGNvLl90YXJnZXQpIHsKLSAgICAgICAgICAgICAgICBjVGFyZ2V0ID0gRWNsaXBzZV9BQ1RGX05vZGUubm9ybWFsaXplVGFyZ2V0TmFtZShjby5fdGFyZ2V0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY28uX3RhcmdldCA9IGNUYXJnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBFeHRlcm5hbEludGVyZmFjZS5jYWxsKCJhbGVydCIsIGNUYXJnZXQpOwotICAgICAgICAgICAgc2VhcmNoU291bmRJbnRlcm5hbChjbywgY1RhcmdldCwgdHJhdmVyc2VkLCByKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2VhcmNoU291bmQocGF0aDpTdHJpbmcpOkFycmF5IHsKLSAgICAgICAgLyogdmFyIG86T2JqZWN0ID0gZXZhbChwYXRoKTsKLSAgICAgICAgdmFyIHRyYXZlcnNlZDpPYmplY3QgPSBuZXcgT2JqZWN0KCk7Ci0gICAgICAgIHZhciByOkFycmF5ID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIHNlYXJjaFNvdW5kSW50ZXJuYWwobywgcGF0aCwgdHJhdmVyc2VkLCByKTsKLSAgICAgICAgcmV0dXJuIHI7ICovCi0gICAgICAgIGlmICghX2dsb2JhbC5FY2xpcHNlX0FDVEZfRkxBU0hCcmlkZ2VHbG9iYWxTb3VuZCkgewotICAgICAgICAgICAgX2dsb2JhbC5FY2xpcHNlX0FDVEZfRkxBU0hCcmlkZ2VHbG9iYWxTb3VuZCA9IG5ldyBTb3VuZCgpOwotICAgICAgICB9Ci0gICAgICAgIHZhciByOkFycmF5ID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIHIucHVzaChuZXcgRWNsaXBzZV9BQ1RGX05vZGUobnVsbCwgIl9nbG9iYWwuRWNsaXBzZV9BQ1RGX0ZMQVNIQnJpZGdlR2xvYmFsU291bmQiKSk7Ci0gICAgICAgIHJldHVybiByOwotICAgIH0KLSAgICAvKgotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Vm9sdW1lKHBhdGg6U3RyaW5nKTpOdW1iZXIgewotICAgICAgICB2YXIgczpTb3VuZCA9IGV2YWwocGF0aCk7Ci0gICAgICAgIHJldHVybiBzLmdldFZvbHVtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0Vm9sdW1lKHBhdGg6U3RyaW5nLCB2YWw6TnVtYmVyKSB7Ci0gICAgICAgIHZhciBzOlNvdW5kID0gZXZhbChwYXRoKTsKLSAgICAgICAgcy5zZXRWb2x1bWUodmFsKTsKLSAgICB9Ci0gICAgKi8KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9Ob2RlLmFzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX05vZGUuYXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkN2E1MjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX05vZGUuYXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGluIFNBSVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1jbGFzcyBFY2xpcHNlX0FDVEZfTm9kZSB7Ci0gICAgcHJpdmF0ZSB2YXIgX19vYmplY3Q7Ci0KLSAgICB2YXIgb2JqZWN0TmFtZTsKLSAgICB2YXIgdHlwZTsKLSAgICB2YXIgY2xhc3NOYW1lOwotICAgIHZhciB0ZXh0OwotICAgIHZhciB0aXRsZTsKLSAgICB2YXIgdGFyZ2V0OlN0cmluZzsKLSAgICB2YXIgeDpOdW1iZXIsIHk6TnVtYmVyLCB3Ok51bWJlciwgaDpOdW1iZXI7Ci0gICAgdmFyIHZhbHVlOwotICAgIHZhciBpc09wYXF1ZU9iamVjdDpCb29sZWFuOwotICAgIHZhciBpc1VJQ29tcG9uZW50OkJvb2xlYW47Ci0gICAgdmFyIGlzSW5wdXRhYmxlOkJvb2xlYW47Ci0gICAgdmFyIGRlcHRoOwotICAgIHZhciBjdXJyZW50RnJhbWU6TnVtYmVyOwotICAgIHZhciB0YWJJbmRleDpOdW1iZXI7Ci0KLSAgICB2YXIgYWNjSW5mbzpFY2xpcHNlX0FDVEZfQWNjSW5mbzsKLQotICAgIC8qCi0gICAgICBwdWJsaWMgZnVuY3Rpb24gRWNsaXBzZV9BQ1RGX05vZGUoaU5hbWUsIHRuLCBjbiwgdHh0LCBjKSB7Ci0gICAgICB0aGlzLmluc3RhbmNlTmFtZSA9IGlOYW1lOwotICAgICAgdGhpcy50eXBlID0gdG47Ci0gICAgICB0aGlzLmNsYXNzTmFtZSA9IGNuOwotICAgICAgdGhpcy50ZXh0ID0gdHh0OwotICAgICAgdGhpcy5jaGlsZHJlbiA9IGM7Ci0gICAgICB0cmFjZSgiTm9kZSBjcmVhdGVkLiIpOwotICAgICAgfQotICAgICovCi0KLSAgICAvLyAKLSAgICB2YXIgc3dmVmVyc2lvbjpTdHJpbmc7Ci0gICAgdmFyIHVybDpTdHJpbmc7Ci0gICAgdmFyIG1OYW1lOlN0cmluZzsKLSAgICB2YXIgbVRhcmdldDpTdHJpbmc7Ci0gICAgdmFyIHBhcmVudFRhcmdldDpTdHJpbmc7Ci0gICAgdmFyIHRhcmdldE1vZGlmaWVkOkJvb2xlYW47Ci0gICAgdmFyIHRhcmdldElzU3RyaW5nOkJvb2xlYW47Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoKTpTdHJpbmcgewotICAgICAgICB2YXIgcmV0OwotICAgICAgICByZXQgPSB0aGlzLm9iamVjdE5hbWUgKyAiIC0gKHR5cGU6IiArIHRoaXMudHlwZSArICIpICIgKyAodGhpcy52YWx1ZSA/ICIodmFsdWU6IiArIHRoaXMudmFsdWUgKyAiKSIgOiAiIikgKyAiICIgKyAodGFyZ2V0ID8gIih0YXJnZXQ6IiArIHRoaXMudGFyZ2V0ICsgIikiIDogIiIpICsgIiAiOwotICAgICAgICByZXQgKz0gKHRoaXMuY2xhc3NOYW1lID8gIihjTmFtZToiICsgdGhpcy5jbGFzc05hbWUgKyAiKSIgOiAiIikgKyAiICIgKyAodGhpcy50ZXh0ID8gIih0ZXh0OiIgKyB0aGlzLnRleHQgKyAiKSIgOiAiIik7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiB1aU9iamVjdENoZWNrKCk6Qm9vbGVhbiB7Ci0gICAgICAgIGlmICghKEVjbGlwc2VfQUNURl9VdGlsLmlzSW5DbGFzcyh0aGlzLl9fb2JqZWN0LCBteC5jb3JlLlVJT2JqZWN0KSkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmlzSW5DbGFzcyh0aGlzLl9fb2JqZWN0LCBteC5jb3JlLlVJQ29tcG9uZW50KSkgewotICAgICAgICAgICAgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udGFpbmVycy5BY2NvcmRpb24pKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXguY29udGFpbmVycy5BY2NvcmRpb24iOwotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmlzSW5DbGFzcyh0aGlzLl9fb2JqZWN0LCBteC5jb250YWluZXJzLldpbmRvdykpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzVUlDb21wb25lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fb2JqZWN0LnRpdGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMuX19vYmplY3QudGl0bGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLkFsZXJ0KSkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250YWluZXJzLkFsYXJ0IjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250YWluZXJzLldpbmRvdyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5pc0luQ2xhc3ModGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuTGlzdCkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzVUlDb21wb25lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuaXNJbnB1dGFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLkRhdGFHcmlkKSkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5EYXRhR3JpZCI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXguY29udHJvbHMuTGlzdCI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLkJ1dHRvbikpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzVUlDb21wb25lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRyb2xzLkJ1dHRvbiI7Ci0gICAgICAgICAgICAgICAgLy8gc2VsZWN0ZWQsIHRvZ2dsZQotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLkNoZWNrQm94KSkgewotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0lucHV0YWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXguY29udHJvbHMuQ2hlY2tCb3giOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fb2JqZWN0LmxhYmVsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMuX19vYmplY3QubGFiZWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHNlbGVjdGVkCi0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuQ29tYm9Cb3gpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0lucHV0YWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5Db21ib0JveCI7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19vYmplY3QudGV4dCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB0aGlzLl9fb2JqZWN0LnRleHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHZhbHVlLCBzZWxlY3RlZEl0ZW0sIHNlbGVjdGVkSW5kZXgsIC4uLgotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLkRhdGVGaWVsZCkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzVUlDb21wb25lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuaXNJbnB1dGFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRyb2xzLkRhdGVGaWVsZCI7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETy4uLgotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLkRhdGVDaG9vc2VyKSkgewotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0lucHV0YWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXguY29udHJvbHMuRGF0ZUNob29zZXIiOwotICAgICAgICAgICAgICAgIC8vIFRPRE8uLi4KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuY2xhc3NKdWRnZSh0aGlzLl9fb2JqZWN0LCBteC5jb250cm9scy5MYWJlbCkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5MYWJlbCI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5fX29iamVjdC50ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMuX19vYmplY3QudGV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuTG9hZGVyKSkgewotICAgICAgICAgICAgICAgIC8vIFZpZXcKLSAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5Mb2FkZXIiOwotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLk1lbnUpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXguY29udHJvbHMuTWVudSI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuY2xhc3NKdWRnZSh0aGlzLl9fb2JqZWN0LCBteC5jb250cm9scy5NZW51QmFyKSkgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRyb2xzLk1lbnVCYXIiOwotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuTnVtZXJpY1N0ZXBwZXIpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXguY29udHJvbHMuTnVtZXJpY1N0ZXBwZXIiOwotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0lucHV0YWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19vYmplY3QudmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gU3RyaW5nKHRoaXMuX19vYmplY3QudmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuY2xhc3NKdWRnZSh0aGlzLl9fb2JqZWN0LCBteC5jb250cm9scy5SYWRpb0J1dHRvbikpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5SYWRpb0J1dHRvbiI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLmlzSW5wdXRhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5fX29iamVjdC5sYWJlbCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB0aGlzLl9fb2JqZWN0Lmdyb3VwTmFtZSArICIgIiArIHRoaXMuX19vYmplY3QubGFiZWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRhaW5lcnMuU2Nyb2xsUGFuZSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250YWluZXJzLlNjcm9sbFBhbmUiOwotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuVGV4dEFyZWEpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXguY29udHJvbHMuVGV4dEFyZWEiOwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0lucHV0YWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19vYmplY3QudGV4dCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB0aGlzLl9fb2JqZWN0LnRleHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLlRleHRJbnB1dCkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5UZXh0SW5wdXQiOwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc0lucHV0YWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19vYmplY3QudGV4dCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB0aGlzLl9fb2JqZWN0LnRleHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLlRyZWUpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXguY29udHJvbHMuVHJlZSI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuY2xhc3NKdWRnZSh0aGlzLl9fb2JqZWN0LCBteC5jb250cm9scy5VSVNjcm9sbEJhcikpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5VSVNjcm9sbEJhciI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc1VJQ29tcG9uZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5fX29iamVjdC5zY3JvbGxQb3NpdGlvbikgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB0aGlzLl9fb2JqZWN0LnNjcm9sbFBvc2l0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuY2xhc3NKdWRnZSh0aGlzLl9fb2JqZWN0LCBteC5tYW5hZ2Vycy5Gb2N1c01hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXgubWFuYWdlcnMuRm9jdXNNYW5hZ2VyIjsKLSAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuY2xhc3NKdWRnZSh0aGlzLl9fb2JqZWN0LCBteC5jb250cm9scy5NZWRpYUNvbnRyb2xsZXIpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXguY29udHJvbHMuTWVkaWFDb250cm9sbGVyIjsKLSAgICAgICAgICAgICAgICB0aGlzLmlzVUlDb21wb25lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLk1lZGlhRGlzcGxheSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5NZWRpYURpc3BsYXkiOwotICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXguY29udHJvbHMuTWVkaWFQbGF5YmFjaykpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb250cm9scy5NZWRpYVBsYXliYWNrIjsKLSAgICAgICAgICAgICAgICB0aGlzLmlzVUlDb21wb25lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb3JlLlVJQ29tcG9uZW50IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14LmNvbnRyb2xzLlByb2dyZXNzQmFyKSkgewotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LmNvbnRyb2xzLlByb2dyZXNzQmFyIjsKLSAgICAgICAgICAgICAgICB0aGlzLmlzVUlDb21wb25lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fb2JqZWN0LmxhYmVsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMuX19vYmplY3QubGFiZWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5jb3JlLlVJT2JqZWN0IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gRWNsaXBzZV9BQ1RGX05vZGUocGFyZW50LCBvYmplY3RTdHIpIHsKLSAgICAgICAgLy8gZHRyYWNlKCIgIGN0b3I6Iik7Ci0gICAgICAgIHRoaXMub2JqZWN0TmFtZSA9IG9iamVjdFN0cjsKLSAgICAgICAgLy8gZHRyYWNlKCIgICBwYXRoID0gIiArICgocGFyZW50ICE9IG51bGwgJiYgcGFyZW50ICE9IHVuZGVmaW5lZCkgPyBwYXJlbnQgOiAiKioiKSArICI6IiArIG9iamVjdFN0cik7Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgIT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgICAgICAvLyB0cmFjZShwYXJlbnQgKyAiOiIgKyBvYmplY3RTdHIpOwotICAgICAgICAgICAgdmFyIHBhcmVudE8gPSBldmFsKHBhcmVudCk7Ci0gICAgICAgICAgICB0aGlzLl9fb2JqZWN0ID0gcGFyZW50T1tvYmplY3RTdHJdOwotICAgICAgICAgICAgdGhpcy50YXJnZXQgPSBwYXJlbnQgKyAiLiIgKyBvYmplY3RTdHI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB0cmFjZSh0aGlzLl9fb2JqZWN0KTsKLSAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gb2JqZWN0U3RyOwotICAgICAgICAgICAgdGhpcy5fX29iamVjdCA9IGV2YWwob2JqZWN0U3RyKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlb2YgKHRoaXMuX19vYmplY3QpOwotICAgICAgICAvLyBkdHJhY2UoIiAgIHR5cGU6ICIgKyB0aGlzLnR5cGUpOwotCi0gICAgICAgIHRoaXMuYWNjSW5mbyA9IEVjbGlwc2VfQUNURl9BY2NJbmZvLm5ld0FjY0luZm8odGhpcy5fX29iamVjdCk7Ci0gICAgICAgIGlmICh0aGlzLl9fb2JqZWN0LmdldFNXRlZlcnNpb24pIHsKLSAgICAgICAgICAgIHRoaXMuc3dmVmVyc2lvbiA9IHRoaXMuX19vYmplY3QuZ2V0U1dGVmVyc2lvbigpOyAvLyBzaGluIGZvciBkZWJ1ZwotICAgICAgICB9Ci0gICAgICAgIHRoaXMudXJsID0gdGhpcy5fX29iamVjdC5fdXJsOyAvLyBzaGluIGZvciBkZWJ1ZwotICAgICAgICB0aGlzLncgPSB0aGlzLl9fb2JqZWN0Ll93aWR0aDsKLSAgICAgICAgdGhpcy5oID0gdGhpcy5fX29iamVjdC5faGVpZ2h0OwotICAgICAgICBpZiAodGhpcy5fX29iamVjdC5nZXRSZWN0KSB7Ci0gICAgICAgICAgICB2YXIgYm9iajpPYmplY3QgPSB0aGlzLl9fb2JqZWN0LmdldFJlY3QoKTsKLSAgICAgICAgICAgIHRoaXMueCA9IGJvYmoueE1pbjsKLSAgICAgICAgICAgIHRoaXMueSA9IGJvYmoueU1pbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSBvYmplY3QgaXMgcHV0IGluIGl0cyBwYXJlbnQgTUMuCi0gICAgICAgICAgICAvLyBUaGUgb3JpZ2luIGlzIGxvY2F0ZWQgYXQgdGhlIGNlbnRlciBvZiB0aGUgb2JqZWN0LgotICAgICAgICAgICAgdGhpcy54ID0gb2JqZWN0Ll94IC0gdGhpcy53IC8gMjsKLSAgICAgICAgICAgIHRoaXMueSA9IG9iamVjdC5feSAtIHRoaXMuaCAvIDI7Ci0gICAgICAgICAgICAqLwotICAgICAgICAgICAgdGhpcy54ID0gdGhpcy5fX29iamVjdC5feDsKLSAgICAgICAgICAgIHRoaXMueSA9IHRoaXMuX19vYmplY3QuX3k7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMuX19vYmplY3QubG9jYWxUb0dsb2JhbCkgewotICAgICAgICAgICAgdGhpcy5fX29iamVjdC5sb2NhbFRvR2xvYmFsKHRoaXMpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19vYmplY3QuX3BhcmVudC5sb2NhbFRvR2xvYmFsKSB7Ci0gICAgICAgICAgICB0aGlzLl9fb2JqZWN0Ll9wYXJlbnQubG9jYWxUb0dsb2JhbCh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy50eXBlID09ICJtb3ZpZWNsaXAiKSB7Ci0gICAgICAgICAgICB2YXIgdGFyZ2V0UGF0aDpTdHJpbmcgPSB0YXJnZXRQYXRoKHRoaXMuX19vYmplY3QpOwotICAgICAgICAgICAgdmFyIHJPYmo6T2JqZWN0ID0gZXZhbCh0YXJnZXRQYXRoKTsKLSAgICAgICAgICAgIGlmICh0eXBlb2Yock9iaikgPT0gInN0cmluZyIpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnRhcmdldElzU3RyaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChldmFsKHJPYmopID09PSB0aGlzLl9fb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRNb2RpZmllZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXRQYXRoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZHRyYWNlKCIgICB0YXJnZXQ6ICIgKyB0aGlzLnRhcmdldCk7Ci0gICAgICAgICAgICB0aGlzLm1OYW1lID0gdGhpcy5fX29iamVjdC5fbmFtZTsKLSAgICAgICAgICAgIHRoaXMubVRhcmdldCA9IHRoaXMuX19vYmplY3QuX3RhcmdldDsKLSAgICAgICAgICAgIGlmICh0aGlzLl9fb2JqZWN0Ll9wYXJlbnQpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFRhcmdldCA9IHRoaXMuX19vYmplY3QuX3BhcmVudC5fdGFyZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5jdXJyZW50RnJhbWUgPSB0aGlzLl9fb2JqZWN0Ll9jdXJyZW50ZnJhbWU7Ci0gICAgICAgICAgICB0aGlzLmRlcHRoID0gdGhpcy5fX29iamVjdC5nZXREZXB0aCgpOwotICAgICAgICAgICAgaWYgKCF1aU9iamVjdENoZWNrKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoRWNsaXBzZV9BQ1RGX1V0aWwuY2xhc3NKdWRnZSh0aGlzLl9fb2JqZWN0LCBteC52aWRlby5GTFZQbGF5YmFjaykpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAibXgudmlkZW8uRkxWUGxheWJhY2siOwotICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVUlDb21wb25lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEVjbGlwc2VfQUNURl9VdGlsLmNsYXNzSnVkZ2UodGhpcy5fX29iamVjdCwgbXgudmlkZW8uVmlkZW9QbGF5ZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNVSUNvbXBvbmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIm14LnZpZGVvLlZpZGVvUGxheWVyIjsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGhpcy50ZXh0ID09IG51bGwgfHwgdGhpcy50ZXh0ID09IHVuZGVmaW5lZCB8fCB0aGlzLnRleHQgPT0gIiIpIHsKLSAgICAgICAgICAgICAgICAvLyBkdHJhY2UoIiAgIG9idGFpbmluZyB0ZXh0IGZyb20gc25hcHNob3QuLi4iKTsKLSAgICAgICAgICAgICAgICB2YXIgdHM6VGV4dFNuYXBzaG90ID0gdGhpcy5fX29iamVjdC5nZXRUZXh0U25hcHNob3QoKTsKLSAgICAgICAgICAgICAgICBpZiAodHMpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGxlbjpOdW1iZXIgPSB0cy5nZXRDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IHRzLmdldFRleHQoMCwgbGVuLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGR0cmFjZSgiICAgb2J0YWluZWQgdGV4dCBpcyBbWyIgKyB0ZXh0ICsgIl1dIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dCAhPSB1bmRlZmluZWQgJiYgdGV4dCAhPSAiIikgCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT0gIm9iamVjdCIpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLl9fb2JqZWN0IGluc3RhbmNlb2YgVGV4dEZpZWxkKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAiVGV4dEZpZWxkIjsKLSAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldFBhdGgodGhpcy5fX29iamVjdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19vYmplY3QudHlwZSA9PSAiaW5wdXQiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbnB1dGFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKHRoaXMuX19vYmplY3QuX19zaG93Q29udGVudHMgIT0gZmFsc2UpICYmIHRoaXMuX19vYmplY3QudGV4dCAhPSBudWxsICYmIAotICAgICAgICAgICAgICAgICAgICB0aGlzLl9fb2JqZWN0LnRleHQgIT0gdW5kZWZpbmVkICYmIHRoaXMuX19vYmplY3QudGV4dCAhPSAiIikgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB0aGlzLl9fb2JqZWN0LnRleHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vIHRyYWNlKCIgVGV4dDoiICsgdGhpcy50ZXh0KTsKLSAgICAgICAgICAgICAgICAvLyBpZiAodGhpcy5fX29iamVjdFtvXS5fX3Nob3dDb250ZW50cyAhPSBmYWxzZSkgewotICAgICAgICAgICAgICAgIC8vIF9sZXZlbDAuYXJlYV90eHQudGV4dCArPSAiIFsiICsgdGhpcy5fX29iamVjdFtvXS50ZXh0ICsgIl0iOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9fb2JqZWN0IGluc3RhbmNlb2YgQnV0dG9uKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAiQnV0dG9uIjsKLSAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldFBhdGgodGhpcy5fX29iamVjdCk7Ci0gICAgICAgICAgICAgICAgLy8gaWYgKHRoaXMuX19vYmplY3Rbb10uX19zaG93Q29udGVudHMgIT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBfbGV2ZWwwLmFyZWFfdHh0LnRleHQgKz0gIiBbIiArIHRoaXMuX19vYmplY3Rbb10udGV4dCArICJdIjsKLSAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fX29iamVjdCBpbnN0YW5jZW9mIFhNTCkgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIlhNTCI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19vYmplY3QgaW5zdGFuY2VvZiBYTUxOb2RlKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAiWE1MTm9kZSI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19vYmplY3QgaW5zdGFuY2VvZiBBcnJheSkgewotICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gIkFycmF5IjsKLSAgICAgICAgICAgICAgICB0aGlzLmlzT3BhcXVlT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fX29iamVjdCBpbnN0YW5jZW9mIFNvdW5kKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSAiU291bmQiOwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9fb2JqZWN0IGluc3RhbmNlb2YgVmlkZW8pIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJWaWRlbyI7Ci0gICAgICAgICAgICAgICAgdGhpcy5pc09wYXF1ZU9iamVjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXRQYXRoKHRoaXMuX19vYmplY3QpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChFY2xpcHNlX0FDVEZfVXRpbC5jbGFzc0p1ZGdlKHRoaXMuX19vYmplY3QsIG14Lm1hbmFnZXJzLkRlcHRoTWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICJteC5tYW5hZ2Vycy5EZXB0aE1hbmFnZXIiOwotICAgICAgICAgICAgICAgIHRoaXMuaXNPcGFxdWVPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICI/Pz8gVW5rbm93biI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBkdHJhY2UoIiAgY2xhc3MgbmFtZTogIiArIHRoaXMuY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIHRoaXMuZGVwdGggPSB0aGlzLl9fb2JqZWN0LmdldERlcHRoKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnZhbHVlID0gU3RyaW5nKGV2YWwodGhpcy50YXJnZXQpKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnRhYkluZGV4ID0gdGhpcy5fX29iamVjdC50YWJJbmRleDsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFN1Y2Nlc3Nvck5vZGVzLiAoSW4gZ3JhcGggdGhlb3J5LCB3ZSBjYW4gZGlyZWN0bHkgcmVhY2ggc3VjY2Vyb3Mgbm9kZXMgZnJvbSAidGhpcyIgbm9kZSkKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIGZ1bmN0aW9uIGdldE51bWJlck9mU3VjY2Vzc29yTm9kZXMoKTpOdW1iZXIgewotICAgICAgICByZXR1cm4gdGhpcy5nZXRTdWNjZXNzb3JOb2Rlc0FycmF5KCkubGVuZ3RoOwotICAgIH0KLSAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3VjY2Vzc29yTm9kZXNBcnJheSgpOkFycmF5IHsKLSAgICAgICAgLy8gZHRyYWNlKCJOb2RlOjpnZXRTdWNjZXNzb3JOb2Rlc0FycmF5KCkiKTsKLSAgICAgICAgdmFyIHN1Y2Nlc3NvcnM6QXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgaWYgKHRoaXMudHlwZSAhPSAibW92aWVjbGlwIiAmJiB0aGlzLnR5cGUgIT0gIm9iamVjdCIpIHsKLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzb3JzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yICh2YXIgY2hpbGQgaW4gZXZhbCh0aGlzLnRhcmdldCkpIHsKLSAgICAgICAgICAgICAgICB2YXIgY05vZGU6RWNsaXBzZV9BQ1RGX05vZGUgPSBuZXcgRWNsaXBzZV9BQ1RGX05vZGUodGhpcy50YXJnZXQsIGNoaWxkKTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzb3JzLnB1c2goY05vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3NvcnM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE51bVN1Y2Nlc3Nvck5vZGVzKHBhdGg6U3RyaW5nKTpOdW1iZXIgewotICAgICAgICAvLyBkdHJhY2UoInN0YXRpYyBOb2RlOjpnZXROdW1TdWNjZXNzb3JOb2RlcygpIik7Ci0gICAgICAgIHZhciBub2RlOkVjbGlwc2VfQUNURl9Ob2RlID0gRWNsaXBzZV9BQ1RGX05vZGUuZ2V0Tm9kZUZyb21QYXRoKHBhdGgpOwotICAgICAgICBpZiAoIW5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5vZGUuZ2V0TnVtYmVyT2ZTdWNjZXNzb3JOb2RlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U3VjY2Vzc29yTm9kZXMocGF0aDpTdHJpbmcpOkFycmF5IHsKLSAgICAgICAgdmFyIG5vZGU6RWNsaXBzZV9BQ1RGX05vZGUgPSBFY2xpcHNlX0FDVEZfTm9kZS5nZXROb2RlRnJvbVBhdGgocGF0aCk7Ci0gICAgICAgIGlmICghbm9kZSkgewotICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbm9kZS5nZXRTdWNjZXNzb3JOb2Rlc0FycmF5KCk7Ci0gICAgfQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQ2hpbGROb2Rlcy4gKEluIHRyZWUgdGhlb3J5LCB0aGUgY2hpbGQgbm9kZXMgaGFzICJ0aGlzIiBwYXJlbnQgbm9kZSkKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROdW1iZXJPZkNoaWxkTm9kZXMoKTpOdW1iZXIgewotICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGlsZE5vZGVzQXJyYXkoKS5sZW5ndGg7Ci0gICAgfQotICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDaGlsZE5vZGVzQXJyYXkoKTpBcnJheSB7Ci0gICAgICAgIC8vIGR0cmFjZSgiTm9kZTo6Z2V0Q2hpbGROb2Rlc0FycmF5KCkiKTsKLSAgICAgICAgdmFyIGNoaWxkcmVuOkFycmF5ID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIHZhciBvYmpOYW1lczpPYmplY3QgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgICAgICAgdmFyIHRwOlN0cmluZyA9IHRhcmdldFBhdGgodGhpcy5fX29iamVjdCk7Ci0gICAgICAgIC8vIGR0cmFjZSgiIHRwID0gIiArIHRwKTsKLSAgICAgICAgaWYgKHRwID09IG51bGwgfHwgdHAgPT0gdW5kZWZpbmVkKSB7Ci0gICAgICAgICAgICAvLyBkdHJhY2UoIiAqKiB0cCBpcyBudWxsLiBhYm9ydC4iKTsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvcGllZCBmcm9tIGdldFN1Y2Nlc3Nvck5vZGVzQXJyYXkoKS4gbmVlZGxlc3M/Ci0gICAgICAgIGlmICh0aGlzLnR5cGUgIT0gIm1vdmllY2xpcCIgJiYgdGhpcy50eXBlICE9ICJvYmplY3QiKSB7Ci0gICAgICAgICAgICAvLyBkdHJhY2UoIiAqKiB0aGUgZW50aXR5IGlzIG5vdCBtb3ZpZWNsaXAgbm9yIG9iamVjdC4gYWJvcnQuIik7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBROiB3aHkgZG8gd2UgdXNlIGJvdGggdGFyZ2V0UGF0aCBhbmQgdGhpcy50YXJnZXQ/Ci0gICAgICAgIHZhciBpOk51bWJlciA9IDA7Ci0gICAgICAgIGZvciAodmFyIGNoaWxkIGluIGV2YWwodGhpcy50YXJnZXQpKSB7Ci0gICAgICAgICAgICAvLyBkdHJhY2UoIiBpbmRleCAiICsgKGkrKykgKyAiOiAiICsgY2hpbGQpOwotICAgICAgICAgICAgdmFyIGNOb2RlOkVjbGlwc2VfQUNURl9Ob2RlID0gbmV3IEVjbGlwc2VfQUNURl9Ob2RlKHRoaXMudGFyZ2V0LCBjaGlsZCk7Ci0gICAgICAgICAgICB2YXIgY05vZGVUYXJnZXQ6U3RyaW5nID0gY05vZGUudGFyZ2V0OwotICAgICAgICAgICAgLy8gZHRyYWNlKCIgIGNoaWxkJ3MgdGFyZ2V0OiAiICsgY05vZGVUYXJnZXQpOwotICAgICAgICAgICAgdmFyIGlkeDpOdW1iZXIgPSBjTm9kZVRhcmdldC5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICAgICAgaWYgKGlkeCA8IDApIHsKLSAgICAgICAgICAgICAgICAvLyBkdHJhY2UoIiAgKiogdGhpcyBjaGlsZCBkb2VzIG5vdCBoYXZlICcuJy4gY29udGludWUuIik7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0cCAhPSBjTm9kZVRhcmdldC5zdWJzdHJpbmcoMCwgaWR4KSkgewotICAgICAgICAgICAgICAgIC8vIGR0cmFjZSgiICAqKiB0aGlzIGNoaWxkIGlzIG5vdCByZWFsIGNoaWxkLiBjb250aW51ZS4iKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVtb3ZlIGJyaWRnZS1pbnRlcm5hbCBvYmplY3RzLgotICAgICAgICAgICAgaWYgKGNOb2RlVGFyZ2V0LmluZGV4T2YoIl9fRWNsaXBzZV9BQ1RGXyIpID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyBkdHJhY2UoIiAgKiogdGhpcyBjaGlsZCBpcyBicmlkZ2UtaW50ZXJuYWwgZW50aXR5LiBjb250aW51ZS4iKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotCSAgICB2YXIgb2JqTmFtZTpTdHJpbmcgPSBjTm9kZVRhcmdldC5zdWJzdHJpbmcoaWR4KzEpOwotCSAgICAvLyBFY2xpcHNlX0FDVEZfVXRpbC5zZW5kKG9iak5hbWUpOwotCSAgICBpZiAob2JqTmFtZXNbb2JqTmFtZV0gPT0gMSl7Ci0JCS8vIEVjbGlwc2VfQUNURl9VdGlsLnNlbmQoIiAtLSBkdXBsaWNhdGVkISIpOwotICAgICAgICAgICAgICAgIC8vIGR0cmFjZSgiICAqKiBkdXBsaWNhdGVkIGNoaWxkIG5hbWUuIGNvbnRpbnVlLiIpOwotCQljb250aW51ZTsKLQkgICAgfQotCSAgICBvYmpOYW1lc1tvYmpOYW1lXSA9IDE7Ci0gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGNOb2RlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBkdHJhY2UoInByb2Nlc3NlZCBjaGlsZHJlbi4iKTsKLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TnVtQ2hpbGROb2RlcyhwYXRoOlN0cmluZyk6TnVtYmVyIHsKLSAgICAgICAgLy8gZHRyYWNlKCJzdGF0aWMgTm9kZTo6Z2V0TnVtQ2hpbGROb2RlcygpIik7Ci0gICAgICAgIHZhciBub2RlOkVjbGlwc2VfQUNURl9Ob2RlID0gRWNsaXBzZV9BQ1RGX05vZGUuZ2V0Tm9kZUZyb21QYXRoKHBhdGgpOwotICAgICAgICBpZiAoIW5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5vZGUuZ2V0TnVtYmVyT2ZDaGlsZE5vZGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDaGlsZE5vZGVzKHBhdGg6U3RyaW5nKTpBcnJheSB7Ci0gICAgICAgIHZhciBub2RlOkVjbGlwc2VfQUNURl9Ob2RlID0gRWNsaXBzZV9BQ1RGX05vZGUuZ2V0Tm9kZUZyb21QYXRoKHBhdGgpOwotICAgICAgICBpZiAoIW5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5vZGUuZ2V0Q2hpbGROb2Rlc0FycmF5KCk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBFbmRzIGhlcmUuCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE5vZGVGcm9tUGF0aChwYXRoOlN0cmluZyk6RWNsaXBzZV9BQ1RGX05vZGUgewotICAgICAgICBpZiAoIWV2YWwocGF0aCkpIHsKLSAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgdmFyIG5vZGU6RWNsaXBzZV9BQ1RGX05vZGUgPSBuZXcgRWNsaXBzZV9BQ1RGX05vZGUobnVsbCwgcGF0aCk7Ci0gICAgICAgIHJldHVybiBub2RlOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJvb3ROb2RlKCk6RWNsaXBzZV9BQ1RGX05vZGUgewotICAgICAgICB2YXIgbm9kZTpFY2xpcHNlX0FDVEZfTm9kZSA9IG5ldyBFY2xpcHNlX0FDVEZfTm9kZShudWxsLCAiX2xldmVsMCIpOwotICAgICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1Byb3Blcmx5TmVzdGVkKHgxOk51bWJlciwgeTE6TnVtYmVyLCB3MTpOdW1iZXIsIGgxOk51bWJlciwgeDI6TnVtYmVyLCB5MjpOdW1iZXIsIHcyOk51bWJlciwgaDI6TnVtYmVyKTpCb29sZWFuIHsKLSAgICAgICAgdmFyIGwgPSBNYXRoLm1heCh4MSwgeDIpOwotICAgICAgICB2YXIgciA9IE1hdGgubWluKHgxICsgdzEsIHgyICsgdzIpOwotICAgICAgICB2YXIgdCA9IE1hdGgubWF4KHkxLCB5Mik7Ci0gICAgICAgIHZhciBiID0gTWF0aC5taW4oeTEgKyBoMSwgeTIgKyBoMik7Ci0gICAgICAgIHJldHVybiAoKChyIC0gbCkgPiAwKSAmJiAoKGIgLSB0KSA+IDApKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXROb2RlQXREZXB0aChwYXRoOlN0cmluZywgZGVwdGg6TnVtYmVyKTpFY2xpcHNlX0FDVEZfTm9kZSB7Ci0gICAgICAgIHZhciBiID0gZXZhbChwYXRoKTsKLSAgICAgICAgdmFyIG8gPSBiLmdldEluc3RhbmNlQXREZXB0aChkZXB0aCk7Ci0gICAgICAgIGlmICghbykgcmV0dXJuIHVuZGVmaW5lZDsKLSAgICAgICAgdmFyIHRhcmdldCA9IEVjbGlwc2VfQUNURl9Ob2RlLm5vcm1hbGl6ZVRhcmdldE5hbWUoby5fdGFyZ2V0KTsKLSAgICAgICAgcmV0dXJuIG5ldyBFY2xpcHNlX0FDVEZfTm9kZShudWxsLCB0YXJnZXQpOwotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjbXB4eShhOkVjbGlwc2VfQUNURl9Ob2RlLCBiOkVjbGlwc2VfQUNURl9Ob2RlKTpOdW1iZXIgewotICAgICAgICBpZiAoYS55ID4gYi55KSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYS55IDwgYi55KSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGEueCA+IGIueCkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGEueCA8IGIueCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZVRhcmdldE5hbWUodGFyZ2V0OlN0cmluZyk6U3RyaW5nIHsKLSAgICAgICAgaWYgKHRhcmdldC5jaGFyQXQoMCkgIT0gJy8nKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwotICAgICAgICB9Ci0gICAgICAgIHZhciByYTpBcnJheSA9IHRhcmdldC5zcGxpdCgiLyIpOwotICAgICAgICB2YXIgbnQ6U3RyaW5nID0gIl9sZXZlbDAiOwotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocmFbaV0ubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIG50ID0gbnQgKyAiLiIgKyByYVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnQ7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5uZXJOb2RlcyhwYXRoOlN0cmluZywgZmxhZzpCb29sZWFuLCBzdGFydEJhc2VEZXB0aDpCb29sZWFuKTpBcnJheSB7Ci0gICAgICAgIHZhciBhcnJheTpBcnJheSA9IG5ldyBBcnJheSgpOwotICAgICAgICAvLyB0cmFjZSgiUEFUSDoiK3BhdGgpOwotICAgICAgICB2YXIgYiA9IGV2YWwocGF0aCk7Ci0gICAgICAgIHZhciBvOwotICAgICAgICAvLyB0cmFjZSgiVFk6IiArIHR5cGVvZihiKSk7Ci0gICAgICAgIGlmIChiICYmIGIuZ2V0TmV4dEhpZ2hlc3REZXB0aCkgewotICAgICAgICAgICAgdmFyIGRzOk51bWJlciwgZGU6TnVtYmVyLCBkYzpOdW1iZXI7Ci0gICAgICAgICAgICBkZSA9IGIuZ2V0TmV4dEhpZ2hlc3REZXB0aCgpOwotICAgICAgICAgICAgaWYgKGRlID4gMTAwMCkgewotICAgICAgICAgICAgICAgIGRlID0gMTAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHRyYWNlKCJJRFM6IiArIGIuZ2V0RGVwdGgoKSArIjoiK2IuX3grIjoiK2IuX3krIjoiK2IuX3dpZHRoKyI6IiArYi5faGVpZ2h0KTsgCi0gICAgICAgICAgICAvLyB0cmFjZSgiSURFOiIgKyBkZSk7Ci0gICAgICAgICAgICBkYyA9IGIuZ2V0RGVwdGgoKTsKLSAgICAgICAgICAgIGlmIChzdGFydEJhc2VEZXB0aCkgewotICAgICAgICAgICAgICAgIGRzID0gZGMgKyAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkcyA9IC0xNjM4MzsKLSAgICAgICAgICAgICAgICAvLyAtMTYzODQoX2xldmVsMC5nZXREZXB0aCgpICsgMSkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoOyBkcyA8IGRlOyBkcysrKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgKGRzID09IGRjKSBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBvID0gYi5nZXRJbnN0YW5jZUF0RGVwdGgoZHMpOwotICAgICAgICAgICAgICAgIGlmIChvLl90YXJnZXQgPT0gYi5fdGFyZ2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobyAmJiBvLl92aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKCFiLl94Ci0gICAgICAgICAgICAgICAgICAgICAgfHwgIW8uX3gKLSAgICAgICAgICAgICAgICAgICAgICB8fCBFY2xpcHNlX0FDVEZfTm9kZS5pc1Byb3Blcmx5TmVzdGVkKGIuX3gsIGIuX3ksIGIuX3dpZHRoLCBiLl9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgby5feCwgby5feSwgby5fd2lkdGgsIG8uX2hlaWdodCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICB0cmFjZSgiSUQ6IiArIGRzICsgIjoiICsgby5fdGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKG5ldyBFY2xpcHNlX0FDVEZfTm9kZShudWxsLCBvLl90YXJnZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBFY2xpcHNlX0FDVEZfTm9kZS5ub3JtYWxpemVUYXJnZXROYW1lKG8uX3RhcmdldCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBvMiA9IGV2YWwodGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWcgfHwgKGRzID09IDApIHx8IChvMi5nZXREZXB0aCgpID09IGRzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaChuZXcgRWNsaXBzZV9BQ1RGX05vZGUobnVsbCwgdGFyZ2V0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gdHJhY2UoIkxFTjoiK2FycmF5Lmxlbmd0aCk7IAotICAgICAgICBhcnJheS5zb3J0KEVjbGlwc2VfQUNURl9Ob2RlLmNtcHh5KTsKLSAgICAgICAgcmV0dXJuIGFycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0Rm9jdXMocGF0aDpTdHJpbmcpOkJvb2xlYW4gewotICAgICAgICB2YXIgbyA9IGV2YWwocGF0aCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3Rpb24uc2V0Rm9jdXMobyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZHRyYWNlKG1lczpTdHJpbmcpIHsKLSAgICAgICAgLy8gaWYgKGRlYnVnKSB7Ci0gICAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgICAgICB0cmFjZShtZXMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX1JlcXVlc3RTZXJ2ZXIuYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfUmVxdWVzdFNlcnZlci5hcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxMTk4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfUmVxdWVzdFNlcnZlci5hcworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2xhc3MgRWNsaXBzZV9BQ1RGX1JlcXVlc3RTZXJ2ZXIgewotICAgIHByaXZhdGUgc3RhdGljIHZhciBzZWNyZXQ6U3RyaW5nOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcHJvY2Vzcyhwcm9wTmFtZSwgb2xkVmFsLCBuZXdWYWwsIHVzZXJEYXRhKSB7Ci0gICAgICAgIC8vIGR0cmFjZSgicHJvY2Vzc2luZzogIiArIHByb3BOYW1lICsgIiAiICsgb2xkVmFsICsgIiAiICsgbmV3VmFsICsgIiAiICsgdXNlckRhdGEpOwotICAgICAgICBpZiAobmV3VmFsLnN1YnN0cmluZygwLCBzZWNyZXQubGVuZ3RoKSA9PSBzZWNyZXQpIHsKLSAgICAgICAgICAgIHZhciBhcmdzID0gRWNsaXBzZV9BQ1RGX0FTU2VyaWFsaXplci5kZXNlcmlhbGl6ZShuZXdWYWwuc3Vic3RyaW5nKHNlY3JldC5sZW5ndGgpKTsKLSAgICAgICAgICAgIHZhciBuYW1lID0gYXJncy5zaGlmdCgpOwotCSAgICAvLyBkdHJhY2UoIiAgY2FsbGluZyBmdW5jdGlvbiAiICsgbmFtZSArICI6ICIgKyBhcmdzWzBdICsgIiAiICsgYXJnc1sxXSk7Ci0gICAgICAgICAgICB2YXIgbWV0aG9kOkZ1bmN0aW9uID0gRWNsaXBzZV9BQ1RGX0luaXQuY2FsbGJhY2tzW25hbWVdOwotICAgICAgICAgICAgdmFyIHJldE9iaiA9IG1ldGhvZC5hcHBseShudWxsLCBhcmdzKTsKLQkgICAgLy8gZHRyYWNlKCIgIHJldHVybiB2YWx1ZSBbIiArIHJldE9iaiArICJdIik7Ci0gICAgICAgICAgICBfcm9vdC5FY2xpcHNlX0FDVEZfcmVzcG9uc2VfdmFsdWUgPSBFY2xpcHNlX0FDVEZfQVNTZXJpYWxpemVyLnNlcmlhbGl6ZShyZXRPYmopOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvbGRWYWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdGFydChzZWM6U3RyaW5nKSB7Ci0gICAgICAgIHNlY3JldCA9IHNlYzsKLSAgICAgICAgX3Jvb3Qud2F0Y2goIkVjbGlwc2VfQUNURl9yZXF1ZXN0X2FyZ3MiLCBFY2xpcHNlX0FDVEZfUmVxdWVzdFNlcnZlci5wcm9jZXNzKTsKLSAgICAgICAgLy8gZHRyYWNlKCJyZXF1ZXN0IHNlcnZlciBzdGFydGVkLiIpOwotICAgIH0KLQotICAgIC8qCi0gICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZHRyYWNlKG1lczpTdHJpbmcpIHsKLSAgICAgICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgICAgICB0cmFjZShtZXMpOwotICAgICAgICB9Ci0gICAgfQotICAgICovCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9TdGFnZVByb3h5LmFzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX1N0YWdlUHJveHkuYXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYjlkOWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX1N0YWdlUHJveHkuYXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1jbGFzcyBFY2xpcHNlX0FDVEZfU3RhZ2VQcm94eSB7Ci0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRTY2FsZU1vZGUobW9kZTpTdHJpbmcpOkJvb2xlYW4gewotICAgICAgICBTdGFnZS5zY2FsZU1vZGUgPSBtb2RlOwotICAgICAgICByZXR1cm4gKFN0YWdlLnNjYWxlTW9kZSA9PSBtb2RlKQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U2NhbGVNb2RlKCk6U3RyaW5nIHsKLSAgICAgICAgcmV0dXJuIFN0YWdlLnNjYWxlTW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFN0YWdlV2lkdGgoKTpOdW1iZXIgewotICAgICAgICByZXR1cm4gU3RhZ2Uud2lkdGg7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTdGFnZUhlaWdodCgpOk51bWJlciB7Ci0gICAgICAgIHJldHVybiBTdGFnZS5oZWlnaHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTdGFnZUFsaWduKCk6U3RyaW5nIHsKLSAgICAgICAgcmV0dXJuIFN0YWdlLmFsaWduOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9TdHJlYW0uYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfU3RyZWFtLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGRjOGQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9TdHJlYW0uYXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotY2xhc3MgRWNsaXBzZV9BQ1RGX1N0cmVhbSB7Ci0gICAgcHJpdmF0ZSB2YXIgbmV0U3RyZWFtOk5ldFN0cmVhbTsKLSAgICBwcml2YXRlIHZhciBzb3VuZDpTb3VuZDsKLSAgICBwcml2YXRlIHZhciBwb3M6TnVtYmVyOwotICAgIHByaXZhdGUgdmFyIHRhcmdldDpPYmplY3Q7Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG9iajpPYmplY3QpOkJvb2xlYW4gewotICAgICAgICByZXR1cm4gKG9iaiA9PT0gdGhpcy50YXJnZXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiBzdG9wKCkgewotICAgICAgICBpZiAodGhpcy5uZXRTdHJlYW0pIHsKLSAgICAgICAgICAgIHRoaXMubmV0U3RyZWFtLnBhdXNlKHRydWUpOwotICAgICAgICAgICAgdGhpcy5uZXRTdHJlYW0uc2VlaygwKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNvdW5kKSB7Ci0gICAgICAgICAgICB0aGlzLnNvdW5kLnN0b3AoKTsKLSAgICAgICAgICAgIHRoaXMucG9zID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHNlYXJjaFBsYXlCdXR0b25JbnRlcm5hbChvOk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OlN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2VkOk9iamVjdCk6Qm9vbGVhbiB7Ci0gICAgICAgIGlmICh0cmF2ZXJzZWRbdGFyZ2V0XSkgcmV0dXJuOwotICAgICAgICB0cmF2ZXJzZWRbdGFyZ2V0XSA9IHRydWU7Ci0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYTUxOb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKHZhciBjIGluIG8pIHsKLSAgICAgICAgICAgIHZhciBjbzpPYmplY3QgPSBvW2NdOwotICAgICAgICAgICAgLy8gRWNsaXBzZV9BQ1RGX1V0aWwuc2VuZCgiLi4uIiArIGMgKyAiICIgKyBjLnRvVXBwZXJDYXNlKCkuaW5kZXhPZigiUExBWSIpKTsKLSAgICAgICAgICAgIGlmIChjLnRvVXBwZXJDYXNlKCkuaW5kZXhPZigiUExBWSIpID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoY28gJiYgY28ub25SZWxlYXNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEVjbGlwc2VfQUNURl9VdGlsLnNlbmQoIlRyeSB0byBQdXNoOiIgKyBjbyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgY1RhcmdldDpTdHJpbmcgPSB0YXJnZXQgKyAiLiIgKyBjOwotICAgICAgICAgICAgaWYgKGNvLl90YXJnZXQpIHsKLSAgICAgICAgICAgICAgICBjVGFyZ2V0ID0gRWNsaXBzZV9BQ1RGX05vZGUubm9ybWFsaXplVGFyZ2V0TmFtZShjby5fdGFyZ2V0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY28uX3RhcmdldCA9IGNUYXJnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VhcmNoUGxheUJ1dHRvbkludGVybmFsKGNvLCBjVGFyZ2V0LCB0cmF2ZXJzZWQpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZWFyY2hQbGF5QnV0dG9uKCkgewotICAgICAgICB2YXIgdHJhdmVyc2VkOk9iamVjdCA9IG5ldyBPYmplY3QoKTsKLQotICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdmFyIHBhdGg6U3RyaW5nID0gYXJndW1lbnRzW2ldOwotICAgICAgICAgICAgdmFyIG86T2JqZWN0ID0gZXZhbChwYXRoKTsKLSAgICAgICAgICAgIHNlYXJjaFBsYXlCdXR0b25JbnRlcm5hbChvLCBwYXRoLCB0cmF2ZXJzZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHBsYXkoKSB7Ci0gICAgICAgIGlmICh0aGlzLm5ldFN0cmVhbSkgewotICAgICAgICAgICAgLy8gRWNsaXBzZV9BQ1RGX1V0aWwuc2VuZCgiYnl0ZXNMb2FkZWQ6IiArIHRoaXMubmV0U3RyZWFtLmJ5dGVzTG9hZGVkKTsKLSAgICAgICAgICAgIGlmICh0aGlzLm5ldFN0cmVhbS5ieXRlc0xvYWRlZCA8PSAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gRWNsaXBzZV9BQ1RGX1V0aWwuc2VuZCgiU2VhcmNoIGJ1dHRvbi4uLiIpOwotICAgICAgICAgICAgICAgIHNlYXJjaFBsYXlCdXR0b24oIl9sZXZlbDAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMubmV0U3RyZWFtLnBhdXNlKGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNvdW5kKSB7Ci0gICAgICAgICAgICB0aGlzLnNvdW5kLnN0YXJ0KHRoaXMucG9zIC8gMTAwMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcGF1c2UoKSB7Ci0gICAgICAgIGlmICh0aGlzLm5ldFN0cmVhbSkgewotICAgICAgICAgICAgdGhpcy5uZXRTdHJlYW0ucGF1c2UodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnBvcyA9IHRoaXMuc291bmQuZHVyYXRpb247Ci0gICAgICAgICAgICB0aGlzLnNvdW5kLnN0b3AoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDdXJyZW50U3RhdGUoKSB7Ci0gICAgICAgIC8vIFRPRE8KLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VycmVudFBvc2l0aW9uKCk6TnVtYmVyIHsKLSAgICAgICAgaWYgKHRoaXMubmV0U3RyZWFtKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5uZXRTdHJlYW0udGltZTsKLSAgICAgICAgfSBlbHNlIGlmIChzb3VuZCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291bmQuZHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoc3JjKSB7Ci0gICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBOZXRTdHJlYW0pIHsKLSAgICAgICAgICAgIHRoaXMubmV0U3RyZWFtID0gc3JjOwotICAgICAgICB9IGVsc2UgaWYgKHNyYyBpbnN0YW5jZW9mIFNvdW5kKSB7Ci0gICAgICAgICAgICB0aGlzLnNvdW5kID0gc3JjOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIEVjbGlwc2VfQUNURl9TdHJlYW0odGd0LCBzcmMpIHsKLSAgICAgICAgdGhpcy50YXJnZXQgPSB0Z3Q7Ci0gICAgICAgIHRoaXMudXBkYXRlKHNyYyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX1V0aWwuYXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfVXRpbC5hcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmNzY4Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvYnJpZGdlU1dGL2NvbW1vbi9FY2xpcHNlX0FDVEZfVXRpbC5hcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hpbiBTQUlUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotY2xhc3MgRWNsaXBzZV9BQ1RGX1V0aWwgewotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2xhc3NKdWRnZShvOk9iamVjdCwgY2xzOkZ1bmN0aW9uKTpCb29sZWFuIHsKLSAgICAgICAgcmV0dXJuIChvLl9fcHJvdG9fXyA9PSBjbHMucHJvdG90eXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzSW5DbGFzcyhvOk9iamVjdCwgY2xzOkZ1bmN0aW9uKTpCb29sZWFuIHsKLSAgICAgICAgbyA9IG8uX19wcm90b19fOwotICAgICAgICB2YXIgY2xzUHJvdG8gPSBjbHMucHJvdG90eXBlOwotICAgICAgICB3aGlsZSAobykgewotICAgICAgICAgICAgaWYgKG8gPT0gY2xzUHJvdG8pIHJldHVybiB0cnVlOwotICAgICAgICAgICAgbyA9IG8uX19wcm90b19fOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlbmQobWVzOlN0cmluZykgewotICAgICAgICAvLyBuZXcgTG9jYWxDb25uZWN0aW9uKCkuc2VuZCgiX3Rlc3RMQyIsICJkdW1wIiwgbWVzKTsKLSAgICAgICAgdmFyIGxjOkxvY2FsQ29ubmVjdGlvbiA9IG5ldyBMb2NhbENvbm5lY3Rpb24oKTsKLQlsYy5zZW5kKCJfdGVzdExDIiwgImR1bXAiLCBtZXMpOwotCS8vIGxjLmNsb3NlKCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX1dhdGNoLmFzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2JyaWRnZVNXRi9jb21tb24vRWNsaXBzZV9BQ1RGX1dhdGNoLmFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjA1MGI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9icmlkZ2VTV0YvY29tbW9uL0VjbGlwc2VfQUNURl9XYXRjaC5hcworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbXBvcnQgZmxhc2guZXh0ZXJuYWwuRXh0ZXJuYWxJbnRlcmZhY2U7Ci0KLWNsYXNzIEVjbGlwc2VfQUNURl9XYXRjaCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgdmFyIGJhc2VPYmplY3Q6T2JqZWN0OwotICAgIHByaXZhdGUgc3RhdGljIHZhciBvcmlnT25FbnRlckZyYW1lOkZ1bmN0aW9uOwotICAgIHByaXZhdGUgc3RhdGljIHZhciB3YXRjaExpc3RzOk9iamVjdCA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIHN0YXRpYyB2YXIgY2FsbGJhY2s6U3RyaW5nOwotICAgIHByaXZhdGUgdmFyIHBhdGg6U3RyaW5nOwotICAgIHByaXZhdGUgdmFyIHJhbmdlczpBcnJheTsKLSAgICBwcml2YXRlIHZhciBleGlzdHM6Qm9vbGVhbjsKLSAgICBwcml2YXRlIHZhciBjdXJyZW50RnJhbWU6TnVtYmVyOwotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBFY2xpcHNlX0FDVEZfV2F0Y2gocGF0aDpTdHJpbmcpIHsKLSAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKLSAgICAgICAgdGhpcy5yYW5nZXMgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgdmFyIG9iaiA9IGV2YWwgKHBhdGgpOwotICAgICAgICBpZiAob2JqKSB7Ci0gICAgICAgICAgICB0aGlzLmV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICB0aGlzLmN1cnJlbnRGcmFtZSA9IG9iai5fY3VycmVudEZyYW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5leGlzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgIHRoaXMuY3VycmVudEZyYW1lID0gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc0luRnJhbWUoZm46TnVtYmVyLCByOk9iamVjdCkgewotICAgICAgICByZXR1cm4gKGZuID49IHIubWluKSAmJiAoZm4gPCByLm1heCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gd2F0Y2hFbnRyeSgpIHsKLSAgICAgICAgLy8gb3JpZ09uRW50ZXJGcmFtZS5jYWxsKGJhc2VPYmplY3QpOwotICAgICAgICBmb3IgKHZhciBwYXRoIGluIHdhdGNoTGlzdHMpIHsKLSAgICAgICAgICAgIHZhciB3OkVjbGlwc2VfQUNURl9XYXRjaCA9IHdhdGNoTGlzdHNbcGF0aF07Ci0gICAgICAgICAgICB2YXIgY2FsbCA9IGZhbHNlOwotICAgICAgICAgICAgdmFyIG9iaiA9IGV2YWwgKHcucGF0aCk7Ci0gICAgICAgICAgICBpZiAoIW9iaiA9PSB3LmV4aXN0cykgewotICAgICAgICAgICAgICAgIHcuZXhpc3RzID0gIXcuZXhpc3RzOwotICAgICAgICAgICAgICAgIGNhbGwgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChvYmopIHsKLSAgICAgICAgICAgICAgICB2YXIgZm4gPSBvYmouX2N1cnJlbnRGcmFtZTsKLSAgICAgICAgICAgICAgICB2YXIgcGZuID0gdy5jdXJyZW50RnJhbWU7Ci0gICAgICAgICAgICAgICAgdy5jdXJyZW50RnJhbWUgPSBmbjsKLSAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHcucmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciByOk9iamVjdCA9IHcucmFuZ2VzW2ldOwotICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IEVjbGlwc2VfQUNURl9XYXRjaC5pc0luRnJhbWUoZm4sIHIpOwotICAgICAgICAgICAgICAgICAgICB2YXIgcGYgPSBFY2xpcHNlX0FDVEZfV2F0Y2guaXNJbkZyYW1lKHBmbiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmICE9IHBmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNhbGwpIHsKLSAgICAgICAgICAgICAgICBFeHRlcm5hbEludGVyZmFjZS5jYWxsKGNhbGxiYWNrLCB3LnBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LmV4aXN0cywgdy5jdXJyZW50RnJhbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3YXRjaEluaXQoY2I6U3RyaW5nKSB7Ci0gICAgICAgIGNhbGxiYWNrID0gY2I7Ci0gICAgICAgIGJhc2VPYmplY3QgPSBldmFsICgiX2xldmVsMCIpOwotICAgICAgICBvcmlnT25FbnRlckZyYW1lID0gYmFzZU9iamVjdC5vbkVudGVyRnJhbWU7Ci0gICAgICAgIGJhc2VPYmplY3Qub25FbnRlckZyYW1lID0gZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICBFY2xpcHNlX0FDVEZfV2F0Y2gud2F0Y2hFbnRyeSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3YXRjaE9iamVjdChwYXRoOlN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkZyYW1lOk51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEZyYW1lOk51bWJlcikgewotICAgICAgICB2YXIgdzpFY2xpcHNlX0FDVEZfV2F0Y2ggPSB3YXRjaExpc3RzW3BhdGhdOwotICAgICAgICBpZiAoIXcpIHsKLSAgICAgICAgICAgIHcgPSBuZXcgRWNsaXBzZV9BQ1RGX1dhdGNoKHBhdGgpOwotICAgICAgICAgICAgd2F0Y2hMaXN0c1twYXRoXSA9IHc7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChtaW5GcmFtZSA+PSAwKSAmJiAobWF4RnJhbWUgPj0gMCkpIHsKLSAgICAgICAgICAgIHZhciByOk9iamVjdCA9IG5ldyBPYmplY3QoKTsKLSAgICAgICAgICAgIHIubWluID0gbWluRnJhbWU7Ci0gICAgICAgICAgICByLm1heCA9IG1heEZyYW1lOwotICAgICAgICAgICAgdy5yYW5nZXNbdy5yYW5nZXMubGVuZ3RoXSA9IHI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlbW92ZVdhdGNoTGlzdChwYXRoOlN0cmluZykgewotICAgICAgICB3YXRjaExpc3RzW3BhdGhdID0gdW5kZWZpbmVkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNjMwMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBsb2dnaW5nLmNvbmYsXAotICAgICAgICAgICAgICAgYnJpZGdlU1dGLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2xvZ2dpbmcuY29uZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9sb2dnaW5nLmNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDRjNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL2xvZ2dpbmcuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotaGFuZGxlcnMgPSBqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlcg0KLS5sZXZlbD1GSU5FDQotamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIubGV2ZWw9U0VWRVJFDQotamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyPWphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlcg0KLWphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmxldmVsPUZJTkVTVA0KLWphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmZvcm1hdHRlcj1qYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXINCi0NCi0NCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNTRkY2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI2ZsYXNoCi1mbGFzaC5wbGF5ZXJfb2s9Rmxhc2ggRE9NIGlzIGF2YWlsYWJsZQotZmxhc2gucGxheWVyX2xvYWRpbmc9TG9hZGluZy4uLiAoUGxlYXNlIHJldHJ5IGxhdGVyKQotZmxhc2gucGxheWVyX2VtYmVkPUZsYXNoIGVtYmVkZGVkIGJ5IEVNQkVEIHRhZyBpcyBub3Qgc3VwcG9ydGVkCi1mbGFzaC5wbGF5ZXJfbm9fZG9tPUZsYXNoIERPTSBpcyBub3QgYXZhaWxhYmxlCi1mbGFzaC5wbGF5ZXJfbm9feGNvZGU9Rmxhc2ggRE9NIGlzIG5vdCB0cmFuc2NvZGVkCi1mbGFzaC5wbGF5ZXJfdW5rbm93bj1VbmV4cGVjdGVkIEZsYXNoIGl0ZW0KLWZsYXNoLnBsYXllcl9odHRwcz0oSFRUUFMpIEZsYXNoIERPTSBpcyBub3QgYXZhaWxhYmxlIGR1ZSB0byBhIHNlY3VyZSBjb25uZWN0aW9uLgotZmxhc2guYmFkX2ZsYXNoX3ZlcnNpb249Rmxhc2ggUGxheWVyIHZlcnNpb24gezB9IGlzIGN1cnJlbnRseSBpbnN0YWxsZWQuXG5cblBsZWFzZSBpbnN0YWxsIEZsYXNoIFBsYXllciB2ZXJzaW9uIDggb3IgbGF0ZXIuCi0jZGVidWcgbWVzc2FnZSA6IG5vIG5lZWQgdG8gdHJhbnNsYXRlCi1mbGFzaC5lcnJvcl90YXJnZXRfbGVuZ3RoPUVycm9yOiB0YXJnZXQgbGV2ZWwgezB9Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvbWVzc2FnZXNfamEucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvbWVzc2FnZXNfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg1Yzg0Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL21lc3NhZ2VzX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jZmxhc2gKLWZsYXNoLnBsYXllcl9vaz1GbGFzaCBET01cdTMwNGNcdTUyMjlcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNTkKLWZsYXNoLnBsYXllcl9sb2FkaW5nPVx1MzBlZFx1MzBmY1x1MzBjOVx1NGUyZC4uLiAoXHUzMDQyXHUzMDY4XHUzMDY3XHU1MThkXHU4YTY2XHU4ODRjXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0KQotZmxhc2gucGxheWVyX2VtYmVkPWVtYmVkXHUzMGJmXHUzMGIwXHUzMDkyXHU1MjI5XHU3NTI4XHUzMDU3XHUzMDVmRmxhc2hcdTMwNmZcdTMwYjVcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTMKLWZsYXNoLnBsYXllcl9ub19kb209Rmxhc2ggRE9NXHUzMDkyXHU1MjI5XHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzCi1mbGFzaC5wbGF5ZXJfbm9feGNvZGU9Rmxhc2ggRE9NXHUzMDRjXHU1OTA5XHU2M2RiXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzCi1mbGFzaC5wbGF5ZXJfdW5rbm93bj1cdTRlODhcdTY3MWZcdTMwNWJcdTMwNmNGbGFzaFx1OTgwNVx1NzZlZVx1MzA2N1x1MzA1OQotZmxhc2gucGxheWVyX2h0dHBzPShIVFRQUykgRmxhc2ggRE9NXHUzMDRjXHU1OTA5XHU2M2RiXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHVmZjA4XHUzMGJiXHUzMGFkXHUzMGU1XHUzMGEyXHUzMGIzXHUzMGNkXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHUzMDVmXHUzMDgxXHVmZjA5Ci1mbGFzaC5iYWRfZmxhc2hfdmVyc2lvbj1GbGFzaCBQbGF5ZXIgXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzIHswfSBcdTMwNGNcdTczZmVcdTU3MjhcdTMwYTRcdTMwZjNcdTMwYjlcdTMwYzhcdTMwZmNcdTMwZWJcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDJcblxuRmxhc2ggUGxheWVyIFx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMyA4IFx1NGVlNVx1NGUwYVx1MzA5Mlx1MzBhNFx1MzBmM1x1MzBiOVx1MzBjOFx1MzBmY1x1MzBlYlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0FTQWNjSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0FTQWNjSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGNkMGNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9BU0FjY0luZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5hcy5BU09iamVjdDsKLQotLyoqCi0gKiBBU0FjY0luZm8gc3RvcmVzIGFjY2Vzc2liaWxpdHkgaW5mb3JtYXRpb24gb2YgQWN0aW9uU2NyaXB0Ci0gKiA8Y29kZT5PYmplY3Q8L2NvZGU+LgotICogCi0gKiBAc2VlIEFTT2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBBU0FjY0luZm8gewotCi0JcHJpdmF0ZSBBU09iamVjdCBhY2NJbmZvOwotCi0JcHJpdmF0ZSBBU0FjY0luZm8oQVNPYmplY3QgYWNjSW5mbykgewotCQl0aGlzLmFjY0luZm8gPSBhY2NJbmZvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB7QGxpbmsgQVNBY2NJbmZvfSBmcm9tIHtAbGluayBBU09iamVjdH0KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICB0YXJnZXQge0BsaW5rIEFTT2JqZWN0fQotCSAqIEByZXR1cm4ge0BsaW5rIEFTQWNjSW5mb30gb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyBBU0FjY0luZm8gY3JlYXRlKEFTT2JqZWN0IHRhcmdldCkgewotCQlPYmplY3QgcmVzdWx0ID0gdGFyZ2V0LmdldChJRmxhc2hDb25zdC5BU05PREVfQUNDSU5GTyk7Ci0JCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBBU09iamVjdCkgewotCQkJcmV0dXJuIG5ldyBBU0FjY0luZm8oKEFTT2JqZWN0KSByZXN1bHQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gcm9sZQotCSAqIEBzZWUgSUZsYXNoQ29uc3QjQUNDSU5GT19ST0xFCi0JICovCi0JcHVibGljIGludCBnZXRSb2xlKCkgewotCQlPYmplY3Qgb2JqID0gYWNjSW5mby5nZXQoSUZsYXNoQ29uc3QuQUNDSU5GT19ST0xFKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCXJldHVybiAoSW50ZWdlcikgb2JqOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHN0YXRlCi0JICogQHNlZSBJRmxhc2hDb25zdCNBQ0NJTkZPX1NUQVRFCi0JICovCi0JcHVibGljIGludCBnZXRTdGF0ZSgpIHsKLQkJT2JqZWN0IG9iaiA9IGFjY0luZm8uZ2V0KElGbGFzaENvbnN0LkFDQ0lORk9fU1RBVEUpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJcmV0dXJuIChJbnRlZ2VyKSBvYmo7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaXNTaWxlbnQKLQkgKiBAc2VlIElGbGFzaENvbnN0I0FDQ0lORk9fU0lMRU5UCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaWxlbnQoKSB7Ci0JCU9iamVjdCBvYmogPSBhY2NJbmZvLmdldChJRmxhc2hDb25zdC5BQ0NJTkZPX1NJTEVOVCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0JCQlyZXR1cm4gKEJvb2xlYW4pIG9iajsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpc0ZvcmNlU2ltcGxlCi0JICogQHNlZSBJRmxhc2hDb25zdCNBQ0NJTkZPX0ZPUkNFU0lNUExFCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3JjZVNpbXBsZSgpIHsKLQkJT2JqZWN0IG9iaiA9IGFjY0luZm8uZ2V0KElGbGFzaENvbnN0LkFDQ0lORk9fRk9SQ0VTSU1QTEUpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJcmV0dXJuIChCb29sZWFuKSBvYmo7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbmFtZQotCSAqIEBzZWUgSUZsYXNoQ29uc3QjQUNDSU5GT19OQU1FCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlPYmplY3Qgb2JqID0gYWNjSW5mby5nZXQoSUZsYXNoQ29uc3QuQUNDSU5GT19OQU1FKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJcmV0dXJuIChTdHJpbmcpIG9iajsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGRlc2NyaXB0aW9uCi0JICogQHNlZSBJRmxhc2hDb25zdCNBQ0NJTkZPX0RFU0NSSVBUSU9OCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJT2JqZWN0IG9iaiA9IGFjY0luZm8uZ2V0KElGbGFzaENvbnN0LkFDQ0lORk9fREVTQ1JJUFRJT04pOwotCQlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgb2JqOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnRjdXQKLQkgKiBAc2VlIElGbGFzaENvbnN0I0FDQ0lORk9fU0hPUlRDVVQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0Y3V0KCkgewotCQlPYmplY3Qgb2JqID0gYWNjSW5mby5nZXQoSUZsYXNoQ29uc3QuQUNDSU5GT19TSE9SVENVVCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXJldHVybiAoU3RyaW5nKSBvYmo7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBkZWZhdWx0IGFjdGlvbgotCSAqIEBzZWUgSUZsYXNoQ29uc3QjQUNDSU5GT19ERUZBVUxUQUNUSU9OCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0QWN0aW9uKCkgewotCQlPYmplY3Qgb2JqID0gYWNjSW5mby5nZXQoSUZsYXNoQ29uc3QuQUNDSU5GT19ERUZBVUxUQUNUSU9OKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJcmV0dXJuIChTdHJpbmcpIG9iajsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIGZvciBhIGdpdmVuIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcAotCSAqICAgICAgICAgICAgbmFtZSBvZiBhIGtleQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIHByb3ApIHsKLQkJcmV0dXJuIGFjY0luZm8uZ2V0KHByb3ApOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNldCBvZiBrZXlzIG9mIHRoZSB0YXJnZXQgQVMgT2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHtAbGluayBTZXR9IG9mIHRoZSBrZXlzLgotCSAqLwotCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRLZXlzKCkgewotCQlyZXR1cm4gYWNjSW5mby5nZXRLZXlzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoYWNjSW5mbyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWNjSW5mby50b1N0cmluZygpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvRmxhc2hQbGF5ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9GbGFzaFBsYXllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTk0ZDJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9GbGFzaFBsYXllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLkFTQnJpZGdlSW1wbFY4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2guRmxhc2hTdGF0dXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5GbGFzaE1TQUFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLkZsYXNoTVNBQU9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUZsYXNoUGxheWVyfQotICogCi0gKiBAc2VlIEZsYXNoUGxheWVyRmFjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgRmxhc2hQbGF5ZXIgaW1wbGVtZW50cyBJRmxhc2hQbGF5ZXIgewotCi0JcHJpdmF0ZSBJRGlzcGF0Y2ggaWRpc3BGbGFzaDsKLQotCXByaXZhdGUgRmxhc2hNU0FBT2JqZWN0IGFjY2Vzc2libGU7Ci0KLQlwcml2YXRlIGludCBzd2ZWZXJzaW9uID0gLTE7Ci0KLQlwcml2YXRlIElBU0JyaWRnZSBhc0JyaWdkZSA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gX2lzVmlzaWJsZTsKLQlwcml2YXRlIGJvb2xlYW4gX2lzUmVhZHkgPSBmYWxzZTsKLQotCUZsYXNoUGxheWVyKElEaXNwYXRjaCBpZGlzcCkgewotCQlpZGlzcEZsYXNoID0gaWRpc3A7Ci0JCXRyeSB7Ci0JCQlhY2Nlc3NpYmxlID0gRmxhc2hNU0FBT2JqZWN0RmFjdG9yeQotCQkJCQkuZ2V0Rmxhc2hNU0FBT2JqZWN0RnJvbUVsZW1lbnQoaWRpc3BGbGFzaCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3aXRob3V0IFVJIChGbGFzaERldGVjdCkKLQkJCV9pc1JlYWR5ID0gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyB3bW9kZSA9IGdldFdNb2RlKCk7Ci0JCWlmIChudWxsICE9IHdtb2RlCi0JCQkJJiYgKFZfT1BBUVVFLmVxdWFsc0lnbm9yZUNhc2Uod21vZGUpIHx8IFZfVFJBTlNQQVJFTlQKLQkJCQkJCS5lcXVhbHNJZ25vcmVDYXNlKHdtb2RlKSkpIHsKLQkJCV9pc1Zpc2libGUgPSBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCV9pc1Zpc2libGUgPSB0cnVlOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5pdEFzQnJpZGdlKCkgewotCQlpZiAobnVsbCAhPSBhc0JyaWdkZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJYXNCcmlnZGUgPSBuZXcgQVNCcmlkZ2VJbXBsVjgodGhpcyk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JRmxhc2hQbGF5ZXIjZ2V0QWNjZXNzaWJsZSgpCi0JICovCi0JcHVibGljIEZsYXNoTVNBQU9iamVjdCBnZXRBY2Nlc3NpYmxlKCkgewotCQlyZXR1cm4gYWNjZXNzaWJsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUZsYXNoUGxheWVyI2lzUmVhZHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZHkoKSB7Ci0JCWlmIChfaXNSZWFkeSkKLQkJCXJldHVybiB0cnVlOwotCQl0cnkgewotCQkJT2JqZWN0IHIgPSBpZGlzcEZsYXNoLmdldChSRUFEWV9TVEFURSk7Ci0JCQlpZiAoQ09NUExFVEVEX1JFQURZX1NUQVRFLmVxdWFscyhyKSkgewotCQkJCV9pc1JlYWR5ID0gdHJ1ZTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotCQlyZXR1cm4gX2lzVmlzaWJsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTQnJpZGdlI2dldFJvb3ROb2RlKCkKLQkgKi8KLQlwdWJsaWMgSUFTTm9kZSBnZXRSb290Tm9kZSgpIHsKLQkJaWYgKGluaXRBc0JyaWRnZSgpKSB7Ci0JCQlyZXR1cm4gYXNCcmlnZGUuZ2V0Um9vdE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTQnJpZGdlI2dldE5vZGVGcm9tUGF0aChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQVNOb2RlIGdldE5vZGVGcm9tUGF0aChTdHJpbmcgcGF0aCkgewotCQlpZiAoaW5pdEFzQnJpZGdlKCkpIHsKLQkJCXJldHVybiBhc0JyaWdkZS5nZXROb2RlRnJvbVBhdGgocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU0JyaWRnZSNnZXROb2RlQXREZXB0aFdpdGhQYXRoKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElBU05vZGUgZ2V0Tm9kZUF0RGVwdGhXaXRoUGF0aChTdHJpbmcgcGF0aCwgaW50IGRlcHRoKSB7Ci0JCWlmIChpbml0QXNCcmlkZ2UoKSkgewotCQkJcmV0dXJuIGFzQnJpZ2RlLmdldE5vZGVBdERlcHRoV2l0aFBhdGgocGF0aCwgZGVwdGgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2UjdHJhbnNsYXRlV2l0aFBhdGgoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUFTTm9kZVtdIHRyYW5zbGF0ZVdpdGhQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCWlmIChpbml0QXNCcmlkZ2UoKSkgewotCQkJcmV0dXJuIGFzQnJpZ2RlLnRyYW5zbGF0ZVdpdGhQYXRoKHBhdGgpOwotCQl9Ci0JCXJldHVybiBuZXcgSUFTTm9kZVswXTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTQnJpZGdlI2hhc0NoaWxkKG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guQVNOb2RlLAotCSAqICAgICAgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZChJQVNOb2RlIHBhcmVudE5vZGUsIGJvb2xlYW4gdmlzdWFsLAotCQkJYm9vbGVhbiBkZWJ1Z01vZGUpIHsKLQkJaWYgKGluaXRBc0JyaWRnZSgpKSB7Ci0JCQlyZXR1cm4gYXNCcmlnZGUuaGFzQ2hpbGQocGFyZW50Tm9kZSwgdmlzdWFsLCBkZWJ1Z01vZGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTQnJpZGdlI2dldENoaWxkcmVuKG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guQVNOb2RlLAotCSAqICAgICAgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSUFTTm9kZVtdIGdldENoaWxkcmVuKElBU05vZGUgcGFyZW50Tm9kZSwgYm9vbGVhbiB2aXN1YWwsCi0JCQlib29sZWFuIGRlYnVnTW9kZSkgewotCQlpZiAoaW5pdEFzQnJpZGdlKCkpIHsKLQkJCXJldHVybiBhc0JyaWdkZS5nZXRDaGlsZHJlbihwYXJlbnROb2RlLCB2aXN1YWwsIGRlYnVnTW9kZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQVNOb2RlWzBdOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2Ujc2VhcmNoVmlkZW8oKQotCSAqLwotCXB1YmxpYyBJQVNOb2RlW10gc2VhcmNoVmlkZW8oKSB7Ci0JCWlmIChpbml0QXNCcmlkZ2UoKSkgewotCQkJcmV0dXJuIGFzQnJpZ2RlLnNlYXJjaFZpZGVvKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQVNOb2RlWzBdOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2Ujc2VhcmNoU291bmQoKQotCSAqLwotCXB1YmxpYyBJQVNOb2RlW10gc2VhcmNoU291bmQoKSB7Ci0JCWlmIChpbml0QXNCcmlkZ2UoKSkgewotCQkJcmV0dXJuIGFzQnJpZ2RlLnNlYXJjaFNvdW5kKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQVNOb2RlWzBdOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2Ujc2V0TWFya2VyKGphdmEubGFuZy5OdW1iZXIsCi0JICogICAgICBqYXZhLmxhbmcuTnVtYmVyLCBqYXZhLmxhbmcuTnVtYmVyLCBqYXZhLmxhbmcuTnVtYmVyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNldE1hcmtlcihOdW1iZXIgeCwgTnVtYmVyIHksIE51bWJlciB3aWR0aCwgTnVtYmVyIGhlaWdodCkgewotCQlpZiAoaW5pdEFzQnJpZGdlKCkpIHsKLQkJCXJldHVybiBhc0JyaWdkZS5zZXRNYXJrZXIoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2Ujc2V0TWFya2VyKG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTTm9kZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXRNYXJrZXIoSUFTTm9kZSBub2RlKSB7Ci0JCWlmIChpbml0QXNCcmlkZ2UoKSkgewotCQkJcmV0dXJuIGFzQnJpZ2RlLnNldE1hcmtlcihub2RlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU0JyaWRnZSN1bnNldE1hcmtlcigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdW5zZXRNYXJrZXIoKSB7Ci0JCWlmIChpbml0QXNCcmlkZ2UoKSkgewotCQkJcmV0dXJuIGFzQnJpZ2RlLnVuc2V0TWFya2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2UjY2xlYXJBbGxNYXJrZXJzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbGVhckFsbE1hcmtlcnMoKSB7Ci0JCWlmIChpbml0QXNCcmlkZ2UoKSkgewotCQkJcmV0dXJuIGFzQnJpZ2RlLmNsZWFyQWxsTWFya2VycygpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTQnJpZGdlI3NldEZvY3VzKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMoU3RyaW5nIHRhcmdldCkgewotCQlpZiAoaW5pdEFzQnJpZGdlKCkpIHsKLQkJCXJldHVybiBhc0JyaWdkZS5zZXRGb2N1cyh0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTQnJpZGdlI2dldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHBhdGgsIFN0cmluZyBwcm9wKSB7Ci0JCWlmIChpbml0QXNCcmlkZ2UoKSkgewotCQkJcmV0dXJuIGFzQnJpZ2RlLmdldFByb3BlcnR5KHBhdGgsIHByb3ApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2Ujc2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHBhdGgsIFN0cmluZyBwcm9wLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKGluaXRBc0JyaWRnZSgpKSB7Ci0JCQlhc0JyaWdkZS5zZXRQcm9wZXJ0eShwYXRoLCBwcm9wLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTQnJpZGdlI3VwZGF0ZVRhcmdldCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlVGFyZ2V0KCkgewotCQlpZiAoaW5pdEFzQnJpZGdlKCkpIHsKLQkJCXJldHVybiBhc0JyaWdkZS51cGRhdGVUYXJnZXQoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU0JyaWRnZSNyZXBhaXJGbGFzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVwYWlyRmxhc2goKSB7Ci0JCWlmIChpbml0QXNCcmlkZ2UoKSkgewotCQkJYXNCcmlnZGUucmVwYWlyRmxhc2goKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2UjY2FsbE1ldGhvZChvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGUsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FsbE1ldGhvZChJQVNOb2RlIHRhcmdldE5vZGUsIFN0cmluZyBtZXRob2QpIHsKLQkJaWYgKGluaXRBc0JyaWRnZSgpKSB7Ci0JCQlyZXR1cm4gYXNCcmlnZGUuY2FsbE1ldGhvZCh0YXJnZXROb2RlLCBtZXRob2QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2UjY2FsbE1ldGhvZChvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGUsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pCi0JICovCi0JcHVibGljIE9iamVjdCBjYWxsTWV0aG9kKElBU05vZGUgdGFyZ2V0Tm9kZSwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0W10gYXJncykgewotCQlpZiAoaW5pdEFzQnJpZGdlKCkpIHsKLQkJCXJldHVybiBhc0JyaWdkZS5jYWxsTWV0aG9kKHRhcmdldE5vZGUsIG1ldGhvZCwgYXJncyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklGbGFzaFBsYXllciNnZXRTdGF0dXMoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gRmxhc2hTdGF0dXNVdGlsLmdldFN0YXR1cyh0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUZsYXNoUGxheWVyI2dldFdNb2RlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdNb2RlKCkgewotCQl0cnkgewotCQkJT2JqZWN0IG9ialdNb2RlID0gaWRpc3BGbGFzaC5nZXQoQVRUUl9XTU9ERSk7Ci0JCQlyZXR1cm4gKFN0cmluZykgb2JqV01vZGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCVN0cmluZyBnZXRWYXJpYWJsZShTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IGlkaXNwRmxhc2guaW52b2tlMShQTEFZRVJfR0VUX1ZBUklBQkxFLCBuYW1lKTsKLQkJCXJldHVybiAoU3RyaW5nKSBvYmo7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JRmxhc2hQbGF5ZXIjZ2V0UGxheWVyUHJvcGVydHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQbGF5ZXJQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWlkaXNwRmxhc2guaW52b2tlKFBMQVlFUl9TRVRfQVRUUklCVVRFLCBuZXcgT2JqZWN0W10gewotCQkJCQlwcm9wZXJ0eU5hbWUsIHZhbHVlIH0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklGbGFzaFBsYXllciNnZXRQbGF5ZXJQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGxheWVyUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IGlkaXNwRmxhc2guZ2V0KHByb3BlcnR5TmFtZSk7Ci0JCQlyZXR1cm4gKFN0cmluZykgb2JqOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUZsYXNoUGxheWVyI2dldFdpbmRvdygpCi0JICovCi0JcHVibGljIGludCBnZXRXaW5kb3coKSB7Ci0JCUZsYXNoTVNBQU9iamVjdCBmb2IgPSBGbGFzaE1TQUFPYmplY3RGYWN0b3J5Ci0JCQkJLmdldEZsYXNoTVNBQU9iamVjdEZyb21FbGVtZW50KGlkaXNwRmxhc2gpOwotCQlyZXR1cm4gZm9iLmdldFdpbmRvdygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JRmxhc2hQbGF5ZXIjZ2V0RGlzcGF0Y2goKQotCSAqLwotCXB1YmxpYyBJRGlzcGF0Y2ggZ2V0RGlzcGF0Y2goKSB7Ci0JCXJldHVybiBpZGlzcEZsYXNoOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JRmxhc2hQbGF5ZXIjZ2V0UGxheWVyVmVyc2lvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbGF5ZXJWZXJzaW9uKCkgewotCQlTdHJpbmcgdmVyc2lvbiA9IGdldFZhcmlhYmxlKFBMQVlFUl9WRVJTSU9OKTsKLQkJaWYgKG51bGwgPT0gdmVyc2lvbikgewotCQkJSUFTTm9kZSB2ZXJzaW9uTm9kZSA9IGdldE5vZGVGcm9tUGF0aChQTEFZRVJfVkVSU0lPTik7Ci0JCQlpZiAobnVsbCAhPSB2ZXJzaW9uTm9kZSkgewotCQkJCXZlcnNpb24gPSB2ZXJzaW9uTm9kZS5nZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JRmxhc2hQbGF5ZXIjZ2V0Q29udGVudFVSTCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VVJMKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gZ2V0VmFyaWFibGUoQ09OVEVOVF9VUkwpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JRmxhc2hQbGF5ZXIjZ2V0U1dGVmVyc2lvbigpCi0JICovCi0JcHVibGljIGludCBnZXRTV0ZWZXJzaW9uKCkgewotCQlpZiAoc3dmVmVyc2lvbiA9PSAtMSkgewotCQkJdHJ5IHsKLQkJCQlPYmplY3QgcmVzdWx0ID0gaWRpc3BGbGFzaC5pbnZva2UwKE1fR0VUX1NXRl9WRVJTSU9OKTsKLQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXN3ZlZlcnNpb24gPSAoKE51bWJlcikgcmVzdWx0KS5pbnRWYWx1ZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3dmVmVyc2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvRmxhc2hQbGF5ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvRmxhc2hQbGF5ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMjkwNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0ZsYXNoUGxheWVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnV0aWwuRmxhc2hNU0FBVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuRmxhc2hNU0FBT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5GbGFzaE1TQUFPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guQ29tU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklEaXNwYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklVbmtub3duOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guUmVzb3VyY2VNYW5hZ2VyOwotCi0vKioKLSAqIEZhY3RvcnkgY2xhc3MgZm9yIHtAbGluayBJRmxhc2hQbGF5ZXJ9Ci0gKi8KLXB1YmxpYyBjbGFzcyBGbGFzaFBsYXllckZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlIHtAbGluayBJRmxhc2hQbGF5ZXJ9IGluc3RhbmNlIGZyb20gcG9pbnRlcgotCSAqIAotCSAqIEBwYXJhbSBwdHIKLQkgKiAgICAgICAgICAgIHRhcmdldCBwb2ludGVyCi0JICogQHJldHVybiB7QGxpbmsgSUZsYXNoUGxheWVyfSBpbnN0YW5jZSBvciBudWxsIGlmIG5vdCBhdmFpbGFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGbGFzaFBsYXllciBnZXRQbGF5ZXJGcm9tUHRyKGludCBwdHIpIHsKLQkJSVVua25vd24gYWNjT2JqZWN0ID0gQ29tU2VydmljZS5uZXdJVW5rbm93bihSZXNvdXJjZU1hbmFnZXIKLQkJCQkubmV3UmVzb3VyY2VNYW5hZ2VyKG51bGwpLCBwdHIsIHRydWUpOwotCQlJRGlzcGF0Y2ggaWRpc3AgPSBGbGFzaE1TQUFVdGlsLmdldEh0bWxFbGVtZW50RnJvbU9iamVjdChhY2NPYmplY3QpOwotCQlpZiAobnVsbCAhPSBpZGlzcCkgewotCQkJcmV0dXJuIG5ldyBGbGFzaFBsYXllcihpZGlzcCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHtAbGluayBJRmxhc2hQbGF5ZXJ9IGluc3RhbmNlIGZyb20gd2luZG93Ci0JICogCi0JICogQHBhcmFtIGh3bmQKLQkgKiAgICAgICAgICAgIHRhcmdldCB3aW5kb3cgaGFuZGxlCi0JICogQHJldHVybiB7QGxpbmsgSUZsYXNoUGxheWVyfSBpbnN0YW5jZSBvciBudWxsIGlmIG5vdCBhdmFpbGFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGbGFzaFBsYXllciBnZXRQbGF5ZXJGcm9tV2luZG93KGludCBod25kKSB7Ci0JCUZsYXNoTVNBQU9iamVjdCBhY2NPYmplY3QgPSBGbGFzaE1TQUFPYmplY3RGYWN0b3J5Ci0JCQkJLmdldEZsYXNoTVNBQU9iamVjdEZyb21XaW5kb3coaHduZCk7Ci0JCUlEaXNwYXRjaCBpZGlzcCA9IEZsYXNoTVNBQVV0aWwuZ2V0SHRtbEVsZW1lbnRGcm9tT2JqZWN0KGFjY09iamVjdCk7Ci0JCWlmIChudWxsICE9IGlkaXNwKSB7Ci0JCQlyZXR1cm4gbmV3IEZsYXNoUGxheWVyKGlkaXNwKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUge0BsaW5rIElGbGFzaFBsYXllcn0gaW5zdGFuY2UgZnJvbSB7QGxpbmsgRmxhc2hNU0FBT2JqZWN0fQotCSAqIAotCSAqIEBwYXJhbSBhY2NPYmplY3QKLQkgKiAgICAgICAgICAgIHRhcmdldCB7QGxpbmsgRmxhc2hNU0FBT2JqZWN0fQotCSAqIEByZXR1cm4ge0BsaW5rIElGbGFzaFBsYXllcn0gaW5zdGFuY2Ugb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmxhc2hQbGF5ZXIgZ2V0UGxheWVyRnJvbU9iamVjdChGbGFzaE1TQUFPYmplY3QgYWNjT2JqZWN0KSB7Ci0JCUlEaXNwYXRjaCBpZGlzcCA9IEZsYXNoTVNBQVV0aWwuZ2V0SHRtbEVsZW1lbnRGcm9tT2JqZWN0KGFjY09iamVjdCk7Ci0JCWlmIChudWxsICE9IGlkaXNwKSB7Ci0JCQlyZXR1cm4gbmV3IEZsYXNoUGxheWVyKGlkaXNwKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUge0BsaW5rIElGbGFzaFBsYXllcn0gaW5zdGFuY2UgZnJvbSB7QGxpbmsgSURpc3BhdGNofQotCSAqIAotCSAqIEBwYXJhbSBpZGlzcAotCSAqICAgICAgICAgICAgdGFyZ2V0IHtAbGluayBJRGlzcGF0Y2h9Ci0JICogQHJldHVybiB7QGxpbmsgSUZsYXNoUGxheWVyfSBpbnN0YW5jZSBvciBudWxsIGlmIG5vdCBhdmFpbGFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGbGFzaFBsYXllciBnZXRQbGF5ZXJGcm9tSURzaXBhdGNoKElEaXNwYXRjaCBpZGlzcCkgewotCQlpZiAobnVsbCAhPSBpZGlzcCkgewotCQkJcmV0dXJuIG5ldyBGbGFzaFBsYXllcihpZGlzcCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvSUFTQnJpZGdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvSUFTQnJpZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNWNiMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0lBU0JyaWRnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gaW1wbGVtZW50IGJyaWRnZSB0aGF0IGVuYWJsZXMgYWNjZXNzIHRvIEFjdGlvblNjcmlwdCBmcm9tIEphdmEKLSAqLwotcHVibGljIGludGVyZmFjZSBJQVNCcmlkZ2UgZXh0ZW5kcyBJRmxhc2hDb25zdCB7Ci0KLQkvKioKLQkgKiBDYWxsIEFjdGlvblNjcmlwdCBtZXRob2Qgb2YgdGFyZ2V0IHtAbGluayBJQVNOb2RlfQotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXROb2RlCi0JICogICAgICAgICAgICB0YXJnZXQgbm9kZQotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiAgICAgICAgICAgIHRhcmdldCBtZXRob2QKLQkgKiBAcmV0dXJuIHJlc3VsdGluZyBPYmplY3QKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGNhbGxNZXRob2QoSUFTTm9kZSB0YXJnZXROb2RlLCBTdHJpbmcgbWV0aG9kKTsKLQotCS8qKgotCSAqIENhbGwgQWN0aW9uU2NyaXB0IG1ldGhvZCBvZiB0YXJnZXQge0BsaW5rIElBU05vZGV9Ci0JICogCi0JICogQHBhcmFtIHRhcmdldE5vZGUKLQkgKiAgICAgICAgICAgIHRhcmdldCBub2RlCi0JICogQHBhcmFtIG1ldGhvZAotCSAqICAgICAgICAgICAgdGFyZ2V0IG1ldGhvZAotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBhcmd1bWVudHMKLQkgKiBAcmV0dXJuIHJlc3VsdGluZyBPYmplY3QKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGNhbGxNZXRob2QoSUFTTm9kZSB0YXJnZXROb2RlLCBTdHJpbmcgbWV0aG9kLAotCQkJT2JqZWN0W10gYXJncyk7Ci0KLQkvKioKLQkgKiBHZXQgY2hpbGRyZW4gb2Ygc3BlY2lmaWVkIHBhcmVudCB7QGxpbmsgSUFTTm9kZX0KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgdGFyZ2V0IHBhcmVudCBub2RlCi0JICogQHBhcmFtIHZpc3VhbAotCSAqICAgICAgICAgICAgPHVsPgotCSAqICAgICAgICAgICAgPGxpPnRydWU6IHVzZSB2aXN1YWwgc3RydWN0dXJlICh1c2UgQVMKLQkgKiAgICAgICAgICAgIDxjb2RlPmdldElubmVyTm9kZXM8L2NvZGU+IG1ldGhvZCk8L2xpPgotCSAqICAgICAgICAgICAgPGxpPmZhbHNlOiB1c2Ugb2JqZWN0IHN0cnVjdHVyZTwvbGk+Ci0JICogICAgICAgICAgICA8L3VsPgotCSAqIEBwYXJhbSBkZWJ1Z01vZGUKLQkgKiAgICAgICAgICAgIDx1bD4KLQkgKiAgICAgICAgICAgIDxsaT50cnVlOiBsaXN0IGFsbCBlbnRpdGllcyBpbmNsdWRpbmcgdGhlIGludGVybmFsIHZhcmlhYmxlcy4KLQkgKiAgICAgICAgICAgIEFwcGFyZW50IHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIGFyZSB1c2VkIGFzIHNwZWNpZmllZCwKLQkgKiAgICAgICAgICAgIGV2ZW4gaWYgdGhlcmUgYXJlIGNpcmN1bGFyIHJlZmVyZW5jZXMuPC9saT4KLQkgKiAgICAgICAgICAgIDxsaT5mYWxzZTogbGlzdCBjaGlsZHJlbiB3aXRob3V0IHRoZSBpbnRlcm5hbCB2YXJpYWJsZXMuCi0JICogICAgICAgICAgICBDaXJjdWxhciByZWZlcmVuY2VzIGFyZSByZW1vdmVkLjwvbGk+Ci0JICogICAgICAgICAgICA8L3VsPgotCSAqIEByZXR1cm4gY2hpbGRyZW4gb2YgdGhlIG5vZGUgYXMge0BsaW5rIElBU05vZGV9IGFycmF5Ci0JICovCi0JcHVibGljIGFic3RyYWN0IElBU05vZGVbXSBnZXRDaGlsZHJlbihJQVNOb2RlIHBhcmVudE5vZGUsIGJvb2xlYW4gdmlzdWFsLAotCQkJYm9vbGVhbiBkZWJ1Z01vZGUpOwotCi0JLyoqCi0JICogR2V0IHtAbGluayBJQVNOb2RlfSBhdCBzcGVjaWZpZWQgZGVwdGggYW5kIHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGFyZ2V0IHBhdGgKLQkgKiBAcGFyYW0gZGVwdGgKLQkgKiAgICAgICAgICAgIHRhcmdldCBkZXB0aAotCSAqIEByZXR1cm4ge0BsaW5rIElBU05vZGV9IG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJQVNOb2RlIGdldE5vZGVBdERlcHRoV2l0aFBhdGgoU3RyaW5nIHBhdGgsIGludCBkZXB0aCk7Ci0KLQkvKioKLQkgKiBHZXQge0BsaW5rIElBU05vZGV9IGF0IHNwZWNpZmllZCBwYXRoCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRhcmdldCBwYXRoCi0JICogQHJldHVybiB7QGxpbmsgSUFTTm9kZX0gb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlCi0JICovCi0JcHVibGljIGFic3RyYWN0IElBU05vZGUgZ2V0Tm9kZUZyb21QYXRoKFN0cmluZyBwYXRoKTsKLQotCS8qKgotCSAqIEdldCBQcm9wZXJ0eSB2YWx1ZSBhdCBzcGVjaWZpZWQgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0YXJnZXQgcGF0aAotCSAqIEBwYXJhbSBwcm9wCi0JICogICAgICAgICAgICB0YXJnZXQgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gcmVzdWx0aW5nIHByb3BlcnR5IHZhbHVlCi0JICovCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcGF0aCwgU3RyaW5nIHByb3ApOwotCi0JLyoqCi0JICogQHJldHVybiByb290IHtAbGluayBJQVNOb2RlfQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJQVNOb2RlIGdldFJvb3ROb2RlKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgdGFyZ2V0IHBhcmVudCB7QGxpbmsgSUFTTm9kZX0KLQkgKiBAcGFyYW0gdmlzdWFsCi0JICogICAgICAgICAgICA8dWw+Ci0JICogICAgICAgICAgICA8bGk+dHJ1ZTogdXNlIHZpc3VhbCBzdHJ1Y3R1cmUgKHVzZSBBUwotCSAqICAgICAgICAgICAgPGNvZGU+Z2V0SW5uZXJOb2RlczwvY29kZT4gbWV0aG9kKTwvbGk+Ci0JICogICAgICAgICAgICA8bGk+ZmFsc2U6IHVzZSBvYmplY3Qgc3RydWN0dXJlPC9saT4KLQkgKiAgICAgICAgICAgIDwvdWw+Ci0JICogQHBhcmFtIGRlYnVnTW9kZQotCSAqICAgICAgICAgICAgPHVsPgotCSAqICAgICAgICAgICAgPGxpPnRydWU6IGNoZWNrIGFsbCBlbnRpdGllcyBpbmNsdWRpbmcgdGhlIGludGVybmFsCi0JICogICAgICAgICAgICB2YXJpYWJsZXMuIEFwcGFyZW50IHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIGFyZSB1c2VkIGFzCi0JICogICAgICAgICAgICBzcGVjaWZpZWQsIGV2ZW4gaWYgdGhlcmUgYXJlIGNpcmN1bGFyIHJlZmVyZW5jZXMuPC9saT4KLQkgKiAgICAgICAgICAgIDxsaT5mYWxzZTogY2hlY2sgd2l0aG91dCB0aGUgaW50ZXJuYWwgdmFyaWFibGVzLiBDaXJjdWxhcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlcyBhcmUgcmVtb3ZlZC48L2xpPgotCSAqICAgICAgICAgICAgPC91bD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcmVudCBub2RlIGhhcyBjaGlsZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc0NoaWxkKElBU05vZGUgcGFyZW50Tm9kZSwgYm9vbGVhbiB2aXN1YWwsCi0JCQlib29sZWFuIGRlYnVnTW9kZSk7Ci0KLQkvKioKLQkgKiBSZXBhaXIgZmxhc2ggY29udGVudAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcGFpckZsYXNoKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNvdW5kIG9iamVjdHMgaW4gdGhlIGNvbnRlbnQgYXMge0BsaW5rIElBU05vZGV9IGFycmF5Ci0JICovCi0JcHVibGljIGFic3RyYWN0IElBU05vZGVbXSBzZWFyY2hTb3VuZCgpOwotCi0JLyoqCi0JICogQHJldHVybiB2aWRlbyBvYmplY3RzIGluIHRoZSBjb250ZW50IGFzIHtAbGluayBJQVNOb2RlfSBhcnJheQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJQVNOb2RlW10gc2VhcmNoVmlkZW8oKTsKLQotCS8qKgotCSAqIEZvY3VzIHNwZWNpZmllZCB0YXJnZXQKLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBmdWxsIGluc3RhbmNlIG5hbWUgb2YgdGhlIG5vZGUKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2VlZGVkCi0JICogCi0JICogQHNlZSBJQVNOb2RlI2dldFRhcmdldCgpCi0JICogQHNlZSBJRmxhc2hDb25zdCNNX1NFVF9GT0NVUwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNldEZvY3VzKFN0cmluZyB0YXJnZXQpOwotCi0JLyoqCi0JICogU2V0IG1hcmtlciBvbiB0aGUgc3BlY2lmaWVkIHtAbGluayBJQVNOb2RlfSBwb3NpdGlvbgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICB0YXJnZXQge0BsaW5rIElBU05vZGV9Ci0JICogQHJldHVybiB0cnVlIGlmIHN1Y2NlZWRlZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNldE1hcmtlcihJQVNOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogU2V0IG1hcmtlciBhdCBzcGVjaWZpZWQgcG9zaXRpb24gYW5kIHNpemUKLQkgKiAKLQkgKiBAcGFyYW0geAotCSAqICAgICAgICAgICAgeCBjb29yZGluYXRlcwotCSAqIEBwYXJhbSB5Ci0JICogICAgICAgICAgICB5IGNvb3JkaW5hdGVzCi0JICogQHBhcmFtIHdpZHRoCi0JICogICAgICAgICAgICB3aWR0aAotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKiAgICAgICAgICAgIGhlaWdodAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZWVkZWQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZXRNYXJrZXIoTnVtYmVyIHgsIE51bWJlciB5LCBOdW1iZXIgd2lkdGgsCi0JCQlOdW1iZXIgaGVpZ2h0KTsKLQotCS8qKgotCSAqIENsZWFyIGFsbCBtYXJrZXJzCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHN1Y2NlZWRlZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNsZWFyQWxsTWFya2VycygpOwotCi0JLyoqCi0JICogU2V0IFByb3BlcnR5IHZhbHVlIGF0IHNwZWNpZmllZCBwYXRoCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRhcmdldCBwYXRoCi0JICogQHBhcmFtIHByb3AKLQkgKiAgICAgICAgICAgIHRhcmdldCBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0YXJnZXQgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcGF0aCwgU3RyaW5nIHByb3AsIE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGFyZ2V0IHBhdGgKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2VlZGVkCi0JICovCi0JcHVibGljIGFic3RyYWN0IElBU05vZGVbXSB0cmFuc2xhdGVXaXRoUGF0aChTdHJpbmcgcGF0aCk7Ci0KLQkvKioKLQkgKiBVbnNldCBjdXJyZW50IG1hcmtlcgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZWVkZWQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiB1bnNldE1hcmtlcigpOwotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHN1Y2NlZWRlZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHVwZGF0ZVRhcmdldCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0lBU05vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9JQVNOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YjgxM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0lBU05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBTaGluIFNBSVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmFzLkFTT2JqZWN0OwotCi0vKioKLSAqIEludGVyZmFjZSB0byBpbXBsZW1lbnQgd3JhcHBlciBjbGFzcyBmb3IgQWN0aW9uU2NyaXB0IE5vZGUgY2xhc3MuIFRoaXMgTm9kZQotICogY2xhc3Mgd3JhcHMgYWxsIHR5cGUgb2YgQWN0aW9uU2NyaXB0IGVudGl0aWVzIChwcmltaXRpdmUgdmFsdWVzLCBzcGVjaWFsCi0gKiB2aXN1YWwgb2JqZWN0cywgYW5kIG90aGVyIG9iamVjdCBpbnN0YW5jZXMpIGFuZCBpdHMgZGVyaXZlZCBpbmZvcm1hdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQVNOb2RlIHsKLQotCS8qKgotCSAqIEByZXR1cm4gaWNvbiB0eXBlIG9mIHRoZSBub2RlCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJY29uVHlwZSgpOwotCi0JLyoqCi0JICogQHJldHVybiB0eXBlIG9mIHRoZSBub2RlCi0JICogQHNlZSBJRmxhc2hDb25zdCNBU05PREVfVFlQRQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBjbGFzcyBuYW1lIG9mIHRoZSBub2RlCi0JICogQHNlZSBJRmxhc2hDb25zdCNBU05PREVfQ0xBU1NfTkFNRQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0IGluc3RhbmNlIG5hbWUgb2YgdGhlIG5vZGUKLQkgKiBAc2VlIElGbGFzaENvbnN0I0FTTk9ERV9PQkpFQ1RfTkFNRQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0T2JqZWN0TmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBmdWxsIGluc3RhbmNlIG5hbWUgb2YgdGhlIG5vZGUKLQkgKiBAc2VlIElGbGFzaENvbnN0I0FTTk9ERV9UQVJHRVQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRhcmdldCgpOwotCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIFVJIENvbXBvbmVudAotCSAqIEBzZWUgSUZsYXNoQ29uc3QjQVNOT0RFX0lTX1VJX0NPTVBPTkVOVAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzVUlDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBub2RlJ3MgdmFsdWUKLQkgKiBAc2VlIElGbGFzaENvbnN0I0FTTk9ERV9WQUxVRQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGV4dCBjb250ZW50IG9mIHRoZSBub2RlLiBUaGlzIG1ldGhvZCBpcyBlcXVhbHMgdG8KLQkgKiAgICAgICAgIDxjb2RlPmdldFRleHQodHJ1ZSk7PC9jb2RlPgotCSAqIEBzZWUgSUZsYXNoQ29uc3QjQVNOT0RFX1RFWFQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRleHQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSB1c2VBY2NOYW1lCi0JICogQHJldHVybiB0ZXh0IGNvbnRlbnQgb2YgdGhlIG5vZGUuIElmIDxjb2RlPnVzZUFjY05hbWU8L2NvZGU+IGlzIHRydWUsCi0JICogICAgICAgICB0cnkgdG8gZ2V0IHRleHQgY29udGVudCBpbmZvcm1hdGlvbiBmcm9tIHtAbGluayBBU0FjY0luZm99Ci0JICogQHNlZSBBU0FjY0luZm8KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRleHQoYm9vbGVhbiB1c2VBY2NOYW1lKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGl0bGUgb2YgdGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRpdGxlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBrZXkgZnJvbSBjb3JyZXNwb25kaW5nIHtAbGluayBBU09iamVjdH0KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgbmFtZSBvZiBhIGtleQotCSAqIEByZXR1cm4gdmFsdWUgZm9yIGdpdmVuIGtleQotCSAqIEBzZWUgQVNPYmplY3QjZ2V0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldE9iamVjdChTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHBhcmVudCB7QGxpbmsgSUFTTm9kZX0gb2YgdGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUFTTm9kZSBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gbGV2ZWwgKGRlcHRoKSBvZiB0aGUgbm9kZSBmcm9tIHJvb3Qge0BsaW5rIElBU05vZGV9IChyb290PTApCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRMZXZlbCgpOwotCi0JLyoqCi0JICogQHBhcmFtIHZpc3VhbAotCSAqICAgICAgICAgICAgPHVsPgotCSAqICAgICAgICAgICAgPGxpPnRydWU6IHVzZSB2aXN1YWwgc3RydWN0dXJlICh1c2UgQVMKLQkgKiAgICAgICAgICAgIDxjb2RlPmdldElubmVyTm9kZXM8L2NvZGU+IG1ldGhvZCk8L2xpPgotCSAqICAgICAgICAgICAgPGxpPmZhbHNlOiB1c2Ugb2JqZWN0IHN0cnVjdHVyZTwvbGk+Ci0JICogICAgICAgICAgICA8L3VsPgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBoYXMgY2hpbGQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNDaGlsZChib29sZWFuIHZpc3VhbCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlzdWFsCi0JICogICAgICAgICAgICA8dWw+Ci0JICogICAgICAgICAgICA8bGk+dHJ1ZTogdXNlIHZpc3VhbCBzdHJ1Y3R1cmUgKHVzZSBBUwotCSAqICAgICAgICAgICAgPGNvZGU+Z2V0SW5uZXJOb2RlczwvY29kZT4gbWV0aG9kKTwvbGk+Ci0JICogICAgICAgICAgICA8bGk+ZmFsc2U6IHVzZSBvYmplY3Qgc3RydWN0dXJlPC9saT4KLQkgKiAgICAgICAgICAgIDwvdWw+Ci0JICogQHBhcmFtIGVudGlyZQotCSAqICAgICAgICAgICAgPHVsPgotCSAqICAgICAgICAgICAgPGxpPnRydWU6IGNoZWNrIGFsbCBlbnRpdGllcyBpbmNsdWRpbmcgdGhlIGludGVybmFsCi0JICogICAgICAgICAgICB2YXJpYWJsZXMuIEFwcGFyZW50IHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzIGFyZSB1c2VkIGFzCi0JICogICAgICAgICAgICBzcGVjaWZpZWQsIGV2ZW4gaWYgdGhlcmUgYXJlIGNpcmN1bGFyIHJlZmVyZW5jZXMuPC9saT4KLQkgKiAgICAgICAgICAgIDxsaT5mYWxzZTogY2hlY2sgd2l0aG91dCB0aGUgaW50ZXJuYWwgdmFyaWFibGVzLiBDaXJjdWxhcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlcyBhcmUgcmVtb3ZlZC48L2xpPgotCSAqICAgICAgICAgICAgPC91bD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaGFzIGNoaWxkCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzQ2hpbGQoYm9vbGVhbiB2aXN1YWwsIGJvb2xlYW4gZW50aXJlKTsKLQotCS8qKgotCSAqIEBwYXJhbSB2aXN1YWwKLQkgKiAgICAgICAgICAgIDx1bD4KLQkgKiAgICAgICAgICAgIDxsaT50cnVlOiB1c2UgdmlzdWFsIHN0cnVjdHVyZSAodXNlIEFTCi0JICogICAgICAgICAgICA8Y29kZT5nZXRJbm5lck5vZGVzPC9jb2RlPiBtZXRob2QpPC9saT4KLQkgKiAgICAgICAgICAgIDxsaT5mYWxzZTogdXNlIG9iamVjdCBzdHJ1Y3R1cmU8L2xpPgotCSAqICAgICAgICAgICAgPC91bD4KLQkgKiAKLQkgKiBAcmV0dXJuIGNoaWxkcmVuIG9mIHRoZSBub2RlIGFzIHtAbGluayBJQVNOb2RlfSBhcnJheQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJQVNOb2RlW10gZ2V0Q2hpbGRyZW4oYm9vbGVhbiB2aXN1YWwpOwotCi0JLyoqCi0JICogTGlzdCBhbGwgZW50aXRpZXMgaW5jbHVkaW5nIHRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgYmFzZWQgb24gb2JqZWN0Ci0JICogc3RydWN0dXJlLiBBcHBhcmVudCBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcyBhcmUgdXNlZCBhcyBzcGVjaWZpZWQsCi0JICogZXZlbiBpZiB0aGVyZSBhcmUgY2lyY3VsYXIgcmVmZXJlbmNlcy4gVGhpcyBtZXRob2QgaXMgaW50ZW5kIHRvIHNob3cgYWxsCi0JICogRmxhc2ggZW50aXRpZXMgZm9yIGRlYnVnIHB1cnBvc2UuCi0JICogCi0JICogQHJldHVybiBjaGlsZHJlbiBvZiB0aGUgbm9kZSBhcyB7QGxpbmsgSUFTTm9kZX0gYXJyYXkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUFTTm9kZVtdIGdldEVudGlyZUNoaWxkcmVuKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGhpZ2hsaWdodCB0aGUgbm9kZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNldE1hcmtlcigpOwotCi0JLyoqCi0JICogQHJldHVybiB7QGxpbmsgSUZsYXNoUGxheWVyfSB0aGF0IGNvbnRhaW5zIHRoZSBub2RlCi0JICovCi0JcHVibGljIGFic3RyYWN0IElGbGFzaFBsYXllciBnZXRQbGF5ZXIoKTsKLQotCS8qKgotCSAqIEByZXR1cm4ge0BsaW5rIEFTQWNjSW5mb30gb2YgdGhlIG5vZGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgQVNBY2NJbmZvIGdldEFjY0luZm8oKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHtAbGluayBTZXR9IG9mIGtleXMgb2YgY29ycmVzcG9uZGluZyB7QGxpbmsgQVNPYmplY3R9Ci0JICogCi0JICogQHJldHVybiBTZXQgb2Yga2V5cwotCSAqIEBzZWUgQVNPYmplY3QjZ2V0S2V5cygpCi0JICovCi0JcHVibGljIGFic3RyYWN0IFNldDxTdHJpbmc+IGdldEtleXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbm9kZSBpcyBCdXR0b24gY29tcG9uZW50IGFuZCBpdHMgb25SZWxlYXNlIGhhbmRsZXIgaXMKLQkgKiAgICAgICAgIGRlZmluZWQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzT25SZWxlYXNlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHggY29vcmRpbmF0ZSBvZiB0aGUgbm9kZQotCSAqIEBzZWUgSUZsYXNoQ29uc3QjQVNOT0RFX1gKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldFgoKTsKLQotCS8qKgotCSAqIEByZXR1cm4geSBjb29yZGluYXRlIG9mIHRoZSBub2RlCi0JICogQHNlZSBJRmxhc2hDb25zdCNBU05PREVfWQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBkb3VibGUgZ2V0WSgpOwotCi0JLyoqCi0JICogQHJldHVybiB3aWR0aCBvZiB0aGUgbm9kZQotCSAqIEBzZWUgSUZsYXNoQ29uc3QjQVNOT0RFX1dJRFRICi0JICovCi0JcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXRXaWR0aCgpOwotCi0JLyoqCi0JICogQHJldHVybiBoZWlnaHQgb2YgdGhlIG5vZGUKLQkgKiBAc2VlIElGbGFzaENvbnN0I0FTTk9ERV9IRUlHSFQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldEhlaWdodCgpOwotCi0JLyoqCi0JICogQHJldHVybiBJRCBvZiB0aGUgbm9kZQotCSAqIEBzZWUgSUZsYXNoQ29uc3QjQVNOT0RFX0lECi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRJZCgpOwotCi0JLyoqCi0JICogQHJldHVybiBkZXB0aCAoYWthIHotb2Rlcikgb2YgdGhlIG5vZGUKLQkgKiBAc2VlIElGbGFzaENvbnN0I0FTTk9ERV9ERVBUSAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RGVwdGgoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gY3VycmVudCBmcmFtZSBvZiB0aGUgbm9kZQotCSAqIEBzZWUgSUZsYXNoQ29uc3QjQVNOT0RFX0NVUlJFTlRfRlJBTUUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldEN1cnJlbnRGcmFtZSgpOwotCi0JLyoqCi0JICogQHJldHVybiB0YWIgaW5kZXggb2YgdGhlIG5vZGUKLQkgKiBAc2VlIElGbGFzaENvbnN0I0FTTk9ERV9UQUJfSU5ERVgKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldFRhYkluZGV4KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgaXMgaW5wdXQtYWJsZSBieSB1c2Vycy4KLQkgKiBAc2VlIElGbGFzaENvbnN0I0FTTk9ERV9JU19JTlBVVEFCTEUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0lucHV0YWJsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBzeXN0ZW0gc2hvdWxkIHRyYXZlcnNlIGludG8gaXRzIGNoaWxkcmVuLgotCSAqIEBzZWUgSUZsYXNoQ29uc3QjQVNOT0RFX0lTX09QQVFVRV9PQkpFQ1QKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc09wYXF1ZU9iamVjdCgpOwotCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGFjY2Vzc2liaWxpdHkgcHJvcGVydHkgbm9kZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWNjUHJvcGVydGllcygpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0lGbGFzaENvbnN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvSUZsYXNoQ29uc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlNjhlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvSUZsYXNoQ29uc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2g7Ci0KLS8qKgotICogSW50ZXJmYWNlIGhvbGRpbmcgY29uc3RhbnRzIHVzZWQgYnkgRmxhc2ggcmVsYXRlZCBjbGFzc2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGbGFzaENvbnN0IHsKLQotCS8vIGdlbmVyYWwKLQkvKioKLQkgKiBDbGFzcyBJRCB2YWx1ZSBmb3IgRmxhc2ggUGxheWVyIGNvbXBvbmVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTFNJRF9GTEFTSCA9ICJ7RDI3Q0RCNkUtQUU2RC0xMUNGLTk2QjgtNDQ0NTUzNTQwMDAwfSI7Ci0JLyoqCi0JICogQWN0aW9uU2NyaXB0IHZhbHVlIHdoaWNoIG1lYW5zIGludmFsaWQgZGVwdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0RFUFRIID0gLTE2Mzg0OwotCS8qKgotCSAqIE5hbWUgb2YgdGhlIEFjdGlvblNjcmlwdCB2YXJpYWJsZSBmb3IgRmxhc2ggUGxheWVyIHZlcnNpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBWUVSX1ZFUlNJT04gPSAiJHZlcnNpb24iOwotCS8qKgotCSAqIE5hbWUgb2YgdGhlIEFjdGlvblNjcmlwdCB2YXJpYWJsZSBmb3IgdGhlIFVSTCBmcm9tIHdoaWNoIHRoZSBGbGFzaCBtb3ZpZQotCSAqIGlzIGRvd25sb2FkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9VUkwgPSAiX3VybCI7Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGFjY0ltcGwgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ19JTVBMID0gIl9hY2NJbXBsIjsKLQkvKioKLQkgKiBOYW1lIG9mIGFjY1Byb3BzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NfUFJPUFMgPSAiX2FjY1Byb3BzIjsKLQotCS8vIEJyb3dzZXIgUmVhZHkgU3RhdGUKLQkvKioKLQkgKiBOYW1lIG9mIHRoZSB2YXJpYWJsZSBmb3IgYnJvd3NlcidzIHJlYWR5IHN0YXRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURZX1NUQVRFID0gInJlYWR5U3RhdGUiOwotCS8qKgotCSAqIFZhbHVlIG9mIHJlYWR5IHN0YXRlIHdoaWNoIG1lYW5zICJjb21wbGV0ZSIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENPTVBMRVRFRF9SRUFEWV9TVEFURSA9IEludGVnZXIudmFsdWVPZig0KTsKLQotCS8vIGluaXRpYWxpemUKLQkvKioKLQkgKiBBY3Rpb25TY3JpcHQgdmFyaWFibGUgbmFtZSB3aGljaCBkZW5vdGVzIHRoZSAiTGV2ZWwgMCIsIGludG8gd2hpY2ggdGhlCi0JICogcm9vdCBTV0YgaXMgbG9hZGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfUk9PVExFVkVMID0gIl9sZXZlbDAiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQWN0aW9uU2NyaXB0IHZhcmlhYmxlIG5hbWUgd2hpY2ggZGVub3RlcyB0aGUgIkxldmVsIDUzNTUzIiwgaW50byB3aGljaAotCSAqIHRoZSBicmlkZ2UgU1dGIGlzIGxvYWRlZC4gNTM1NTMgaXMgY2hvb3NlZCBzbyB0aGF0IEZsYXNoIGRldmVsb3BlcnMKLQkgKiByYXJlbHkgdXNlIHRoZSBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0JSSURHRUxFVkVMID0gIl9sZXZlbDUzNTUzIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEFjdGlvblNjcmlwdCB2YXJpYWJsZSBuYW1lIHdoaWNoIGRlbm90ZXMgdGhlIGF2YWlsYWJpbGl0eSBvZiBvdXIgYnJpZGdlCi0JICogbWVjaGFuaXNtLiBJZiB0aGUgYnJpZGdlIGlzIGNvcnJlY3RseSBpbmplY3RlZCwgdGhpcyB2YXJpYWJsZSBpcwotCSAqIGFjY2Vzc2libGUgZnJvbSB0aGUgZXh0ZXJuYWwgcHJvZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0lTX0FWQUlMQUJMRSA9ICIuRWNsaXBzZV9BQ1RGX2lzX2F2YWlsYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBBY3Rpb25TY3JpcHQgdmFyaWFibGUgbmFtZSB3aGljaCBkZW5vdGVzIHRoZSBjb250ZW50IElEIG9mIHRoZSBGbGFzaAotCSAqIG1vdmllLiBUaGUgQUNURiBwcm94eSBhbmQgYm9vdCBsb2FkZXIgc2V0IHRoZSBJRCBmb3IgYXV0aGVudGljYXRpb24KLQkgKiBiZXR3ZWVuIHRoZSBwcm9ncmFtIHVzaW5nIHRoaXMgY2xhc3MgYW5kIGJyb3dzZXIgY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfQ09OVEVOVF9JRCA9ICIuRWNsaXBzZV9BQ1RGX1NXRl9DT05URU5UX0lEIjsKLQotCS8vIG90aGVyIHBhdGhzCi0JLyoqCi0JICogQWN0aW9uU2NyaXB0IHZhcmlhYmxlIG5hbWUgd2hpY2ggZGVub3RlcyB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBzdG9yZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0dMT0JBTCA9ICJfZ2xvYmFsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWN0aW9uU2NyaXB0IHZhcmlhYmxlIG5hbWUgd2hpY2ggZGVub3RlcyB0aGUgbW91c2UgKGJ1dHRvbiBwcmVzc2luZykKLQkgKiBldmVudCBoYW5kbGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfT05fUFJFU1MgPSAiLm9uUHJlc3MiOwotCS8qKgotCSAqIEFjdGlvblNjcmlwdCB2YXJpYWJsZSBuYW1lIHdoaWNoIGRlbm90ZXMgdGhlIG1vdXNlIChidXR0b24gcmVsZWFzaW5nKQotCSAqIGV2ZW50IGhhbmRsZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9PTl9SRUxFQVNFID0gIi5vblJlbGVhc2UiOwotCi0JLy8gVjgKLQkvKioKLQkgKiBBY3Rpb25TY3JpcHQgdmFyaWFibGUgbmFtZSB0byB3aGljaCB3ZSBwdXQgcmVxdWVzdCBhcmd1bWVudHMgdG8gdGhlCi0JICogYnJpZGdlIEZsYXNoIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1JFUVVFU1RfQVJHUyA9ICIuRWNsaXBzZV9BQ1RGX3JlcXVlc3RfYXJncyI7Ci0JLyoqCi0JICogQWN0aW9uU2NyaXB0IHZhcmlhYmxlIG5hbWUgZnJvbSB3aGljaCB3ZSBnZXQgcmVzcG9uc2UgZnJvbSB0aGUgYnJpZGdlCi0JICogRmxhc2ggY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUkVTUE9OU0VfVkFMVUUgPSAiLkVjbGlwc2VfQUNURl9yZXNwb25zZV92YWx1ZSI7Ci0JLyoqCi0JICogRmxhc2ggUGxheWVyIG1ldGhvZCBuYW1lIHRvIHNldCBhIHZhbHVlIHRvIGEgQWN0aW9uU2NyaXB0IHZhcmlhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVlFUl9TRVRfVkFSSUFCTEUgPSAiU2V0VmFyaWFibGUiOwotCS8qKgotCSAqIEZsYXNoIFBsYXllciBtZXRob2QgbmFtZSB0byBnZXQgYSB2YWx1ZSBmcm9tIGEgQWN0aW9uU2NyaXB0IHZhcmlhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVlFUl9HRVRfVkFSSUFCTEUgPSAiR2V0VmFyaWFibGUiOwotCi0JLy8gSFRNTCBub2RlIGF0dHJpYnV0ZXMKLQkvKioKLQkgKiBIVE1MIERPTSBBUEkgbWV0aG9kIG5hbWUgdG8gc2V0IGF0dHJpYnV0ZXMgdG8gZWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBWUVSX1NFVF9BVFRSSUJVVEUgPSAiU2V0QXR0cmlidXRlIjsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFZRVJfR0VUX0FUVFJJQlVURSA9ICJHZXRBdHRyaWJ1dGUiOwotCS8qKgotCSAqIEhUTUwgYXR0cmlidXRlIG5hbWUgZm9yIEZsYXNoIFBsYXllciB3aW5kb3cgbW9kZSwgd2hpY2ggYmVsb25ncyB0bwotCSAqIDxjb2RlPm9iamVjdDwvY29kZT4gYW5kL29yIDxjb2RlPmVtYmVkPC9jb2RlPiB0YWdzLgotCSAqIAotCSAqIEBzZWUgI1ZfVFJBTlNQQVJFTlQKLQkgKiBAc2VlICNWX09QQVFVRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfV01PREUgPSAiV01vZGUiOwotCS8qKgotCSAqIEhUTUwgYXR0cmlidXRlIHZhbHVlIGZvciBGbGFzaCBQbGF5ZXIgd2luZG93IG1vZGUsIHdoaWNoIGRlbm90ZXMKLQkgKiB0cmFuc3BhcmVudCB3aW5kb3cgbW9kZS4KLQkgKiAKLQkgKiBAc2VlICNBVFRSX1dNT0RFCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVl9UUkFOU1BBUkVOVCA9ICJUcmFuc3BhcmVudCI7Ci0JLyoqCi0JICogSFRNTCBhdHRyaWJ1dGUgdmFsdWUgZm9yIEZsYXNoIFBsYXllciB3aW5kb3cgbW9kZSwgd2hpY2ggZGVub3RlcyBvcGFxdWUKLQkgKiB3aW5kb3cgbW9kZS4KLQkgKiAKLQkgKiBAc2VlICNBVFRSX1dNT0RFCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVl9PUEFRVUUgPSAiT3BhcXVlIjsKLQotCS8vIG1ldGhvZHMKLQkvKioKLQkgKiBOYW1lIG9mIGFuIEFjdGlvblNjcmlwdCBtZXRob2QsIHdoaWNoIGlzIGRlZmluZWQgYW5kIGV4cG9zZWQgYnkgYm9vdAotCSAqIGxvYWRlciBGbGFzaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTV9HRVRfUk9PVF9OT0RFID0gImdldFJvb3ROb2RlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5hbWUgb2YgYW4gQWN0aW9uU2NyaXB0IG1ldGhvZCwgd2hpY2ggaXMgZGVmaW5lZCBhbmQgZXhwb3NlZCBieSBib290Ci0JICogbG9hZGVyIEZsYXNoIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX0dFVF9OVU1fU1VDQ0VTU09SX05PREVTID0gImdldE51bVN1Y2Nlc3Nvck5vZGVzIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5hbWUgb2YgYW4gQWN0aW9uU2NyaXB0IG1ldGhvZCwgd2hpY2ggaXMgZGVmaW5lZCBhbmQgZXhwb3NlZCBieSBib290Ci0JICogbG9hZGVyIEZsYXNoIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX0dFVF9TVUNDRVNTT1JfTk9ERVMgPSAiZ2V0U3VjY2Vzc29yTm9kZXMiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTmFtZSBvZiBhbiBBY3Rpb25TY3JpcHQgbWV0aG9kLCB3aGljaCBpcyBkZWZpbmVkIGFuZCBleHBvc2VkIGJ5IGJvb3QKLQkgKiBsb2FkZXIgRmxhc2ggY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1fR0VUX05VTV9DSElMRF9OT0RFUyA9ICJnZXROdW1DaGlsZE5vZGVzIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5hbWUgb2YgYW4gQWN0aW9uU2NyaXB0IG1ldGhvZCwgd2hpY2ggaXMgZGVmaW5lZCBhbmQgZXhwb3NlZCBieSBib290Ci0JICogbG9hZGVyIEZsYXNoIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX0dFVF9DSElMRF9OT0RFUyA9ICJnZXRDaGlsZE5vZGVzIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5hbWUgb2YgYW4gQWN0aW9uU2NyaXB0IG1ldGhvZCwgd2hpY2ggaXMgZGVmaW5lZCBhbmQgZXhwb3NlZCBieSBib290Ci0JICogbG9hZGVyIEZsYXNoIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX0dFVF9JTk5FUl9OT0RFUyA9ICJnZXRJbm5lck5vZGVzIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5hbWUgb2YgYW4gQWN0aW9uU2NyaXB0IG1ldGhvZCwgd2hpY2ggaXMgZGVmaW5lZCBhbmQgZXhwb3NlZCBieSBib290Ci0JICogbG9hZGVyIEZsYXNoIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX05FV19NQVJLRVIgPSAibmV3TWFya2VyIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5hbWUgb2YgYW4gQWN0aW9uU2NyaXB0IG1ldGhvZCwgd2hpY2ggaXMgZGVmaW5lZCBhbmQgZXhwb3NlZCBieSBib290Ci0JICogbG9hZGVyIEZsYXNoIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX1NFVF9NQVJLRVIgPSAic2V0TWFya2VyIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5hbWUgb2YgYW4gQWN0aW9uU2NyaXB0IG1ldGhvZCwgd2hpY2ggaXMgZGVmaW5lZCBhbmQgZXhwb3NlZCBieSBib290Ci0JICogbG9hZGVyIEZsYXNoIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX0dFVF9OT0RFX0ZST01fUEFUSCA9ICJnZXROb2RlRnJvbVBhdGgiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOYW1lIG9mIGFuIEFjdGlvblNjcmlwdCBtZXRob2QsIHdoaWNoIGlzIGRlZmluZWQgYW5kIGV4cG9zZWQgYnkgYm9vdAotCSAqIGxvYWRlciBGbGFzaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTV9DQUxMX01FVEhPRCA9ICJjYWxsTWV0aG9kQSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE5hbWUgb2YgYW4gQWN0aW9uU2NyaXB0IG1ldGhvZCwgd2hpY2ggaXMgZGVmaW5lZCBhbmQgZXhwb3NlZCBieSBib290Ci0JICogbG9hZGVyIEZsYXNoIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX1NFVF9GT0NVUyA9ICJzZXRGb2N1cyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOYW1lIG9mIGFuIEFjdGlvblNjcmlwdCBtZXRob2QsIHdoaWNoIGlzIGRlZmluZWQgYW5kIGV4cG9zZWQgYnkgYm9vdAotCSAqIGxvYWRlciBGbGFzaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTV9VUERBVEVfVEFSR0VUID0gInVwZGF0ZVRhcmdldCI7Ci0JLyoqCi0JICogTmFtZSBvZiBhbiBBY3Rpb25TY3JpcHQgbWV0aG9kLCB3aGljaCBpcyBkZWZpbmVkIGFuZCBleHBvc2VkIGJ5IGJvb3QKLQkgKiBsb2FkZXIgRmxhc2ggY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1fUkVQQUlSX0ZMQVNIID0gInJlcGFpckZsYXNoIjsKLQkvKioKLQkgKiBOYW1lIG9mIGFuIEFjdGlvblNjcmlwdCBtZXRob2QsIHdoaWNoIGlzIGRlZmluZWQgYW5kIGV4cG9zZWQgYnkgYm9vdAotCSAqIGxvYWRlciBGbGFzaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTV9TRVRfUFJPUEVSVFkgPSAic2V0UHJvcGVydHkiOwotCS8qKgotCSAqIE5hbWUgb2YgYW4gQWN0aW9uU2NyaXB0IG1ldGhvZCwgd2hpY2ggaXMgZGVmaW5lZCBhbmQgZXhwb3NlZCBieSBib290Ci0JICogbG9hZGVyIEZsYXNoIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX0dFVF9QUk9QRVJUWSA9ICJnZXRQcm9wZXJ0eSI7Ci0JLyoqCi0JICogTmFtZSBvZiBhbiBBY3Rpb25TY3JpcHQgbWV0aG9kLCB3aGljaCBpcyBkZWZpbmVkIGFuZCBleHBvc2VkIGJ5IGJvb3QKLQkgKiBsb2FkZXIgRmxhc2ggY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1fVFJBTlNMQVRFID0gInRyYW5zbGF0ZSI7Ci0JLyoqCi0JICogTmFtZSBvZiBhbiBBY3Rpb25TY3JpcHQgbWV0aG9kLCB3aGljaCBpcyBkZWZpbmVkIGFuZCBleHBvc2VkIGJ5IGJvb3QKLQkgKiBsb2FkZXIgRmxhc2ggY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1fR0VUX05PREVfQVRfREVQVEggPSAiZ2V0Tm9kZUF0RGVwdGgiOwotCS8qKgotCSAqIE5hbWUgb2YgYW4gQWN0aW9uU2NyaXB0IG1ldGhvZCwgd2hpY2ggaXMgZGVmaW5lZCBhbmQgZXhwb3NlZCBieSBib290Ci0JICogbG9hZGVyIEZsYXNoIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX1VOU0VUX01BUktFUiA9ICJ1bnNldE1hcmtlciI7Ci0JLyoqCi0JICogTmFtZSBvZiBhbiBBY3Rpb25TY3JpcHQgbWV0aG9kLCB3aGljaCBpcyBkZWZpbmVkIGFuZCBleHBvc2VkIGJ5IGJvb3QKLQkgKiBsb2FkZXIgRmxhc2ggY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1fQ0xFQVJfQUxMX01BUktFUlMgPSAiY2xlYXJBbGxNYXJrZXJzIjsKLQkvKioKLQkgKiBOYW1lIG9mIGFuIEFjdGlvblNjcmlwdCBtZXRob2QsIHdoaWNoIGlzIGRlZmluZWQgYW5kIGV4cG9zZWQgYnkgYm9vdAotCSAqIGxvYWRlciBGbGFzaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTV9PTl9ST0xMX09VVCA9ICJvblJvbGxPdXQiOwotCS8qKgotCSAqIE5hbWUgb2YgYW4gQWN0aW9uU2NyaXB0IG1ldGhvZCwgd2hpY2ggaXMgZGVmaW5lZCBhbmQgZXhwb3NlZCBieSBib290Ci0JICogbG9hZGVyIEZsYXNoIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX09OX1JPTExfT1ZFUiA9ICJvblJvbGxPdmVyIjsKLQkvKioKLQkgKiBOYW1lIG9mIGFuIEFjdGlvblNjcmlwdCBtZXRob2QsIHdoaWNoIGlzIGRlZmluZWQgYW5kIGV4cG9zZWQgYnkgYm9vdAotCSAqIGxvYWRlciBGbGFzaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTV9PTl9QUkVTUyA9ICJvblByZXNzIjsKLQkvKioKLQkgKiBOYW1lIG9mIGFuIEFjdGlvblNjcmlwdCBtZXRob2QsIHdoaWNoIGlzIGRlZmluZWQgYW5kIGV4cG9zZWQgYnkgYm9vdAotCSAqIGxvYWRlciBGbGFzaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTV9PTl9SRUxFQVNFID0gIm9uUmVsZWFzZSI7Ci0KLQkvLyBtZXRob2RzIGZvciBtZWRpYSBjb250cm9sCi0JLyoqCi0JICogTmFtZSBvZiBhbiBBY3Rpb25TY3JpcHQgbWV0aG9kLCB3aGljaCBpcyBkZWZpbmVkIGFuZCBleHBvc2VkIGJ5IGJvb3QKLQkgKiBsb2FkZXIgRmxhc2ggY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1fU0VBUkNIX1NPVU5EID0gInNlYXJjaFNvdW5kIjsKLQkvKioKLQkgKiBOYW1lIG9mIGFuIEFjdGlvblNjcmlwdCBtZXRob2QsIHdoaWNoIGlzIGRlZmluZWQgYW5kIGV4cG9zZWQgYnkgYm9vdAotCSAqIGxvYWRlciBGbGFzaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTV9TRUFSQ0hfVklERU8gPSAic2VhcmNoVmlkZW8iOwotCS8qKgotCSAqIE5hbWUgb2YgYW4gQWN0aW9uU2NyaXB0IG1ldGhvZCwgd2hpY2ggaXMgZGVmaW5lZCBhbmQgZXhwb3NlZCBieSBib290Ci0JICogbG9hZGVyIEZsYXNoIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX0dFVF9DVVJSRU5UX1BPU0lUSU9OID0gImdldEN1cnJlbnRQb3NpdGlvbiI7Ci0JLyoqCi0JICogTmFtZSBvZiBhbiBBY3Rpb25TY3JpcHQgbWV0aG9kLCB3aGljaCBpcyBkZWZpbmVkIGFuZCBleHBvc2VkIGJ5IGJvb3QKLQkgKiBsb2FkZXIgRmxhc2ggY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1fUEFVU0UgPSAicGF1c2UiOwotCS8qKgotCSAqIE5hbWUgb2YgYW4gQWN0aW9uU2NyaXB0IG1ldGhvZCwgd2hpY2ggaXMgZGVmaW5lZCBhbmQgZXhwb3NlZCBieSBib290Ci0JICogbG9hZGVyIEZsYXNoIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNX1BMQVkgPSAicGxheSI7Ci0JLyoqCi0JICogTmFtZSBvZiBhbiBBY3Rpb25TY3JpcHQgbWV0aG9kLCB3aGljaCBpcyBkZWZpbmVkIGFuZCBleHBvc2VkIGJ5IGJvb3QKLQkgKiBsb2FkZXIgRmxhc2ggY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1fU1RPUCA9ICJzdG9wIjsKLQkvKioKLQkgKiBOYW1lIG9mIGFuIEFjdGlvblNjcmlwdCBtZXRob2QsIHdoaWNoIGlzIGRlZmluZWQgYW5kIGV4cG9zZWQgYnkgYm9vdAotCSAqIGxvYWRlciBGbGFzaCBjb21wb25lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTV9TRVRfVk9MVU1FID0gInNldFZvbHVtZSI7Ci0JLyoqCi0JICogTmFtZSBvZiBhbiBBY3Rpb25TY3JpcHQgbWV0aG9kLCB3aGljaCBpcyBkZWZpbmVkIGFuZCBleHBvc2VkIGJ5IGJvb3QKLQkgKiBsb2FkZXIgRmxhc2ggY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1fR0VUX1ZPTFVNRSA9ICJnZXRWb2x1bWUiOwotCi0JLy8gVjkKLQkvKioKLQkgKiBOYW1lIG9mIGFuIEFjdGlvblNjcmlwdCBtZXRob2QsIHdoaWNoIHdlIGNhbGwgdG8gcHV0IHJlcXVlc3QgdG8gdGhlIEZsYXNoCi0JICogYnJpZGdlIGNvbXBvbmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQQVRDSF9NRVRIT0QgPSAiZGlzcGF0Y2hNZXRob2QiOwotCS8qKgotCSAqIE5hbWUgb2YgYW4gQWN0aW9uU2NyaXB0IG1ldGhvZCB0byBnZXQgdGhlIHZlcnNpb24gb2YgYSB0YXJnZXQgU1dGLiBUaGlzCi0JICogbWV0aG9kIGlzIGRlZmluZWQgYW5kIGV4cG9zZWQgYnkgRmxhc2ggYm9vdCBsb2FkZXIgY29tcG9uZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1fR0VUX1NXRl9WRVJTSU9OID0gImdldFN3ZlZlcnNpb24iOwotCS8qKgotCSAqIEFjdGlvblNjcmlwdCB2YXJpYWJsZSBuYW1lIHdoaWNoIGRlbm90ZXMgdGhlIGNvbnRlbnQgSUQgb2YgdGhlIEZsYXNoCi0JICogbW92aWUuIFRoZSBBQ1RGIHByb3h5IGFuZCBib290IGxvYWRlciBzZXQgdGhlIElEIGZvciBhdXRoZW50aWNhdGlvbgotCSAqIGJldHdlZW4gdGhlIHByb2dyYW0gdXNpbmcgdGhpcyBjbGFzcyBhbmQgYnJvd3NlciBjb21wb25lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTV9HRVRfQ09OVEVOVF9JRCA9ICJnZXRDb250ZW50SWQiOwotCS8vIFY5Ci0KLQkvLyBBU05PREUKLQkvKioKLQkgKiBQcm9wZXJ0eSBuYW1lIG9mIGluc3RhbmNlIGltcGxlbWVudGluZyB7QGxpbmsgSUFTTm9kZX0sIHdoaWNoIGRlbm90ZXMKLQkgKiB0aGUgdHlwZSBvZiB0aGUgbm9kZSAob2YgdHlwZSB7QGxpbmsgU3RyaW5nfSkuCi0JICogCi0JICogQHNlZSBJQVNOb2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNOT0RFX1RZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBQcm9wZXJ0eSBuYW1lIG9mIGluc3RhbmNlIGltcGxlbWVudGluZyB7QGxpbmsgSUFTTm9kZX0sIHdoaWNoIGRlbm90ZXMKLQkgKiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgbm9kZSAob2YgdHlwZSB7QGxpbmsgU3RyaW5nfSkuCi0JICogCi0JICogQHNlZSBJQVNOb2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNOT0RFX0NMQVNTX05BTUUgPSAiY2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFByb3BlcnR5IG5hbWUgb2YgaW5zdGFuY2UgaW1wbGVtZW50aW5nIHtAbGluayBJQVNOb2RlfSwgd2hpY2ggZGVub3RlcwotCSAqIHRoZSBzaG9ydCBpbnN0YW5jZSBuYW1lIChmb3IgZXhhbXBsZSwgPGNvZGU+YmF6PC9jb2RlPikgb2YgdGhlIG5vZGUKLQkgKiAob2YgdHlwZSB7QGxpbmsgU3RyaW5nfSkuCi0JICogCi0JICogQHNlZSBJQVNOb2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNOT0RFX09CSkVDVF9OQU1FID0gIm9iamVjdE5hbWUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUHJvcGVydHkgbmFtZSBvZiBpbnN0YW5jZSBpbXBsZW1lbnRpbmcge0BsaW5rIElBU05vZGV9LCB3aGljaCBkZW5vdGVzCi0JICogdGhlIGZ1bGwgaW5zdGFuY2UgbmFtZSAoZm9yIGV4YW1wbGUsIDxjb2RlPmZvby5iYXIuYmF6PC9jb2RlPikgb2YgdGhlCi0JICogbm9kZSAob2YgdHlwZSB7QGxpbmsgU3RyaW5nfSkuCi0JICogCi0JICogQHNlZSBJQVNOb2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNOT0RFX1RBUkdFVCA9ICJ0YXJnZXQiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUHJvcGVydHkgbmFtZSBvZiBpbnN0YW5jZSBpbXBsZW1lbnRpbmcge0BsaW5rIElBU05vZGV9LCB3aGljaCBkZW5vdGVzCi0JICogdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbm9kZSdzIHZhbHVlIChvZiB0eXBlIHtAbGluayBTdHJpbmd9KS4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUHJvcGVydHkgbmFtZSBvZiBpbnN0YW5jZSBpbXBsZW1lbnRpbmcge0BsaW5rIElBU05vZGV9LCB3aGljaCBkZW5vdGVzCi0JICogdGhlIHRleHQgY29udGVudCBvZiB0aGUgbm9kZSAob2YgdHlwZSB7QGxpbmsgU3RyaW5nfSkuCi0JICogCi0JICogQHNlZSBJQVNOb2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNOT0RFX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBQcm9wZXJ0eSBuYW1lIG9mIGluc3RhbmNlIGltcGxlbWVudGluZyB7QGxpbmsgSUFTTm9kZX0sIHdoaWNoIGRlbm90ZXMKLQkgKiB0aGUgdGl0bGUgb2YgdGhlIG5vZGUgKG9mIHR5cGUge0BsaW5rIFN0cmluZ30pLgotCSAqIAotCSAqIEBzZWUgSUFTTm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTTk9ERV9USVRMRSA9ICJ0aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBQcm9wZXJ0eSBuYW1lIG9mIGluc3RhbmNlIGltcGxlbWVudGluZyB7QGxpbmsgSUFTTm9kZX0sIHdoaWNoIGRlbm90ZXMKLQkgKiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBub2RlIChvZiB0eXBlIHtAbGluayBEb3VibGV9KS4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfWCA9ICJ4IjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFByb3BlcnR5IG5hbWUgb2YgaW5zdGFuY2UgaW1wbGVtZW50aW5nIHtAbGluayBJQVNOb2RlfSwgd2hpY2ggZGVub3RlcwotCSAqIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIG5vZGUgKG9mIHR5cGUge0BsaW5rIERvdWJsZX0pLgotCSAqIAotCSAqIEBzZWUgSUFTTm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTTk9ERV9ZID0gInkiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUHJvcGVydHkgbmFtZSBvZiBpbnN0YW5jZSBpbXBsZW1lbnRpbmcge0BsaW5rIElBU05vZGV9LCB3aGljaCBkZW5vdGVzCi0JICogdGhlIHdpZHRoIG9mIHRoZSBub2RlIChvZiB0eXBlIHtAbGluayBEb3VibGV9KS4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfV0lEVEggPSAidyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBQcm9wZXJ0eSBuYW1lIG9mIGluc3RhbmNlIGltcGxlbWVudGluZyB7QGxpbmsgSUFTTm9kZX0sIHdoaWNoIGRlbm90ZXMKLQkgKiB0aGUgaGVpZ2h0IG9mIHRoZSBub2RlIChvZiB0eXBlIHtAbGluayBEb3VibGV9KS4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfSEVJR0hUID0gImgiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUHJvcGVydHkgbmFtZSBvZiBpbnN0YW5jZSBpbXBsZW1lbnRpbmcge0BsaW5rIElBU05vZGV9LCB3aGljaCBkZW5vdGVzCi0JICogdGhlIGFjY2Vzc2liaWxpdHkgaW5mb3JtYXRpb24gb2YgdGhlIG5vZGUgKG9mIHR5cGUge0BsaW5rIEFTQWNjSW5mb30pLgotCSAqIAotCSAqIEBzZWUgSUFTTm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTTk9ERV9BQ0NJTkZPID0gImFjY0luZm8iOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUHJvcGVydHkgbmFtZSBvZiBpbnN0YW5jZSBpbXBsZW1lbnRpbmcge0BsaW5rIElBU05vZGV9LCB3aGljaCBkZW5vdGVzCi0JICogdGhlIGRlcHRoIChha2Egei1vcmRlcikgb2YgdGhlIG5vZGUgKG9mIHR5cGUge0BsaW5rIEludGVnZXJ9KS4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfREVQVEggPSAiZGVwdGgiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUHJvcGVydHkgbmFtZSBvZiBpbnN0YW5jZSBpbXBsZW1lbnRpbmcge0BsaW5rIElBU05vZGV9LCB3aGljaCBkZW5vdGVzCi0JICogdGhlIGN1cnJlbnQgZnJhbWUgb2YgdGhlIG5vZGUgKG9mIHR5cGUge0BsaW5rIEludGVnZXJ9KS4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfQ1VSUkVOVF9GUkFNRSA9ICJjdXJyZW50RnJhbWUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUHJvcGVydHkgbmFtZSBvZiBpbnN0YW5jZSBpbXBsZW1lbnRpbmcge0BsaW5rIElBU05vZGV9LCB3aGljaCBpcyB0aGUKLQkgKiBmbGFnIChvZiB0eXBlIHtAbGluayBCb29sZWFufSkgZGVub3RlcyB3aGV0aGVyIHRoZSBub2RlIGlzIFVJIENvbXBvbmVudC4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfSVNfVUlfQ09NUE9ORU5UID0gImlzVUlDb21wb25lbnQiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUHJvcGVydHkgbmFtZSBvZiBpbnN0YW5jZSBpbXBsZW1lbnRpbmcge0BsaW5rIElBU05vZGV9LCB3aGljaCBpcyB0aGUKLQkgKiBmbGFnIChvZiB0eXBlIHtAbGluayBCb29sZWFufSkgZGVub3RlcyB3aGV0aGVyIHRoZSBub2RlIGlzIGlucHV0YWJsZSBieQotCSAqIHVzZXJzLgotCSAqIAotCSAqIEBzZWUgSUFTTm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTTk9ERV9JU19JTlBVVEFCTEUgPSAiaXNJbnB1dGFibGUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUHJvcGVydHkgbmFtZSBvZiBpbnN0YW5jZSBpbXBsZW1lbnRpbmcge0BsaW5rIElBU05vZGV9LCB3aGljaCBpcyB0aGUKLQkgKiBmbGFnIChvZiB0eXBlIHtAbGluayBCb29sZWFufSkgZGVub3RlcyB3aGV0aGVyIHRoZSBzeXN0ZW0gc2hvdWxkCi0JICogdHJhdmVyc2UgaW50byBpdHMgY2hpbGRyZW4uCi0JICogCi0JICogQHNlZSBJQVNOb2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNOT0RFX0lTX09QQVFVRV9PQkpFQ1QgPSAiaXNPcGFxdWVPYmplY3QiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUHJvcGVydHkgbmFtZSBvZiBpbnN0YW5jZSBpbXBsZW1lbnRpbmcge0BsaW5rIElBU05vZGV9LCB3aGljaCBkZW5vdGVzCi0JICogdGhlIGlkIG9mIHRoZSBub2RlIChvZiB0eXBlIHtAbGluayBJbnRlZ2VyfSkuCi0JICogCi0JICogQHNlZSBJQVNOb2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNOT0RFX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFByb3BlcnR5IG5hbWUgb2YgaW5zdGFuY2UgaW1wbGVtZW50aW5nIHtAbGluayBJQVNOb2RlfSwgd2hpY2ggZGVub3RlcwotCSAqIHRoZSB0YWIgaW5kZXggb2YgdGhlIG5vZGUgKG9mIHR5cGUge0BsaW5rIEludGVnZXJ9KS4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfVEFCX0lOREVYID0gInRhYkluZGV4IjsgLy8kTk9OLU5MUy0xJAotCS8vIEFTTk9ERSBUWVBFL0NMQVNTCi0JLyoqCi0JICogVHlwZSBuYW1lIG9mIHRoZSBBY3Rpb25TY3JpcHQgb2JqZWN0cy4gSXQgaXMgcmV0dXJuIHZhbHVlIG9mIEFjdGlvblNjcmlwdAotCSAqIDxjb2RlPnR5cGVvZjwvY29kZT4gb3BlcmF0b3IuCi0JICogCi0JICogQHNlZSBJQVNOb2RlCi0JICogQHNlZSAjQVNOT0RFX1RZUEUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfVFlQRV9NT1ZJRUNMSVAgPSAibW92aWVjbGlwIjsKLQkvKioKLQkgKiBUeXBlIG5hbWUgb2YgdGhlIEFjdGlvblNjcmlwdCBvYmplY3RzLiBJdCBpcyByZXR1cm4gdmFsdWUgb2YgQWN0aW9uU2NyaXB0Ci0JICogPGNvZGU+dHlwZW9mPC9jb2RlPiBvcGVyYXRvci4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKiBAc2VlICNBU05PREVfVFlQRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTTk9ERV9UWVBFX09CSkVDVCA9ICJvYmplY3QiOwotCS8qKgotCSAqIFR5cGUgbmFtZSBvZiB0aGUgQWN0aW9uU2NyaXB0IG9iamVjdHMuIEl0IGlzIHJldHVybiB2YWx1ZSBvZiBBY3Rpb25TY3JpcHQKLQkgKiA8Y29kZT50eXBlb2Y8L2NvZGU+IG9wZXJhdG9yLgotCSAqIAotCSAqIEBzZWUgSUFTTm9kZQotCSAqIEBzZWUgI0FTTk9ERV9UWVBFCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNOT0RFX1RZUEVfVU5ERUZJTkVEID0gInVuZGVmaW5lZCI7Ci0JLyoqCi0JICogVHlwZSBuYW1lIG9mIHRoZSBBY3Rpb25TY3JpcHQgb2JqZWN0cy4gSXQgaXMgcmV0dXJuIHZhbHVlIG9mIEFjdGlvblNjcmlwdAotCSAqIDxjb2RlPnR5cGVvZjwvY29kZT4gb3BlcmF0b3IuCi0JICogCi0JICogQHNlZSBJQVNOb2RlCi0JICogQHNlZSAjQVNOT0RFX1RZUEUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfVFlQRV9TVFJJTkcgPSAic3RyaW5nIjsKLQkvKioKLQkgKiBUeXBlIG5hbWUgb2YgdGhlIEFjdGlvblNjcmlwdCBvYmplY3RzLiBJdCBpcyByZXR1cm4gdmFsdWUgb2YgQWN0aW9uU2NyaXB0Ci0JICogPGNvZGU+dHlwZW9mPC9jb2RlPiBvcGVyYXRvci4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKiBAc2VlICNBU05PREVfVFlQRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTTk9ERV9UWVBFX0JPT0xFQU4gPSAiYm9vbGVhbiI7Ci0JLyoqCi0JICogVHlwZSBuYW1lIG9mIHRoZSBBY3Rpb25TY3JpcHQgb2JqZWN0cy4gSXQgaXMgcmV0dXJuIHZhbHVlIG9mIEFjdGlvblNjcmlwdAotCSAqIDxjb2RlPnR5cGVvZjwvY29kZT4gb3BlcmF0b3IuCi0JICogCi0JICogQHNlZSBJQVNOb2RlCi0JICogQHNlZSAjQVNOT0RFX1RZUEUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfVFlQRV9OVUxMID0gIm51bGwiOwotCS8qKgotCSAqIFR5cGUgbmFtZSBvZiB0aGUgQWN0aW9uU2NyaXB0IG9iamVjdHMuIEl0IGlzIHJldHVybiB2YWx1ZSBvZiBBY3Rpb25TY3JpcHQKLQkgKiA8Y29kZT50eXBlb2Y8L2NvZGU+IG9wZXJhdG9yLgotCSAqIAotCSAqIEBzZWUgSUFTTm9kZQotCSAqIEBzZWUgI0FTTk9ERV9UWVBFCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNOT0RFX1RZUEVfTlVNQkVSID0gIm51bWJlciI7Ci0JLyoqCi0JICogVHlwZSBuYW1lIG9mIHRoZSBBY3Rpb25TY3JpcHQgb2JqZWN0cy4gSXQgaXMgcmV0dXJuIHZhbHVlIG9mIEFjdGlvblNjcmlwdAotCSAqIDxjb2RlPnR5cGVvZjwvY29kZT4gb3BlcmF0b3IuCi0JICogCi0JICogQHNlZSBJQVNOb2RlCi0JICogQHNlZSAjQVNOT0RFX1RZUEUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfVFlQRV9GVU5DVElPTiA9ICJmdW5jdGlvbiI7Ci0JLyoqCi0JICogVHlwZSBuYW1lIG9mIHRoZSBBY3Rpb25TY3JpcHQgb2JqZWN0cy4gSXQgaXMgcmV0dXJuIHZhbHVlIG9mIEFjdGlvblNjcmlwdAotCSAqIDxjb2RlPnR5cGVvZjwvY29kZT4gb3BlcmF0b3IuCi0JICogCi0JICogQHNlZSBJQVNOb2RlCi0JICogQHNlZSAjQVNOT0RFX1RZUEUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfVFlQRV9ESVNQTEFZT0JKRUNUID0gImRpc3BsYXlvYmplY3QiOwotCS8qKgotCSAqIENsYXNzIG5hbWUgb2YgdGhlIEFjdGlvblNjcmlwdCBvYmplY3RzLiBDbGFzcyBuYW1lIGlzIHJlZHVuZGFudCBvbmx5IHdoZW4KLQkgKiB0eXBlIG5hbWUgb2YgdGhlIG5vZGUgaXMgIm9iamVjdCIuCi0JICogCi0JICogQHNlZSBJQVNOb2RlCi0JICogQHNlZSAjQVNOT0RFX0NMQVNTX05BTUUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfQ0xBU1NfQlVUVE9OID0gIkJ1dHRvbiI7Ci0JLyoqCi0JICogQ2xhc3MgbmFtZSBvZiB0aGUgQWN0aW9uU2NyaXB0IG9iamVjdHMuIENsYXNzIG5hbWUgaXMgcmVkdW5kYW50IG9ubHkgd2hlbgotCSAqIHR5cGUgbmFtZSBvZiB0aGUgbm9kZSBpcyAib2JqZWN0Ii4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKiBAc2VlICNBU05PREVfQ0xBU1NfTkFNRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTTk9ERV9DTEFTU19BUlJBWSA9ICJBcnJheSI7Ci0JLyoqCi0JICogQ2xhc3MgbmFtZSBvZiB0aGUgQWN0aW9uU2NyaXB0IG9iamVjdHMuIENsYXNzIG5hbWUgaXMgcmVkdW5kYW50IG9ubHkgd2hlbgotCSAqIHR5cGUgbmFtZSBvZiB0aGUgbm9kZSBpcyAib2JqZWN0Ii4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKiBAc2VlICNBU05PREVfQ0xBU1NfTkFNRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTTk9ERV9DTEFTU19URVhURklFTEQgPSAiVGV4dEZpZWxkIjsKLQkvKioKLQkgKiBDbGFzcyBuYW1lIG9mIHRoZSBBY3Rpb25TY3JpcHQgb2JqZWN0cy4gQ2xhc3MgbmFtZSBpcyByZWR1bmRhbnQgb25seSB3aGVuCi0JICogdHlwZSBuYW1lIG9mIHRoZSBub2RlIGlzICJvYmplY3QiLgotCSAqIAotCSAqIEBzZWUgSUFTTm9kZQotCSAqIEBzZWUgI0FTTk9ERV9DTEFTU19OQU1FCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNOT0RFX0NMQVNTX1NIQVBFID0gIlNoYXBlIjsKLQkvLyBBU05PREUgSUNPTlRZUEUKLQkvKioKLQkgKiBJY29uIHR5cGUgbmFtZS4gSXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgYW4gaWNvbiBvZiBhbiBpdGVtIGluIHRoZSBGbGFzaAotCSAqIE91dGxpbmUgVmlldy4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfSUNPTl9BQ0NST0xFID0gImFjY3JvbGVfIjsKLQkvKioKLQkgKiBJY29uIHR5cGUgbmFtZS4gSXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgYW4gaWNvbiBvZiBhbiBpdGVtIGluIHRoZSBGbGFzaAotCSAqIE91dGxpbmUgVmlldy4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfSUNPTl9BQ0NQUk9QUyA9ICJhY2Nwcm9wcyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBJY29uIHR5cGUgbmFtZS4gSXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgYW4gaWNvbiBvZiBhbiBpdGVtIGluIHRoZSBGbGFzaAotCSAqIE91dGxpbmUgVmlldy4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfSUNPTl9GTEFTSCA9ICJmbGFzaCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBJY29uIHR5cGUgbmFtZS4gSXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgYW4gaWNvbiBvZiBhbiBpdGVtIGluIHRoZSBGbGFzaAotCSAqIE91dGxpbmUgVmlldy4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfSUNPTl9PVEhFUlMgPSAib3RoZXJzIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEljb24gdHlwZSBuYW1lLiBJdCBpcyB1c2VkIHRvIGRldGVybWluZSBhbiBpY29uIG9mIGFuIGl0ZW0gaW4gdGhlIEZsYXNoCi0JICogT3V0bGluZSBWaWV3LgotCSAqIAotCSAqIEBzZWUgSUFTTm9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTTk9ERV9JQ09OX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBJY29uIHR5cGUgbmFtZS4gSXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgYW4gaWNvbiBvZiBhbiBpdGVtIGluIHRoZSBGbGFzaAotCSAqIE91dGxpbmUgVmlldy4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfSUNPTl9WQVJJQUJMRSA9ICJ2YXJpYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBJY29uIHR5cGUgbmFtZS4gSXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgYW4gaWNvbiBvZiBhbiBpdGVtIGluIHRoZSBGbGFzaAotCSAqIE91dGxpbmUgVmlldy4KLQkgKiAKLQkgKiBAc2VlIElBU05vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU05PREVfSUNPTl9DT01QT05FTlQgPSAiY29tcG9uZW50IjsKLQkvLyBBU05PREUKLQotCS8vIEFDQ0lORk8KLQkvKioKLQkgKiBPbmUgb2YgdGhlIHByb3BlcnR5IG5hbWVzIG9mIHtAbGluayBBU0FjY0luZm99IGluc3RhbmNlLCB3aGljaCBtZWFucyB0aGUKLQkgKiBBTFQgdGV4dCBmb3IgYW4gQWN0aW9uU2NyaXB0IG9iamVjdC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NJTkZPX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBPbmUgb2YgdGhlIHByb3BlcnR5IG5hbWVzIG9mIHtAbGluayBBU0FjY0luZm99IGluc3RhbmNlLCB3aGljaCBtZWFucyB0aGUKLQkgKiBsb25nIGRlc2NyaXB0aW9uIGZvciBhbiBBY3Rpb25TY3JpcHQgb2JqZWN0LgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0lORk9fREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogT25lIG9mIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiB7QGxpbmsgQVNBY2NJbmZvfSBpbnN0YW5jZSwgd2hpY2ggbWVhbnMgdGhlCi0JICogTVNBQSB3aWRnZXQgcm9sZSBvZiBhbiBBY3Rpb25TY3JpcHQgb2JqZWN0LiBJdCBjb21lcyBmcm9tIGEgcHJvcGVydHkgb2YKLQkgKiAiLl9hY2NJbXBsIiBvYmplY3QgaW4gQWN0aW9uU2NyaXAgMi4wLCB3aGljaCBpcyBub3QgZG9jdW1lbnRlZC4gSW4KLQkgKiBBY3Rpb25TY3JpcHQgMy4wLCBpdCBjb21lcyBmcm9tIEFjY2Vzc2liaWxpdHlJbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NJTkZPX1JPTEUgPSAicm9sZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBPbmUgb2YgdGhlIHByb3BlcnR5IG5hbWVzIG9mIHtAbGluayBBU0FjY0luZm99IGluc3RhbmNlLCB3aGljaCBtZWFucyB0aGUKLQkgKiBNU0FBIHdpZGdldCBzdGF0ZSBvZiBhbiBBY3Rpb25TY3JpcHQgb2JqZWN0LiBJdCBjb21lcyBmcm9tIGEgcHJvcGVydHkgb2YKLQkgKiAiLl9hY2NJbXBsIiBvYmplY3QgaW4gQWN0aW9uU2NyaXAgMi4wLCB3aGljaCBpcyBub3QgZG9jdW1lbnRlZC4gSW4KLQkgKiBBY3Rpb25TY3JpcHQgMy4wLCBpdCBjb21lcyBmcm9tIEFjY2Vzc2liaWxpdHlJbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NJTkZPX1NUQVRFID0gInN0YXRlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE9uZSBvZiB0aGUgcHJvcGVydHkgbmFtZXMgb2Yge0BsaW5rIEFTQWNjSW5mb30gaW5zdGFuY2UsIHdoaWNoIG1lYW5zCi0JICogd2hldGhlciBhbiBBY3Rpb25TY3JpcHQgb2JqZWN0IGlzIGlnbm9yZWQgYnkgc2NyZWVuIHJlYWRlcnMuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDSU5GT19TSUxFTlQgPSAic2lsZW50IjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE9uZSBvZiB0aGUgcHJvcGVydHkgbmFtZXMgb2Yge0BsaW5rIEFTQWNjSW5mb30gaW5zdGFuY2UsIHdoaWNoIG1lYW5zCi0JICogd2hldGhlciBjaGlsZHJlbiBvZiBhbiBBY3Rpb25TY3JpcHQgb2JqZWN0IGlzIGlnbm9yZWQgYnkgc2NyZWVuIHJlYWRlcnMuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDSU5GT19GT1JDRVNJTVBMRSA9ICJmb3JjZVNpbXBsZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBPbmUgb2YgdGhlIHByb3BlcnR5IG5hbWVzIG9mIHtAbGluayBBU0FjY0luZm99IGluc3RhbmNlLCB3aGljaCBtZWFucwotCSAqIHNob3J0Y3V0IGtleSBmb3IgYW4gQWN0aW9uU2NyaXB0IG9iamVjdC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NJTkZPX1NIT1JUQ1VUID0gInNob3J0Y3V0IjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE9uZSBvZiB0aGUgcHJvcGVydHkgbmFtZXMgb2Yge0BsaW5rIEFTQWNjSW5mb30gaW5zdGFuY2UsIHdoaWNoIG1lYW5zIHRoZQotCSAqIHdpZGdldCdzIE1TQUEgZGVmYXVsdCBhY3Rpb24gb2YgYW4gQWN0aW9uU2NyaXB0IG9iamVjdC4gSXQgY29tZXMgZnJvbSBhCi0JICogcHJvcGVydHkgb2YgIi5fYWNjSW1wbCIgb2JqZWN0IGluIEFjdGlvblNjcmlwIDIuMCwgd2hpY2ggaXMgbm90Ci0JICogZG9jdW1lbnRlZC4gSW4gQWN0aW9uU2NyaXB0IDMuMCwgaXQgY29tZXMgZnJvbQotCSAqIEFjY2Vzc2liaWxpdHlJbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NJTkZPX0RFRkFVTFRBQ1RJT04gPSAiZGVmYXVsdEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NJTkZPX0NISUxEUkVOID0gImNoaWxkcmVuIjsgLy8kTk9OLU5MUy0xJAotCS8vIEFDQ0lORk8KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0lGbGFzaFBsYXllci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL0lGbGFzaFBsYXllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjdkNDAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9JRmxhc2hQbGF5ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5GbGFzaE1TQUFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHByb3ZpZGUgYWNjZXNzIHRvIEZsYXNoUGxheWVyIGFuZCBpdCdzIGNvbnRlbnQuCi0gKiAKLSAqIEBzZWUgSUFTQnJpZGdlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZsYXNoUGxheWVyIGV4dGVuZHMgSUFTQnJpZGdlIHsKLQotCS8qKgotCSAqIEByZXR1cm4gbmF0aXZlIE1TQUEgb2JqZWN0IG9mIHRoZSBGbGFzaFBsYXllciBhcyB7QGxpbmsgRmxhc2hNU0FBT2JqZWN0fQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBGbGFzaE1TQUFPYmplY3QgZ2V0QWNjZXNzaWJsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBJRGlzcGF0Y2ggb2JqZWN0IG9mIHRoZSBGbGFzaFBsYXllcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJRGlzcGF0Y2ggZ2V0RGlzcGF0Y2goKTsKLQotCS8qKgotCSAqIEByZXR1cm4gc3RhdHVzIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXR1cygpOwotCi0JLyoqCi0JICogQHJldHVybiB2ZXJzaW9uIG9mIEZsYXNoUGxheWVyCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQbGF5ZXJWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFVSTCBvZiBGbGFzaCBjb250ZW50Ci0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRDb250ZW50VVJMKCk7Ci0KLQkvKioKLQkgKiBTZXQgUHJvcGVydHkgdG8gRmxhc2hQbGF5ZXIgTm9kZQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRhcmdldCBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBwcm9wZXJ0eSB2YWx1ZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQbGF5ZXJQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogR2V0IFByb3BlcnR5IGZyb20gRmxhc2hQbGF5ZXIgTm9kZQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIHRhcmdldCBwcm9wZXJ0eSBuYW1lCi0JICogQHJldHVybiBwcm9wZXJ0eSB2YWx1ZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UGxheWVyUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHdpbmRvdyBoYW5kbGUgb2YgRmxhc2hQbGF5ZXIKLQkgKiBAc2VlIEZsYXNoTVNBQU9iamVjdCNnZXRXaW5kb3coKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0V2luZG93KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFdNb2RlIG9mIHRoZSBGbGFzaFBsYXllcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0V01vZGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU1dGIHZlcnNpb24gb2YgY3VycmVudCBjb250ZW50Ci0JICovCi0JcHVibGljIGludCBnZXRTV0ZWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIEhUTUwgZG9jdW1lbnQgdGhhdCB0aGUgRmxhc2hQbGF5ZXIgYmVsb25ncyB0byBpcwotCSAqICAgICAgICAgcmVhZHkgb3Igbm90LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUmVhZHkoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIEZsYXNoIG9iamVjdCBpcyB2aXNpYmxlIG9yIG5vdC4gSW52aXNpYmxlIG1lYW5zIHRoYXQKLQkgKiAgICAgICAgIHRoZSBGbGFzaCBvYmplY3QgaXMgaW4gd2luZG93LWxlc3MgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Zpc2libGUoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9hcy9BU0Rlc2VyaWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2FzL0FTRGVzZXJpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjlkMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2FzL0FTRGVzZXJpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5hczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBDbGFzcyBmb3IgRGVzZXJpYWxpemluZyBhIHN0cmluZyBpbiBKU09OIG5vdGF0aW9uIHRvIGEgSmF2YSBvYmplY3QuIE5vdGUgdGhhdAotICogYSBwcm9wZXJ0eSBuYW1lIHNob3VsZCBiZSBxdW90ZWQgaW4gSlNPTiBvYmplY3Qgbm90YXRpb24uIEUuZy4KLSAqIDxjb2RlPnsiaWQiOjEyM308L2NvZGU+LiBJbiB0aGlzIGRlc2VyaWFsaXplciwgYSBKU09OIG9iamVjdCBpcwotICogZGVzZXJpYWxpemVkIHRvIGFuIHtAbGluayBBU09iamVjdH0gaW5zdGFuY2UuCi0gKiAKLSAqIEBzZWUgQVNPYmplY3QKLSAqLwotcHVibGljIGNsYXNzIEFTRGVzZXJpYWxpemVyIHsKLQkvKioKLQkgKiBUb2tlbiBkaWN0aW9uYXJ5IHVzZWQgdG8gY29udmVydCByZXNlcnZlZCB3b3JkcyB0byBKYXZhIGNvbnN0YW50cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRva2VuRGljID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IHRvIGRlbm90ZSBKU09OIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gdmFsdWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IFVOREVGSU5FRCA9ICJ1bmRlZmluZWQiLmludGVybigpOwotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCB0byBkZW5vdGUgSlNPTiA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgTlVMTCA9ICJudWxsIi5pbnRlcm4oKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB0b2tlbiBkaWN0aW9uYXJ5LgotCSAqLwotCXN0YXRpYyB7Ci0JCXRva2VuRGljLnB1dCgidHJ1ZSIsIEJvb2xlYW4udmFsdWVPZih0cnVlKSk7Ci0JCXRva2VuRGljLnB1dCgiZmFsc2UiLCBCb29sZWFuLnZhbHVlT2YoZmFsc2UpKTsKLQkJdG9rZW5EaWMucHV0KCJ1bmRlZmluZWQiLCBVTkRFRklORUQpOwotCQl0b2tlbkRpYy5wdXQoIm51bGwiLCBOVUxMKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCB2YXJpYWJsZSB0byBob2xkIGN1cnNvciBwb3NpdGlvbiBpbiBwYXJzaW5nLiA8Y29kZT4wPC9jb2RlPgotCSAqIG1lYW5zIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZy4KLQkgKi8KLQlwcml2YXRlIGludCBpZHg7Ci0JLyoqCi0JICogSW50ZXJuYWwgdmFyaWFibGUgdG8gaG9sZCBhIHN0cmluZyB0byBiZSBzZXJpYWxpemVkLiBTZXQgYnkgdGhlCi0JICogY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgc3RyOwotCi0JLyoqCi0JICogU2tpcHMgYSBzZXF1ZW5jZSBvZiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICogCi0JICogQHJldHVybiBDdXJzb3IgcG9zaXRpb24gYWZ0ZXIgc2tpcHBpbmcuIEl0IHJldHVybnMgPGNvZGU+LTE8L2NvZGU+IGlmCi0JICogICAgICAgICBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KLQkgKi8KLQlwcml2YXRlIGludCBza2lwU1AoKSB7Ci0JCXdoaWxlIChpZHggPCBzdHIubGVuZ3RoKCkpIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGlkeCk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICcgJzoKLQkJCWNhc2UgJ1x0JzoKLQkJCWNhc2UgJ1xuJzoKLQkJCWNhc2UgJ1xyJzoKLQkJCQlpZHgrKzsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGlkeDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZWF0Y2ggdGhlIGVuZCBvZiBhIHRva2VuIHN0YXJ0cyBmcm9tIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEN1cnNvciBwb3NpdGlvbiBhZnRlciBzZWFyY2guIEl0IHBvaW50cyB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gdGhlCi0JICogICAgICAgICBlbmQgb2YgZ2l2ZW4gdG9rZW4uCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VG9rZW5FbmRJZHgoKSB7Ci0JCWludCBpZHgyID0gaWR4OwotCQl3aGlsZSAoaWR4MiA8IHN0ci5sZW5ndGgoKSkgewotCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaWR4Mik7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICcgJzoKLQkJCWNhc2UgJ1x0JzoKLQkJCWNhc2UgJ1xuJzoKLQkJCWNhc2UgJ1xyJzoKLQkJCWNhc2UgJywnOgotCQkJY2FzZSAnOic6Ci0JCQljYXNlICd9JzoKLQkJCWNhc2UgJ10nOgotCQkJCXJldHVybiBpZHgyOwotCi0JCQlkZWZhdWx0OgotCQkJCWlkeDIrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaWR4MjsKLQl9Ci0KLQkvKioKLQkgKiBEZXNlcmlhbGl6ZXMgYSBKU09OIHN0cmluZyB0byBKYXZhIHN0cmluZy4gTm90ZSB0aGF0IEpTT04gc3RyaW5nIHNob3VsZAotCSAqIGJlIHF1b3RlZCBhcyA8Y29kZT4iSGVsbG8sIEphdmEiPC9jb2RlPi4gVGhpcyBtZXRob2QgaXMgaW50ZXJuYWxseQotCSAqIGNhbGxlZCBmcm9tIHtAbGluayAjZGVzZXJpYWxpemUoKX0uCi0JICogCi0JICogQHJldHVybiBEZXNlcmlhbGl6ZWQgSmF2YSBzdHJpbmcuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICB3aGVuIGdpdmVuIEpTT04gc3RyaW5nIGlzIGlsbC1mb3JtZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVzZXJpYWxpemVTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlkeCsrOwotCQl3aGlsZSAoaWR4IDwgc3RyLmxlbmd0aCgpKSB7Ci0JCQljaGFyIGNoID0gc3RyLmNoYXJBdChpZHgpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnIic6Ci0JCQkJaWR4Kys7Ci0JCQkJcmV0dXJuIHJldC50b1N0cmluZygpOwotCQkJY2FzZSAnXFwnOgotCQkJCWlkeCsrOwotCQkJCWlmIChpZHggPT0gc3RyLmxlbmd0aCgpKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkJIkFibm9ybWFsIGVuZCBvZiB0aGUgc3RyaW5nOiIgKyBzdHIpOwotCQkJCX0KLQkJCQlyZXQuYXBwZW5kKHN0ci5jaGFyQXQoaWR4KSk7Ci0JCQkJaWR4Kys7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldC5hcHBlbmQoY2gpOwotCQkJCWlkeCsrOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgU3RyaW5nOiIgKyBzdHIpOwotCX0KLQotCS8qKgotCSAqIERlc2VyaWFsaXplcyBhIEpTT04gYXJyYXkgc3RyaW5nIHRvIEphdmEgYXJyYXkuIFRoaXMgbWV0aG9kIGlzIGludGVybmFsbHkKLQkgKiBjYWxsZWQgZnJvbSB7QGxpbmsgI2Rlc2VyaWFsaXplKCl9LgotCSAqIAotCSAqIEByZXR1cm4gRGVzZXJpYWxpemVkIEphdmEgYXJyYXkuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICB3aGVuIGdpdmVuIEpTT04gc3RyaW5nIGlzIGlsbC1mb3JtZWQuCi0JICovCi0JcHJpdmF0ZSBPYmplY3RbXSBkZXNlcmlhbGl6ZUFycmF5KCkgewotCQlpZHgrKzsKLQkJQXJyYXlMaXN0PE9iamVjdD4gcmV0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCXdoaWxlIChpZHggPCBzdHIubGVuZ3RoKCkpIHsKLQkJCXNraXBTUCgpOwotCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaWR4KTsKLQkJCWlmIChjaCA9PSAnXScpIHsKLQkJCQlpZHgrKzsKLQkJCQlyZXR1cm4gcmV0LnRvQXJyYXkobmV3IE9iamVjdFtyZXQuc2l6ZSgpXSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldC5hZGQoZGVzZXJpYWxpemUoKSk7Ci0JCQl9Ci0JCQlza2lwU1AoKTsKLQkJCWNoID0gc3RyLmNoYXJBdChpZHgpOwotCQkJaWYgKGNoID09ICddJykgewotCQkJCWlkeCsrOwotCQkJCXJldHVybiByZXQudG9BcnJheShuZXcgT2JqZWN0W3JldC5zaXplKCldKTsKLQkJCX0KLQkJCWlmIChjaCAhPSAnLCcpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNzaW5nICcsJzoiICsgc3RyKTsKLQkJCX0KLQkJCWlkeCsrOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFibm9ybWFsIGVuZCBvZiB0aGUgYXJyYXk6IiArIHN0cik7Ci0JfQotCi0JLyoqCi0JICogRGVzZXJpYWxpemVzIGEgSlNPTiBvYmplY3Qgc3RyaW5nIHRvIHtAbGluayBBU09iamVjdH0gaW5zdGFuY2UuIFRoaXMKLQkgKiBtZXRob2QgaXMgaW50ZXJuYWxseSBjYWxsZWQgZnJvbSB7QGxpbmsgI2Rlc2VyaWFsaXplKCl9LgotCSAqIAotCSAqIEByZXR1cm4gRGVzZXJpYWxpemVkIHtAbGluayBBU09iamVjdH0gaW5zdGFuY2UuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICB3aGVuIGdpdmVuIEpTT04gc3RyaW5nIGlzIGlsbC1mb3JtZWQuCi0JICovCi0JcHJpdmF0ZSBBU09iamVjdCBkZXNlcmlhbGl6ZUFTT2JqZWN0KCkgewotCQlpZHgrKzsKLQkJQVNPYmplY3QgcmV0ID0gbmV3IEFTT2JqZWN0KCk7Ci0JCXdoaWxlIChpZHggPCBzdHIubGVuZ3RoKCkpIHsKLQkJCXNraXBTUCgpOwotCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaWR4KTsKLQkJCWlmIChjaCA9PSAnfScpIHsKLQkJCQlpZHgrKzsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgcHJvcCA9IGRlc2VyaWFsaXplU3RyaW5nKCk7Ci0JCQkJc2tpcFNQKCk7Ci0JCQkJaWYgKHN0ci5jaGFyQXQoaWR4KSAhPSAnOicpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWlzc2luZyAnOic6IiArIHN0cik7Ci0JCQkJfQotCQkJCWlkeCsrOwotCQkJCU9iamVjdCBvID0gZGVzZXJpYWxpemUoKTsKLQkJCQlyZXQucHV0KHByb3AsIG8pOwotCQkJfQotCQkJc2tpcFNQKCk7Ci0JCQljaCA9IHN0ci5jaGFyQXQoaWR4KTsKLQkJCWlmIChjaCA9PSAnfScpIHsKLQkJCQlpZHgrKzsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQkJaWYgKHN0ci5jaGFyQXQoaWR4KSAhPSAnLCcpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNzaW5nICcsJzoiICsgc3RyKTsKLQkJCX0KLQkJCWlkeCsrOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFibm9ybWFsIGVuZCBvZiB0aGUgYXJyYXk6IiArIHN0cik7Ci0JfQotCi0JLyoqCi0JICogRGVzZXJpYWxpemVzIGEgZ2l2ZW4gSlNPTiBzdHJpbmcuIEVzcGVjaWFsbHkgYSBKU09OIG9iamVjdCBzdHJpbmcgaXMKLQkgKiBkZXNlcmlhbGl6ZWQgdG8gYW4ge0BsaW5rIEFTT2JqZWN0fSBpbnN0YW5jZS4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgYSBwcm9wZXJ0eSBuYW1lIHNob3VsZCBiZSBxdW90ZWQgaW4gSlNPTiBvYmplY3Qgbm90YXRpb24uIEUuZy4KLQkgKiA8Y29kZT57ImlkIjoxMjN9PC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIERlc2VyaWFsaXplZCBvYmplY3QuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICB3aGVuIGdpdmVuIEpTT04gc3RyaW5nIGlzIG5vdCBpbiB2YWxpZCBmb3JtYXQuCi0JICovCi0JcHVibGljIE9iamVjdCBkZXNlcmlhbGl6ZSgpIHsKLQkJaW50IHIgPSBza2lwU1AoKTsKLQkJaWYgKHIgPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWNoYXIgY2ggPSBzdHIuY2hhckF0KGlkeCk7Ci0JCXN3aXRjaCAoY2gpIHsKLQkJY2FzZSAnWyc6Ci0JCQlyZXR1cm4gZGVzZXJpYWxpemVBcnJheSgpOwotCQljYXNlICd7JzoKLQkJCXJldHVybiBkZXNlcmlhbGl6ZUFTT2JqZWN0KCk7Ci0JCWNhc2UgJyInOgotCQkJcmV0dXJuIGRlc2VyaWFsaXplU3RyaW5nKCk7Ci0JCWRlZmF1bHQ6Ci0JCQlpbnQgaWR4MiA9IGdldFRva2VuRW5kSWR4KCk7Ci0JCQlTdHJpbmcgdG9rID0gc3RyLnN1YnN0cmluZyhpZHgsIGlkeDIpOwotCQkJT2JqZWN0IG8gPSB0b2tlbkRpYy5nZXQodG9rKTsKLQkJCXRoaXMuaWR4ID0gaWR4MjsKLQkJCWlmIChvID09IE5VTEwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmIChvICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbzsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJaW50IGkgPSBJbnRlZ2VyLnBhcnNlSW50KHRvayk7Ci0JCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZihpKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWRvdWJsZSBkID0gRG91YmxlLnBhcnNlRG91YmxlKHRvayk7Ci0JCQkJcmV0dXJuIG5ldyBEb3VibGUoZCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0b2sgKyAiIGlzIG5vdCBhIHZhbGlkIHRva2VuLiIpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHtAbGluayBBU0Rlc2VyaWFsaXplcn0gaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgSlNPTiBzdHJpbmcgdG8gYmUgZGVzZXJpYWxpemVkCi0JICovCi0JcHVibGljIEFTRGVzZXJpYWxpemVyKFN0cmluZyBzdHIpIHsKLQkJdGhpcy5pZHggPSAwOwotCQl0aGlzLnN0ciA9IHN0cjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvYXMvQVNPYmplY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9hcy9BU09iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjE2Y2NmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9hcy9BU09iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5hczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQSB3cmFwcGVyIGNsYXNzIGZvciBBY3Rpb25TY3JpcHQgPGNvZGU+T2JqZWN0PC9jb2RlPiBjbGFzcy4gQWN0aW9uU2NyaXB0Ci0gKiA8Y29kZT5PYmplY3Q8L2NvZGU+IGluc3RhbmNlIGlzIGEgbWFwIGZyb20gPGNvZGU+U3RyaW5nPC9jb2RlPiAoY2FsbGVkCi0gKiBrZXkpIHRvIDxjb2RlPk9iamVjdDwvY29kZT4gKGNhbGxlZCB2YWx1ZSksIHdoaWNoIGlzIHdyaXR0ZW4gYXMgYSBsaXRlcmFsCi0gKiBsaWtlIDxjb2RlPntpZDoxMjMsIG1lczonSGVsbG8nfTwvY29kZT4uIFRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBrZXkgaXMKLSAqIG9idGFpbmVkIGJ5IHtAbGluayAjZ2V0fSBtZXRob2QuIEZvciB0aGUgZXhhbXBsZSBhYm92ZSwKLSAqIDxjb2RlPmdldCgiaWQiKT09MTIzPC9jb2RlPiBhbmQgPGNvZGU+Z2V0KCJtZXMiKT09IkhlbGxvIjwvY29kZT4gaG9sZHMuCi0gKiBBU09iamVjdCBpbnN0YW5jZSBjYW5ub3QgYmUgY3JlYXRlZCBieSBpdHMgY29uc3RydWN0b3IuIFRoZSBpbnN0YW5jZSBpcwotICogaW50ZXJuYWxseSBjcmVhdGVkIGJ5IHtAbGluayBBU0Rlc2VyaWFsaXplciNkZXNlcmlhbGl6ZX0gbWV0aG9kLgotICogCi0gKiBAc2VlIEFTRGVzZXJpYWxpemVyCi0gKi8KLXB1YmxpYyBjbGFzcyBBU09iamVjdCB7Ci0KLQkvKioKLQkgKiBBIG1hcCBmcm9tIHtAbGluayBTdHJpbmd9IHRvIHtAbGluayBPYmplY3R9IHdoaWNoIHN0b3JlcyBBY3Rpb25TY3JpcHQKLQkgKiA8Y29kZT5PYmplY3Q8L2NvZGU+IGluc3RhbmNlIGNvbnRlbnQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIHdpdGhvdXQgYW55IGFyZ3VtZW50cy4gSXQncyBub3QgcHVibGljIHNvIGRldmVsb3BlcnMgY2Fubm90Ci0JICogZGlyZWN0bHkgY2FsbCBpdC4KLQkgKi8KLQlBU09iamVjdCgpIHsKLQkJdGhpcy5tYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBrZXkuIElmIHRoZSBpbnN0YW5jZSBhbHJlYWR5IGhhcyB0aGUgdmFsdWUgZm9yCi0JICogdGhlIGtleSwgaXQgaXMgb3ZlcndyaXR0ZW4uCi0JICogCi0JICogQHBhcmFtIHByb3AKLQkgKiAgICAgICAgICAgIE5hbWUgb2YgYSBrZXkgdG8gcHV0IHZhbHVlCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgQSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSB0byBzZXQKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiA8Y29kZT5wcm9wPC9jb2RlPi4KLQkgKi8KLQlPYmplY3QgcHV0KFN0cmluZyBwcm9wLCBPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBtYXAucHV0KHByb3AsIG9iaik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4ga2V5LgotCSAqIAotCSAqIEBwYXJhbSBwcm9wCi0JICogICAgICAgICAgICBOYW1lIG9mIGEga2V5IHRvIGdldCB2YWx1ZS4KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcgcHJvcCkgewotCQlyZXR1cm4gbWFwLmdldChwcm9wKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzZXQgb2Yga2V5cyBvZiB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBUaGUge0BsaW5rIFNldH0gb2YgdGhlIGtleXMuCi0JICovCi0JcHVibGljIFNldDxTdHJpbmc+IGdldEtleXMoKSB7Ci0JCXJldHVybiBtYXAua2V5U2V0KCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgQWN0aW9uU2NyaXB0IHN0eWxlIHtAbGluayBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoZQotCSAqIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHN0cmluZyBmb3IgdGhlIGluc3RhbmNlIGluIEFjdGlvblNjcmlwdCBsaXRlcmFsIHN0eWxlIHN1Y2ggYXMKLQkgKiAgICAgICAgIDxjb2RlPntpZDoxMjMsbWVzOidIZWxsbycsfTwvY29kZT4uIE5vdGUgdGhhdCBhIGNvbW1hIGFwcGVhcnMKLQkgKiAgICAgICAgIGFmdGVyIHRoZSBsYXN0IGtleS12YWx1ZSBwYWlyLgotCSAqLwotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHJldCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdCA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgcHJvcCA9IGl0Lm5leHQoKTsKLQkJCXJldC5hcHBlbmQocHJvcCk7Ci0JCQlyZXQuYXBwZW5kKCI6Iik7Ci0JCQlyZXQuYXBwZW5kKCIiICsgbWFwLmdldChwcm9wKSk7Ci0JCQlyZXQuYXBwZW5kKCIsIik7Ci0JCX0KLQkJcmV0dXJuIHJldC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9hcy9BU1NlcmlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9hcy9BU1NlcmlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRiNmU0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvYXMvQVNTZXJpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGluYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5hczsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBzZXJpYWxpemluZyBKYXZhIG9iamVjdHMgdG8gQWN0aW9uU2NyaXB0IHN0eWxlIHN0cmluZy4KLSAqIAotICogQHNlZSBBU0Rlc2VyaWFsaXplcgotICovCi1wdWJsaWMgY2xhc3MgQVNTZXJpYWxpemVyIHsKLQkvKioKLQkgKiBFc2NhcGUgYSBnaXZlbiB7QGxpbmsgU3RyaW5nfS4gRXNwZWNpYWxseSBpdCBlc2NhcGVzIGRvdWJsZSBxdW90YXRpb24KLQkgKiBhbmQgYmFjayBzbGFzaCBjaGFyYWN0ZXJzIGFuZCBjb252ZXJ0IHRvIEFjdGlvblNjcmlwdCBzdHlsZSBTdHJpbmcKLQkgKiBsaXRlcmFsIGJ5IHByZXBlbmRpbmcgYW5kIGFwcGVuZGluZyBkb3VibGUgcXVvdGF0aW9ucyAuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgQSB7QGxpbmsgU3RyaW5nfSB0byBiZSBlc2NhcGVkCi0JICogQHJldHVybiBFc2NhcGVkIHtAbGluayBTdHJpbmd9IGxpdGVyYWwgZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcmlhbGl6ZShTdHJpbmcgc3RyKSB7Ci0JCWlmICgoc3RyLmluZGV4T2YoJyInKSA+PSAwKSB8fCAoc3RyLmluZGV4T2YoJ1xcJykgPj0gMCkpIHsKLQkJCVN0cmluZ0J1ZmZlciByZXQgPSBuZXcgU3RyaW5nQnVmZmVyKCciJyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7Ci0JCQkJc3dpdGNoIChjaCkgewotCQkJCWNhc2UgJyInOgotCQkJCQlyZXQuYXBwZW5kKCJcXFwiIik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xcJzoKLQkJCQkJcmV0LmFwcGVuZCgiXFxcXCIpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXQuYXBwZW5kKGNoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXQuYXBwZW5kKCciJyk7Ci0JCQlyZXR1cm4gcmV0LnRvU3RyaW5nKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIlwiIiArIHN0ciArICJcIiI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXJpYWxpemVzIGdpdmVuIEphdmEge0BsaW5rIE9iamVjdH0gdG8gYSB7QGxpbmsgU3RyaW5nfS4gSXQgc2VyaWFsaXplcwotCSAqIG9iamVjdHMgb2YgdHlwZSB7QGxpbmsgU3RyaW5nfSwge0BsaW5rIE51bWJlcn0sIGFuZCB7QGxpbmsgQm9vbGVhbn0uCi0JICogCi0JICogQHBhcmFtIGEKLQkgKiAgICAgICAgICAgIEphdmEge0BsaW5rIE9iamVjdH0gdG8gYmUgc2VyaWFsaXplZAotCSAqIEByZXR1cm4gU2VyaWFsaXplZCB7QGxpbmsgU3RyaW5nfQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzZXJpYWxpemUoT2JqZWN0IGEpIHsKLQkJaWYgKGEgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXJldHVybiBzZXJpYWxpemUoKFN0cmluZykgYSk7Ci0JCX0gZWxzZSBpZiAoYSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJcmV0dXJuIGEudG9TdHJpbmcoKTsKLQkJfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJcmV0dXJuIGEudG9TdHJpbmcoKTsKLQkJfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLQkJCVN0cmluZ0J1ZmZlciByZXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKE9iamVjdCB0bXAgOiAoT2JqZWN0W10pIGEpIHsKLQkJCQlyZXQuYXBwZW5kKHNlcmlhbGl6ZSh0bXApKTsKLQkJCQlyZXQuYXBwZW5kKCIsIik7Ci0JCQl9Ci0JCQlpZiAocmV0Lmxlbmd0aCgpID4gMSkgewotCQkJCXJldHVybiByZXQuc3Vic3RyaW5nKDAsIHJldC5sZW5ndGgoKSAtIDIpOwotCQkJfQotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oYSArICIgY2Fubm90IGJlIHNlcmlhbGl6ZWQuIik7Ci0JfQotCi0JLyoqCi0JICogU2VyaWFsaXplcyBhIGdpdmVuIHNlY3JldCBhbmQgYSBnaXZlbiBhcnJheSBvZiBvYmplY3RzIHRvIHRoZSBzZWNyZXQKLQkgKiBmb2xsb3dlZCBieSBhIEFjdGlvblNjcmlwdCBzdHlsZSB7QGxpbmsgU3RyaW5nfS4gVGhlIHNlY3JldCBpcyB1c2VkIHRvCi0JICogc2VjdXJlIGNvbW11bmljYXRpb24gYmV0d2VlbiBhIHByb2dyYW0gdXNlIHRoaXMgY2xhc3MgYW5kIGEgYnJvd3NlcgotCSAqIGNvbXBvbmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc2VjcmV0Ci0JICogICAgICAgICAgICBTZWNyZXQge0BsaW5rIFN0cmluZ30KLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgQXJyYXkgb2Yge0BsaW5rIE9iamVjdH1zCi0JICogCi0JICogQHJldHVybiBTZXJpYWxpemVkIHtAbGluayBTdHJpbmd9Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VyaWFsaXplKFN0cmluZyBzZWNyZXQsIE9iamVjdFtdIGFyZ3MpIHsKLQkJU3RyaW5nQnVmZmVyIHJldCA9IG5ldyBTdHJpbmdCdWZmZXIoc2VjcmV0KTsKLQkJcmV0LmFwcGVuZCgnWycpOwotCQlpZiAoYXJncy5sZW5ndGggPiAwKSB7Ci0JCQlyZXQuYXBwZW5kKHNlcmlhbGl6ZShhcmdzWzBdKSk7Ci0JCQlmb3IgKGludCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlyZXQuYXBwZW5kKCIsIik7Ci0JCQkJT2JqZWN0IGEgPSBhcmdzW2ldOwotCQkJCXJldC5hcHBlbmQoc2VyaWFsaXplKGEpKTsKLQkJCX0KLQkJfQotCQlyZXQuYXBwZW5kKCJdIik7Ci0JCXJldHVybiByZXQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9icmlkZ2UvSVdhWGNvZGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9JV2FYY29kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMjU3ZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9JV2FYY29kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC1pbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guYnJpZGdlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gudHJhbnNjb2Rlci5JU3dmVHJhbnNjb2RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LkV4dGVybmFsUHJveHlDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5Qcm94eUNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklTZWNyZXRNYW5hZ2VyOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBtYW5hZ2UgUHJveHkgZm9yIEZsYXNoIGJyaWRnZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJV2FYY29kaW5nIHsKLQkvKioKLQkgKiBTdGFydCBwcm94eQotCSAqIAotCSAqIEBwYXJhbSBpbml0TG9nZ2VyCi0JICogICAgICAgICAgICBpZiB0cnVlLCBzdGFydCBsb2dnaW5nIHRvZ2V0aGVyCi0JICogQHJldHVybiB0cnVlIGlmc3VjY2VlZGVkCi0JICovCi0JYm9vbGVhbiBzdGFydChib29sZWFuIGluaXRMb2dnZXIpOwotCi0JLyoqCi0JICogU3RvcCBwcm94eQotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZWVkZWQKLQkgKi8KLQlib29sZWFuIHN0b3AoKTsKLQotCS8qKgotCSAqIEdldCBzZWNyZXQgU3RyaW5nIHRoYXQgaXMgdXNlZCBmb3IgY29uZmlybWF0aW9uIG9mIGNvcnJlY3Qgc2VydmVyLWNsaWVudAotCSAqIGNvbWJpbmF0aW9uCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICB0YXJnZXQga2V5IHRvIG9idGFpbiB0aGUgc2VjcmV0Ci0JICogQHBhcmFtIHJlbW92ZQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgdGhlIHNlY3JldCB3aWxsIGJlIHJlbW92ZWQgYWZ0ZXIgaW52b2tpbmcgdGhpcyBtZXRob2QKLQkgKiBAcmV0dXJuIHNlY3JldCwgb3IgbnVsbCBpZiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpcyBub3QgYXZhaWxhYmxlIGZvcgotCSAqICAgICAgICAgdGhlIHRhcmdldCBrZXkKLQkgKiBAc2VlIElTZWNyZXRNYW5hZ2VyCi0JICovCi0JU3RyaW5nIGdldFNlY3JldChTdHJpbmcgaWQsIGJvb2xlYW4gcmVtb3ZlKTsKLQotCS8qKgotCSAqIFNldCBwcm94eSBwb3J0Ci0JICogCi0JICogQHBhcmFtIHBvcnQKLQkgKiAgICAgICAgICAgIHRhcmdldCBwb3J0IG51bWJlcgotCSAqIEBzZWUgUHJveHlDb25maWcjc2V0UG9ydChpbnQpCi0JICovCi0Jdm9pZCBzZXRQb3J0KGludCBwb3J0KTsKLQotCS8qKgotCSAqIEdldCBwcm94eSBwb3J0Ci0JICogCi0JICogQHJldHVybiBwb3J0IG51bWJlcgotCSAqLwotCWludCBnZXRQb3J0KCk7Ci0KLQkvKioKLQkgKiBTZXQgYm9vbGVhbiB2YWx1ZSB0byBzcGVjaWZ5IGlmIEhUVFBQcm94eSBuZWVkcyB0byB1c2UgYW4gZXh0ZXJuYWwgcHJveHkKLQkgKiAKLQkgKiBAcGFyYW0gZmxhZwotCSAqICAgICAgICAgICAgdHJ1ZSB0byB1c2UgZXh0ZXJuYWwgcHJveHkKLQkgKiBAc2VlIEV4dGVybmFsUHJveHlDb25maWcKLQkgKi8KLQl2b2lkIHNldEV4dGVybmFsUHJveHlGbGFnKGJvb2xlYW4gZmxhZyk7Ci0KLQkvKioKLQkgKiBTZXQgZXh0ZXJuYWwgcHJveHkgaW5mb3JtYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gaG9zdAotCSAqICAgICAgICAgICAgcHJveHkgaG9zdAotCSAqIEBwYXJhbSBwb3J0Ci0JICogICAgICAgICAgICBwcm94eSBwb3J0Ci0JICogQHNlZSBFeHRlcm5hbFByb3h5Q29uZmlnI3NldEV4dGVybmFsUHJveHkoU3RyaW5nLCBpbnQpCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbFByb3h5KFN0cmluZyBob3N0LCBpbnQgcG9ydCk7Ci0KLQkvKioKLQkgKiBTZXQgbWF4aW11bSBjb25uZWN0aW9uIG51bWJlciBvZiB0aGUgcHJveHkKLQkgKiAKLQkgKiBAcGFyYW0gY29ubmVjdGlvbnMKLQkgKiAgICAgICAgICAgIG1heGltdW0gY29ubmVjdGlvbiBudW1iZXIKLQkgKiBAc2VlIFByb3h5Q29uZmlnI3NldE1heENvbm5lY3Rpb24oaW50KQotCSAqLwotCXZvaWQgc2V0TWF4Q29ubmVjdGlvbihpbnQgY29ubmVjdGlvbnMpOwotCi0JLyoqCi0JICogU2V0IHRpbWUgb3V0IHZhbHVlIG9mIHRoZSBwcm94eQotCSAqIAotCSAqIEBwYXJhbSB0aW1lb3V0Ci0JICogICAgICAgICAgICB0aW1lIG91dCB2YWx1ZQotCSAqIEBzZWUgUHJveHlDb25maWcjc2V0VGltZW91dChpbnQpCi0JICovCi0Jdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0KTsKLQotCS8qKgotCSAqIFNldCBib29sZWFuIHZhbHVlIHRvIHNwZWNpZnkgaWYgUHJveHkgbmVlZHMgdG8gdXNlIFNXRiBib290IGxvYWRlcgotCSAqIAotCSAqIEBwYXJhbSBmbGFnCi0JICogICAgICAgICAgICB0cnVlIHRvIHVzZSBib290IGxvYWRlcgotCSAqLwotCXZvaWQgc2V0U1dGQm9vdGxvYWRlckZsYWcoYm9vbGVhbiBmbGFnKTsKLQotCS8qKgotCSAqIFNldCB7QGxpbmsgSW5wdXRTdHJlYW19IG9mIFNXRiBib290IGxvYWRlcgotCSAqIAotCSAqIEBwYXJhbSBpcwotCSAqICAgICAgICAgICAgdGFyZ2V0IHtAbGluayBJbnB1dFN0cmVhbX0KLQkgKi8KLQl2b2lkIHNldFNXRkJvb3Rsb2FkZXIoSW5wdXRTdHJlYW0gaXMpOwotCi0JLyoqCi0JICogU2V0IHtAbGluayBJbnB1dFN0cmVhbX0gb2YgU1dGIGJyaWRnZQotCSAqIAotCSAqIEBwYXJhbSBpcwotCSAqICAgICAgICAgICAgdGFyZ2V0IHtAbGluayBJbnB1dFN0cmVhbX0KLQkgKi8KLQl2b2lkIHNldFNXRkJyaWRnZUluaXQoSW5wdXRTdHJlYW0gaXMpOwotCi0JLyoqCi0JICogU2V0IGJvb2xlYW4gdmFsdWUgdG8gc3BlY2lmeSBpZiBQcm94eSBuZWVkcyB0byB1c2Uge0BsaW5rIElTd2ZUcmFuc2NvZGVyfQotCSAqIAotCSAqIEBwYXJhbSBmbGFnCi0JICogICAgICAgICAgICB0cnVlIHRvIHVzZSBib290IGxvYWRlcgotCSAqLwotCXZvaWQgc2V0U1dGVHJhbnNjb2RpbmdGbGFnKGJvb2xlYW4gZmxhZyk7Ci0KLQkvKioKLQkgKiBTZXQgbWluaW11bSB2ZXJzaW9uIG9mIHRhcmdldCBTV0YgY29udGVudAotCSAqIAotCSAqIEBwYXJhbSB2ZXJzaW9uCi0JICogICAgICAgICAgICBtaW5pbXVtIHZlcnNpb24gb2YgdGFyZ2V0IFNXRiBjb250ZW50Ci0JICovCi0Jdm9pZCBzZXRTV0ZUcmFuc2NvZGluZ01pbmltdW1WZXJzaW9uKGludCB2ZXJzaW9uKTsKLQotCS8qKgotCSAqIFNldCB7QGxpbmsgSW5wdXRTdHJlYW19IGZvciBPYmplY3QgdGhhdCB3aWxsIGJlIGltcG9zZWQgYnkKLQkgKiB7QGxpbmsgSVN3ZlRyYW5zY29kZXJ9Ci0JICogCi0JICogQHBhcmFtIGlzCi0JICogICAgICAgICAgICB0YXJnZXQge0BsaW5rIElucHV0U3RyZWFtfQotCSAqIEBzZWUgSVN3ZlRyYW5zY29kZXIjaW1wb3NlKE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXZvaWQgc2V0U1dGVHJhbnNjb2RpbmdJbXBvc2VkRmlsZShJbnB1dFN0cmVhbSBpcyk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC9icmlkZ2UvV2FYY29kaW5nRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9XYVhjb2RpbmdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjJjZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL2JyaWRnZS9XYVhjb2RpbmdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guYnJpZGdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5icmlkZ2UuV2FYY29kaW5nSW1wbDsKLQotLyoqCi0gKiBGYWN0b3J5IGNsYXNzIGZvciB7QGxpbmsgSVdhWGNvZGluZ30KLSAqLwotcHVibGljIGNsYXNzIFdhWGNvZGluZ0ZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZSBuZXcge0BsaW5rIElXYVhjb2Rpbmd9IGluc3RhbmNlCi0JICogCi0JICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIElXYVhjb2Rpbmd9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJV2FYY29kaW5nIGdldFdhWGNvZGluZygpIHsKLQkJcmV0dXJuIFdhWGNvZGluZ0ltcGwuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC90cmFuc2NvZGVyL0lTd2ZUcmFuc2NvZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvdHJhbnNjb2Rlci9JU3dmVHJhbnNjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmY2ODcxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC90cmFuc2NvZGVyL0lTd2ZUcmFuc2NvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnRyYW5zY29kZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBwcm92aWRlIFNXRiB0cmFuc2NvZGluZyBmdW5jdGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTd2ZUcmFuc2NvZGVyIHsKLQkvKioKLQkgKiBQYXJzZSB0YXJnZXQgaW5wdXQgc3RyZWFtCi0JICogCi0JICogQHBhcmFtIGlzCi0JICogICAgICAgICAgICB0YXJnZXQgaW5wdXQgc3RyZWFtCi0JICogQHJldHVybiBwYXJzZWQgT2JqZWN0Ci0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlPYmplY3QgcGFyc2UoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBJbXBvc2UgdGFyZ2V0IHRvIHNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSBpbXBvc2UKLQkgKiAgICAgICAgICAgIHRhcmdldCBPYmplY3QgdG8gaW1wb3NlCi0JICogQHBhcmFtIHNyYwotCSAqICAgICAgICAgICAgc291cmNlIE9iamVjdAotCSAqIEByZXR1cm4gaW1wb3NlZCBPYmplY3QKLQkgKi8KLQlPYmplY3QgaW1wb3NlKE9iamVjdCBpbXBvc2UsIE9iamVjdCBzcmMpOwotCi0JLyoqCi0JICogR2VuZXJhdGUgY29udGVudCBmcm9tIE9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBzd2YKLQkgKiAgICAgICAgICAgIHRhcmdldCBPYmplY3QKLQkgKiBAcGFyYW0gY29tcHJlc3MKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIGNvbXByZXNzIHRoZSBjb250ZW50Ci0JICogQHBhcmFtIHZlcnNpb24KLQkgKiAgICAgICAgICAgIHRhcmdldCB2ZXJzaW9uCi0JICogQHJldHVybiBnZW5lcmF0ZWQgY29udGVudAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JYnl0ZVtdIGdlbmVyYXRlKE9iamVjdCBzd2YsIGJvb2xlYW4gY29tcHJlc3MsIGludCB2ZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3RyYW5zY29kZXIvSVN3ZlRyYW5zY29kZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvdHJhbnNjb2Rlci9JU3dmVHJhbnNjb2RlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4NDhlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvdHJhbnNjb2Rlci9JU3dmVHJhbnNjb2RlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gudHJhbnNjb2RlcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gaW1wbGVtZW50IEZhY3RvcnkgY2xhc3MgZm9yIHtAbGluayBJU3dmVHJhbnNjb2Rlcn0KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3dmVHJhbnNjb2RlckZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIElTd2ZUcmFuc2NvZGVyfQotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgaW5zdGFuY2UgSUQKLQkgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgSVN3ZlRyYW5zY29kZXJ9Ci0JICovCi0JSVN3ZlRyYW5zY29kZXIgbmV3SW5zdGFuY2UoaW50IGlkKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC91dGlsL0ZsYXNoRGV0ZWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvZmxhc2gvdXRpbC9GbGFzaERldGVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjAyNGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC91dGlsL0ZsYXNoRGV0ZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guRmxhc2hQbGF5ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUZsYXNoQ29uc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLkNvbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBkZXRlY3QgRmxhc2hQbGF5ZXIKLSAqLwotcHVibGljIGNsYXNzIEZsYXNoRGV0ZWN0IHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzdHJWZXJzaW9uID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlJRGlzcGF0Y2ggaWRpc3AgPSBDb21TZXJ2aWNlCi0JCQkJCS5jcmVhdGVEaXNwYXRjaChJRmxhc2hDb25zdC5DTFNJRF9GTEFTSCk7Ci0JCQlTdHJpbmcgcmF3VmVyc2lvbiA9IEZsYXNoUGxheWVyRmFjdG9yeQotCQkJCQkuZ2V0UGxheWVyRnJvbUlEc2lwYXRjaChpZGlzcCkuZ2V0UGxheWVyVmVyc2lvbigpOwotCQkJLy8gU3RyaW5nIHJhd1ZlcnNpb24gPSAoU3RyaW5nKQotCQkJLy8gaWRpc3AuaW52b2tlMShJRmxhc2hDb25zdC5QTEFZRVJfR0VUX1ZBUklBQkxFLAotCQkJLy8gSUZsYXNoQ29uc3QuUExBWUVSX1ZFUlNJT04pOwotCQkJaW50IHNlcCA9IHJhd1ZlcnNpb24uaW5kZXhPZignICcpOwotCQkJaWYgKHNlcCA+IDApIHsKLQkJCQlzdHJWZXJzaW9uID0gcmF3VmVyc2lvbi5zdWJzdHJpbmcoc2VwICsgMSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2hvdyBpbmZvcm1hdGlvbiBkaWFsb2cgZm9yIEZsYXNoUGxheWVyIGlmIHRoZSB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNob3dEaWFsb2coKSB7Ci0JCWlmIChudWxsID09IHN0clZlcnNpb24pCi0JCQlyZXR1cm47Ci0JCWludCBzZXAgPSBzdHJWZXJzaW9uLmluZGV4T2YoJywnKTsKLQkJaWYgKHNlcCA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKEludGVnZXIucGFyc2VJbnQoc3RyVmVyc2lvbi5zdWJzdHJpbmcoMCwgc2VwKSkgPCA4KSB7Ci0JCQkJCU1lc3NhZ2VEaWFsb2cKLQkJCQkJCQkub3Blbldhcm5pbmcoCi0JCQkJCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJCQkJTWVzc2FnZXMuZ2V0U3RyaW5nKCJmbGFzaC53YXJuaW5nIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCQlNZXNzYWdlcwotCQkJCQkJCQkJCQkJCQkJLmdldFN0cmluZygiZmxhc2guYmFkX2ZsYXNoX3ZlcnNpb24iKSwgbmV3IE9iamVjdFtdIHsgc3RyVmVyc2lvbiB9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXN0clZlcnNpb24gPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3V0aWwvRmxhc2hNU0FBVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ZsYXNoL3V0aWwvRmxhc2hNU0FBVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI2OTkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9mbGFzaC91dGlsL0ZsYXNoTVNBQVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLkZsYXNoUGxheWVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklGbGFzaFBsYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuRmxhc2hNU0FBT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5GbGFzaE1TQUFPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5XaW5kb3dVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guQ29tU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklEaXNwYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklTZXJ2aWNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JVW5rbm93bjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIubXNhYS5NU0FBOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGFjY2Vzc2libGUgb2JqZWN0cyBvZiBGbGFzaC4KLSAqLwotcHVibGljIGNsYXNzIEZsYXNoTVNBQVV0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBTQ0FOX0FMTCA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gU0hPV19PRkZTQ1JFRU4gPSBmYWxzZTsKLQotCS8qKgotCSAqIEBwYXJhbSBpYWNjCi0JICogICAgICAgICAgICB0aGUgYWRkcmVzcyBvZiBJQWNjZXNzaWJsZQotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdGFyZ2V0IGlzIGEgRmxhc2ggb2JqZWN0IG9yIG5vdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGbGFzaChpbnQgaWFjYykgewotCQlGbGFzaE1TQUFPYmplY3QgYWNjID0gRmxhc2hNU0FBT2JqZWN0RmFjdG9yeQotCQkJCS5nZXRGbGFzaE1TQUFPYmplY3RGcm9tUHRyKGlhY2MpOwotCQlyZXR1cm4gaXNGbGFzaChhY2MpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpYWNjCi0JICogICAgICAgICAgICB0aGUgYWRkcmVzcyBvZiBJQWNjZXNzaWJsZQotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgPGk+YWNjT2JqZWN0PC9pPiBpcyBhbiBpbnZpc2libGUgRmxhc2ggb2JqZWN0IG9yCi0JICogICAgICAgICBub3QuIEludmlzaWJsZSBtZWFucyB0aGF0IHRoZSBGbGFzaCBvYmplY3QgaXMgaW4gd2luZG93LWxlc3MKLQkgKiAgICAgICAgIG1vZGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW52aXNpYmxlRmxhc2goaW50IGlhY2MpIHsKLQkJRmxhc2hNU0FBT2JqZWN0IGFjYyA9IEZsYXNoTVNBQU9iamVjdEZhY3RvcnkKLQkJCQkuZ2V0Rmxhc2hNU0FBT2JqZWN0RnJvbVB0cihpYWNjKTsKLQkJcmV0dXJuIGlzSW52aXNpYmxlRmxhc2goYWNjKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaHduZAotCSAqICAgICAgICAgICAgdGhlIHJvb3Qgd2luZG93IHRvIGJlIHVzZWQgdG8gb2J0YWluIGRlc2NlbmRhbnQgRmxhc2hQbGF5ZXJzLgotCSAqIEByZXR1cm4gYXJyYXkge0BsaW5rIElGbGFzaFBsYXllcn0gdGhhdCBhcmUgZGVzY2VuZGFudCBvZiB0aGUgcm9vdAotCSAqICAgICAgICAgd2luZG93LiBJdCBpcyBzYW1lIGFzIGdldEZsYXNoUGxheWVycyhod25kLCBmYWxzZSwgZmFsc2UpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZsYXNoUGxheWVyW10gZ2V0Rmxhc2hQbGF5ZXJzKGludCBod25kKSB7Ci0JCXJldHVybiBnZXRGbGFzaFBsYXllcnMoaHduZCwgU0hPV19PRkZTQ1JFRU4sIFNDQU5fQUxMKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaHduZAotCSAqICAgICAgICAgICAgdGhlIHJvb3Qgd2luZG93IHRvIGJlIHVzZWQgdG8gb2J0YWluIGRlc2NlbmRhbnQgRmxhc2hQbGF5ZXJzLgotCSAqIEBwYXJhbSBzaG93T2ZmU2NyZWVuCi0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSBvYmplY3RzIGJlaW5nIG9mZiBzY3JlZW4gYXJlIGNvbGxlY3RlZCBvciBub3QuCi0JICogQHBhcmFtIHNjYW5BbGwKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIHdpbmRvdy1sZXNzIEZsYXNoIG9iamVjdHMgYXJlIGNvbGxlY3RlZCBvciBub3QuCi0JICogQHJldHVybiBhcnJheSB7QGxpbmsgSUZsYXNoUGxheWVyfSB0aGF0IGFyZSBkZXNjZW5kYW50IG9mIHRoZSByb290Ci0JICogICAgICAgICB3aW5kb3cuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmxhc2hQbGF5ZXJbXSBnZXRGbGFzaFBsYXllcnMoaW50IGh3bmQsCi0JCQlib29sZWFuIHNob3dPZmZTY3JlZW4sIGJvb2xlYW4gc2NhbkFsbCkgewotCQlGbGFzaE1TQUFPYmplY3QgYWNjID0gRmxhc2hNU0FBT2JqZWN0RmFjdG9yeQotCQkJCS5nZXRGbGFzaE1TQUFPYmplY3RGcm9tV2luZG93KGh3bmQpOwotCQlGbGFzaE1TQUFPYmplY3RbXSBhY2NzID0gZ2V0Rmxhc2hFbGVtZW50cyhhY2MsIHNob3dPZmZTY3JlZW4sIHNjYW5BbGwpOwotCQlJRmxhc2hQbGF5ZXJbXSByZXQgPSBuZXcgSUZsYXNoUGxheWVyW2FjY3MubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXRbaV0gPSBGbGFzaFBsYXllckZhY3RvcnkuZ2V0UGxheWVyRnJvbU9iamVjdChhY2NzW2ldKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY2NPYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBhY2Nlc3NpYmxlIG9iamVjdCB0byBiZSBjaGVja2VkLgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgPGk+YWNjT2JqZWN0PC9pPiBpcyBhIEZsYXNoIG9iamVjdCBvciBub3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmxhc2goRmxhc2hNU0FBT2JqZWN0IGFjY09iamVjdCkgewotCQlyZXR1cm4gaXNGbGFzaENsYXNzKGFjY09iamVjdC5nZXRDbGFzc05hbWUoKSkKLQkJCQl8fCBpc0ludmlzaWJsZUZsYXNoKGFjY09iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjY09iamVjdAotCSAqICAgICAgICAgICAgdGhlIGFjY2Vzc2libGUgb2JqZWN0IHRvIGJlIGNoZWNrZWQuCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSA8aT5hY2NPYmplY3Q8L2k+IGlzIGFuIGludmlzaWJsZSBGbGFzaCBvYmplY3Qgb3IKLQkgKiAgICAgICAgIG5vdC4gSW52aXNpYmxlIG1lYW5zIHRoYXQgdGhlIEZsYXNoIG9iamVjdCBpcyBpbiB3aW5kb3ctbGVzcwotCSAqICAgICAgICAgbW9kZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnZpc2libGVGbGFzaChGbGFzaE1TQUFPYmplY3QgYWNjT2JqZWN0KSB7Ci0JCWlmIChNU0FBLlJPTEVfU1lTVEVNX0NMSUVOVCA9PSBhY2NPYmplY3QuZ2V0QWNjUm9sZSgpKSB7Ci0JCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBhY2NPYmplY3QuZ2V0QWNjRGVzY3JpcHRpb24oKTsKLQkJCWlmIChudWxsICE9IGRlc2NyaXB0aW9uICYmIGRlc2NyaXB0aW9uLnN0YXJ0c1dpdGgoIlBMVUdJTjogdHlwZT0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG51bGwgIT0gRmxhc2hNU0FBVXRpbC5nZXRIdG1sQXR0cmlidXRlKGFjY09iamVjdCwKLQkJCQkJCSJXTW9kZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBjbGFzcyBuYW1lIHJlbGF0ZXMgdG8gRmxhc2ggY29udGVudAotCSAqIAotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiAgICAgICAgICAgIHRhcmdldCBjbGFzcyBuYW1lCi0JICogQHJldHVybiB0cnVlIGlmIGNsYXNzIG5hbWUgaXMgPGk+TWFjcm9tZWRpYUZsYXNoUGxheWVyQWN0aXZlWDwvaT4gb3IKLQkgKiAgICAgICAgIDxpPlNob2Nrd2F2ZUZsYXNoUGx1Z2luPC9pPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZsYXNoQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gIk1hY3JvbWVkaWFGbGFzaFBsYXllckFjdGl2ZVgiLmVxdWFscyhjbGFzc05hbWUpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkiU2hvY2t3YXZlRmxhc2hQbHVnaW4iLmVxdWFscyhjbGFzc05hbWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJvb3QKLQkgKiAgICAgICAgICAgIHRoZSByb290IGVsZW1lbnQgdG8gYmUgdXNlZCB0byBvYnRhaW4gaXRzIGNoaWxkcmVuLgotCSAqIEByZXR1cm4gdGhlIGNoaWxkcmVuIG9mIHRoZSA8aT5pbnB1dEVsZW1lbnQ8L2k+LiBJdCBpcyBzYW1lIGFzCi0JICogICAgICAgICBnZXRGbGFzaEVsZW1lbnRzKGlucHV0RWxlbWVudCwgZmFsc2UsIGZhbHNlKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZsYXNoTVNBQU9iamVjdFtdIGdldEZsYXNoRWxlbWVudHMoRmxhc2hNU0FBT2JqZWN0IHJvb3QpIHsKLQkJcmV0dXJuIGdldEZsYXNoRWxlbWVudHMocm9vdCwgU0hPV19PRkZTQ1JFRU4sIFNDQU5fQUxMKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcm9vdAotCSAqICAgICAgICAgICAgdGhlIHJvb3QgZWxlbWVudCB0byBiZSB0cmF2ZXJzZWQgdG8gY29sbGVjdCBGbGFzaCBvYmplY3RzLgotCSAqIEBwYXJhbSBzaG93T2ZmU2NyZWVuCi0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSBvYmplY3RzIGJlaW5nIG9mZiBzY3JlZW4gYXJlIGNvbGxlY3RlZCBvciBub3QuCi0JICogQHBhcmFtIHNjYW5BbGwKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIHdpbmRvdy1sZXNzIEZsYXNoIG9iamVjdHMgYXJlIGNvbGxlY3RlZCBvciBub3QuCi0JICogQHJldHVybiB0aGUgY29sbGVjdGVkIEZsYXNoIG9iamVjdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBGbGFzaE1TQUFPYmplY3RbXSBnZXRGbGFzaEVsZW1lbnRzKEZsYXNoTVNBQU9iamVjdCByb290LAotCQkJYm9vbGVhbiBzaG93T2ZmU2NyZWVuLCBib29sZWFuIHNjYW5BbGwpIHsKLQkJRmxhc2hGaW5kZXIgZmluZGVyID0gbmV3IEZsYXNoRmluZGVyKCk7Ci0JCWZpbmRlci5maW5kKHJvb3QsIHNob3dPZmZTY3JlZW4sIHNjYW5BbGwpOwotCQlyZXR1cm4gZmluZGVyLmdldFJlc3VsdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBzY2FuIG1vZGUgb2YgRmxhc2ggZmluZGVyLiBJZiBpdCBpcyB0cnVlIHRoZW4gdGhlIHdpbmRvdy1sZXNzCi0JICogICAgICAgICBGbGFzaCBvYmplY3RzIGFyZSBhbHNvIGNvbGxlY3RlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTY2FuQWxsKCkgewotCQlyZXR1cm4gU0NBTl9BTEw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNjYW5fYWxsCi0JICogICAgICAgICAgICB0aGUgc2NhbiBtb2RlIG9mIEZsYXNoIGZpbmRlci4gSWYgaXQgaXMgdHJ1ZSB0aGVuIHRoZQotCSAqICAgICAgICAgICAgd2luZG93LWxlc3MgRmxhc2ggb2JqZWN0cyBhcmUgYWxzbyBjb2xsZWN0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNjYW5BbGwoYm9vbGVhbiBzY2FuX2FsbCkgewotCQlTQ0FOX0FMTCA9IHNjYW5fYWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHNjYW4gbW9kZSBvZiBGbGFzaCBmaW5kZXIuIElmIGl0IGlzIHRydWUgdGhlbiB0aGUgb2ZmIHNjcmVlbgotCSAqICAgICAgICAgb2JqZWN0cyBhcmUgYWxzbyBjb2xsZWN0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2hvd09mZnNjcmVlbigpIHsKLQkJcmV0dXJuIFNIT1dfT0ZGU0NSRUVOOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzaG93X29mZnNjcmVlbgotCSAqICAgICAgICAgICAgdGhlIHNjYW4gbW9kZSBvZiBGbGFzaCBmaW5kZXIuIElmIGl0IGlzIHRydWUgdGhlbiB0aGUgb2ZmCi0JICogICAgICAgICAgICBzY3JlZW4gb2JqZWN0cyBhcmUgYWxzbyBjb2xsZWN0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNob3dPZmZzY3JlZW4oYm9vbGVhbiBzaG93X29mZnNjcmVlbikgewotCQlTSE9XX09GRlNDUkVFTiA9IHNob3dfb2Zmc2NyZWVuOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZsYXNoRmluZGVyIHsKLQkJcHJpdmF0ZSBib29sZWFuIHNob3dPZmZTY3JlZW4gPSBmYWxzZTsKLQotCQlwcml2YXRlIExpc3Q8Rmxhc2hNU0FBT2JqZWN0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEZsYXNoTVNBQU9iamVjdD4oKTsKLQotCQlwdWJsaWMgdm9pZCBmaW5kKEZsYXNoTVNBQU9iamVjdCBhY2NPYmplY3QsIGJvb2xlYW4gc2hvd09mZlNjcmVlbiwKLQkJCQlib29sZWFuIHNjYW5BbGwpIHsKLQkJCXRoaXMuc2hvd09mZlNjcmVlbiA9IHNob3dPZmZTY3JlZW47Ci0JCQlpZiAoc2NhbkFsbCB8fCAwICE9IGZpbmRGbGFzaFdpbmRvdygoaW50KSBhY2NPYmplY3QuZ2V0V2luZG93KCkpKSB7Ci0JCQkJZmluZENoaWxkcmVuKGFjY09iamVjdCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHN0YXRpYyBpbnQgZmluZEZsYXNoV2luZG93KGludCBod25kKSB7Ci0JCQlpZiAoMCAhPSBod25kKSB7Ci0JCQkJaWYgKEZsYXNoTVNBQVV0aWwuaXNGbGFzaENsYXNzKFdpbmRvd1V0aWwKLQkJCQkJCS5HZXRXaW5kb3dDbGFzc05hbWUoaHduZCkpKSB7Ci0JCQkJCXJldHVybiBod25kOwotCQkJCX0KLQkJCQlmb3IgKGludCBod25kQ2hpbGQgPSBXaW5kb3dVdGlsLkdldENoaWxkV2luZG93KGh3bmQpOyAwICE9IGh3bmRDaGlsZDsgaHduZENoaWxkID0gV2luZG93VXRpbAotCQkJCQkJLkdldE5leHRXaW5kb3coaHduZENoaWxkKSkgewotCQkJCQlpbnQgaHduZEZvdW5kID0gZmluZEZsYXNoV2luZG93KGh3bmRDaGlsZCk7Ci0JCQkJCWlmICgwICE9IGh3bmRGb3VuZCkgewotCQkJCQkJcmV0dXJuIGh3bmRGb3VuZDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGZpbmRDaGlsZHJlbihGbGFzaE1TQUFPYmplY3RbXSBpbnB1dEVsZW1lbnRzKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlucHV0RWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaW5kQ2hpbGRyZW4oKEZsYXNoTVNBQU9iamVjdCkgaW5wdXRFbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZmluZENoaWxkcmVuKEZsYXNoTVNBQU9iamVjdCBhY2NPYmplY3QpIHsKLQkJCWlmIChudWxsICE9IGFjY09iamVjdCkgewotCQkJCWludCByb2xlID0gYWNjT2JqZWN0LmdldEFjY1JvbGUoKTsKLQkJCQlpZiAoKE1TQUEuUk9MRV9TWVNURU1fV0lORE9XID09IHJvbGUgfHwgTVNBQS5ST0xFX1NZU1RFTV9DTElFTlQgPT0gcm9sZSkKLQkJCQkJCSYmIEZsYXNoTVNBQVV0aWwuaXNGbGFzaChhY2NPYmplY3QpKSB7Ci0JCQkJCXJlc3VsdC5hZGQoYWNjT2JqZWN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlzd2l0Y2ggKGFjY09iamVjdC5nZXRBY2NTdGF0ZSgpCi0JCQkJCQkJJiAoTVNBQS5TVEFURV9JTlZJU0lCTEUgfCBNU0FBLlNUQVRFX09GRlNDUkVFTikpIHsKLQkJCQkJY2FzZSBNU0FBLlNUQVRFX0lOVklTSUJMRSB8IE1TQUEuU1RBVEVfT0ZGU0NSRUVOOgotCQkJCQkJaWYgKCFzaG93T2ZmU2NyZWVuKQotCQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDA6Ci0JCQkJCQlmaW5kQ2hpbGRyZW4oYWNjT2JqZWN0LmdldENoaWxkcmVuKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgRmxhc2hNU0FBT2JqZWN0W10gZ2V0UmVzdWx0cygpIHsKLQkJCUZsYXNoTVNBQU9iamVjdFtdIHJlc3VsdEFycmF5ID0gbmV3IEZsYXNoTVNBQU9iamVjdFtyZXN1bHQuc2l6ZSgpXTsKLQkJCXJldHVybiByZXN1bHQudG9BcnJheShyZXN1bHRBcnJheSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpYWNjCi0JICogICAgICAgICAgICB0aGUgYWRkcmVzcyBvZiBJQWNjZXNzaWJsZQotCSAqIEByZXR1cm4gdGhlIEhUTUwgZWxlbWVudCBpbnRlcmZhY2Ugb2YgdGhlIDxpPm9ialVua25vd248L2k+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURpc3BhdGNoIGdldEh0bWxFbGVtZW50RnJvbVB0cihpbnQgaWFjYykgewotCQlGbGFzaE1TQUFPYmplY3QgYWNjID0gRmxhc2hNU0FBT2JqZWN0RmFjdG9yeQotCQkJCS5nZXRGbGFzaE1TQUFPYmplY3RGcm9tUHRyKGlhY2MpOwotCQlyZXR1cm4gZ2V0SHRtbEVsZW1lbnRGcm9tT2JqZWN0KGFjYyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlhY2MKLQkgKiAgICAgICAgICAgIHRoZSBhZGRyZXNzIG9mIElBY2Nlc3NpYmxlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRhcmdldCBhdHRyaWJ1dGUgbmFtZQotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZSBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SHRtbEF0dHJpYnV0ZShpbnQgaWFjYywgU3RyaW5nIG5hbWUpIHsKLQkJRmxhc2hNU0FBT2JqZWN0IGFjYyA9IEZsYXNoTVNBQU9iamVjdEZhY3RvcnkKLQkJCQkuZ2V0Rmxhc2hNU0FBT2JqZWN0RnJvbVB0cihpYWNjKTsKLQkJcmV0dXJuIGdldEh0bWxBdHRyaWJ1dGUoYWNjLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqVW5rbm93bgotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBiZSB1c2VkIHRvIG9idGFpbiB0aGUgaW50ZXJmYWNlIG9mIEhUTUwgZWxlbWVudC4KLQkgKiAgICAgICAgICAgIEl0IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgSUFjY2Vzc2libGVPYmplY3Qgb3IgYW4gaW5zdGFuY2Ugb2YKLQkgKiAgICAgICAgICAgIElVbmtub3duCi0JICogQHJldHVybiB0aGUgSFRNTCBlbGVtZW50IGludGVyZmFjZSBvZiB0aGUgPGk+b2JqVW5rbm93bjwvaT4uCi0JICogQHNlZSBJQWNjZXNzaWJsZU9iamVjdAotCSAqIEBzZWUgSVVua25vd24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElEaXNwYXRjaCBnZXRIdG1sRWxlbWVudEZyb21PYmplY3QoT2JqZWN0IG9ialVua25vd24pIHsKLQkJaWYgKG9ialVua25vd24gaW5zdGFuY2VvZiBGbGFzaE1TQUFPYmplY3QpIHsKLQkJCW9ialVua25vd24gPSAoKEZsYXNoTVNBQU9iamVjdCkgb2JqVW5rbm93bikuZ2V0SUFjY2Vzc2libGUoKTsKLQkJfQotCQlpZiAob2JqVW5rbm93biBpbnN0YW5jZW9mIElVbmtub3duKSB7Ci0JCQlJU2VydmljZVByb3ZpZGVyIHNwID0gKElTZXJ2aWNlUHJvdmlkZXIpICgoSVVua25vd24pIG9ialVua25vd24pCi0JCQkJCS5xdWVyeUludGVyZmFjZShJVW5rbm93bi5JSURfSVNlcnZpY2VQcm92aWRlcik7Ci0JCQlpZiAoc3AgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCUlVbmtub3duIGlkaXNwID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWRpc3AgPSBzcC5xdWVyeVNlcnZpY2UoSVVua25vd24uSUlEX0lIVE1MRWxlbWVudCwKLQkJCQkJCUlVbmtub3duLklJRF9JSFRNTEVsZW1lbnQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJaWYgKGlkaXNwID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gQ29tU2VydmljZS5uZXdJRGlzcGF0Y2goaWRpc3ApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmpVbmtub3duCi0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGJlIHVzZWQgdG8gb2J0YWluIHRoZSBpbnRlcmZhY2Ugb2YgSFRNTCBlbGVtZW50LgotCSAqICAgICAgICAgICAgSXQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBJQWNjZXNzaWJsZU9iamVjdCBvciBhbiBpbnN0YW5jZSBvZgotCSAqICAgICAgICAgICAgSVVua25vd24KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGJlIHVzZWQuCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlIHN0cmluZy4KLQkgKiBAc2VlICNnZXRIdG1sRWxlbWVudEZyb21PYmplY3QoT2JqZWN0KQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRIdG1sQXR0cmlidXRlKE9iamVjdCBvYmpVbmtub3duLCBTdHJpbmcgbmFtZSkgewotCQlJRGlzcGF0Y2ggdmFyRWxlbWVudCA9IGdldEh0bWxFbGVtZW50RnJvbU9iamVjdChvYmpVbmtub3duKTsKLQkJaWYgKHZhckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIChTdHJpbmcpIHZhckVsZW1lbnQuZ2V0KG5hbWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL0FTQnJpZGdlSW1wbFY4LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvQVNCcmlkZ2VJbXBsVjguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlMzJhZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvQVNCcmlkZ2VJbXBsVjguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUZsYXNoUGxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guYXMuQVNEZXNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5hcy5BU09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmFzLkFTU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmJyaWRnZS5JV2FYY29kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guYnJpZGdlLldhWGNvZGluZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5EaXNwYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklEaXNwYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgY2xhc3MgQVNCcmlkZ2VJbXBsVjggaW1wbGVtZW50cyBJQVNCcmlkZ2UgewotCi0JcHJpdmF0ZSBJRmxhc2hQbGF5ZXIgZmxhc2hQbGF5ZXI7Ci0JcHJpdmF0ZSBJRGlzcGF0Y2ggaWRpc3BGbGFzaDsKLQotCXByaXZhdGUgT2JqZWN0IG9iak1hcmtlcjsKLQotCXByaXZhdGUgU3RyaW5nIHJlcXVlc3RBcmdzUGF0aDsKLQlwcml2YXRlIFN0cmluZyByZXNwb25zZVZhbHVlUGF0aDsKLQlwcml2YXRlIFN0cmluZyBjb250ZW50SWRQYXRoOwotCXByaXZhdGUgU3RyaW5nIHNlY3JldCA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gX2lzUmVwYWlyZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBBU0JyaWRnZUltcGxWOChJRmxhc2hQbGF5ZXIgZmxhc2hQbGF5ZXIpIHsKLQkJdGhpcy5mbGFzaFBsYXllciA9IGZsYXNoUGxheWVyOwotCQlpZGlzcEZsYXNoID0gZmxhc2hQbGF5ZXIuZ2V0RGlzcGF0Y2goKTsKLQotCQlTdHJpbmcgcm9vdFBhdGggPSAiIjsKLQkJaWYgKCJ0cnVlIi5lcXVhbHMoZ2V0VmFyaWFibGUoUEFUSF9ST09UTEVWRUwgKyBQQVRIX0lTX0FWQUlMQUJMRSkpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcm9vdFBhdGggPSBQQVRIX1JPT1RMRVZFTDsKLQkJfSBlbHNlIGlmICgidHJ1ZSIuZXF1YWxzKGdldFZhcmlhYmxlKFBBVEhfQlJJREdFTEVWRUwgKyBQQVRIX0lTX0FWQUlMQUJMRSkpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcm9vdFBhdGggPSBQQVRIX0JSSURHRUxFVkVMOwotCQl9Ci0KLQkJdGhpcy5yZXF1ZXN0QXJnc1BhdGggPSByb290UGF0aCArIFBST1BfUkVRVUVTVF9BUkdTOwotCQl0aGlzLnJlc3BvbnNlVmFsdWVQYXRoID0gcm9vdFBhdGggKyBQUk9QX1JFU1BPTlNFX1ZBTFVFOwotCQl0aGlzLmNvbnRlbnRJZFBhdGggPSByb290UGF0aCArIFBBVEhfQ09OVEVOVF9JRDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRWYXJpYWJsZShTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IGlkaXNwRmxhc2guaW52b2tlMShQTEFZRVJfR0VUX1ZBUklBQkxFLCBuYW1lKTsKLQkJCXJldHVybiAoU3RyaW5nKSBvYmo7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYXJpYWJsZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlpZGlzcEZsYXNoCi0JCQkJCS5pbnZva2UoUExBWUVSX1NFVF9WQVJJQUJMRSwgbmV3IE9iamVjdFtdIHsgbmFtZSwgdmFsdWUgfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5pdFNlY3JldCgpIHsKLQkJaWYgKG51bGwgIT0gc2VjcmV0KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQl0cnkgewotCQkJU3RyaW5nIGlkID0gZ2V0VmFyaWFibGUoY29udGVudElkUGF0aCk7Ci0JCQlpZiAobnVsbCA9PSBpZCB8fCBpZC5sZW5ndGgoKSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCUlXYVhjb2Rpbmcgd2F4Y29kaW5nID0gV2FYY29kaW5nRmFjdG9yeS5nZXRXYVhjb2RpbmcoKTsKLQkJCXNlY3JldCA9IHdheGNvZGluZy5nZXRTZWNyZXQoaWQsIGZhbHNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIChudWxsICE9IHNlY3JldCk7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgaW52b2tlKFN0cmluZyBtZXRob2QpIHsKLQkJcmV0dXJuIGludm9rZShuZXcgT2JqZWN0W10geyBtZXRob2QgfSk7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgaW52b2tlKFN0cmluZyBtZXRob2QsIE9iamVjdCBhcmcxKSB7Ci0JCXJldHVybiBpbnZva2UobmV3IE9iamVjdFtdIHsgbWV0aG9kLCBhcmcxIH0pOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGludm9rZShPYmplY3RbXSBhcmdzKSB7Ci0JCWludCBjb3VudGVyID0gMDsKLQkJdHJ5IHsKLQkJCWlmICghaW5pdFNlY3JldCgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlzZXRWYXJpYWJsZShyZXNwb25zZVZhbHVlUGF0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXJnc1N0ciA9IEFTU2VyaWFsaXplci5zZXJpYWxpemUoc2VjcmV0LCBhcmdzKTsKLQkJCXNldFZhcmlhYmxlKHJlcXVlc3RBcmdzUGF0aCwgYXJnc1N0cik7Ci0JCQlsb25nIGVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIDEwMDsKLQkJCXdoaWxlIChlbmRUaW1lID4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIHsKLQkJCQljb3VudGVyKys7Ci0JCQkJU3RyaW5nIHZhbHVlID0gZ2V0VmFyaWFibGUocmVzcG9uc2VWYWx1ZVBhdGgpOwotCQkJCWlmIChudWxsICE9IHZhbHVlICYmIHZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCQlBU0Rlc2VyaWFsaXplciBhc2QgPSBuZXcgQVNEZXNlcmlhbGl6ZXIodmFsdWUpOwotCQkJCQlyZXR1cm4gYXNkLmRlc2VyaWFsaXplKCk7Ci0JCQkJfQotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLnJlYWRBbmREaXNwYXRjaCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjb3VudGVyICE9IDEpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZsYXNoUGxheWVyOiAiICsgY291bnRlcik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIGFyZ3NbIiArIGkgKyAiXT0iICsgYXJnc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElBU05vZGVbXSBjcmVhdGVGbGFzaE5vZGVBcnJheShPYmplY3Qgb2JqZWN0LCBJQVNOb2RlIHBhcmVudE5vZGUpIHsKLQkJTGlzdDxBU05vZGVJbXBsVjg+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxBU05vZGVJbXBsVjg+KCk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBPYmplY3RbXSkgewotCQkJT2JqZWN0W10gb2JqQ2hpbGRyZW4gPSAoT2JqZWN0W10pIG9iamVjdDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAob2JqQ2hpbGRyZW5baV0gaW5zdGFuY2VvZiBBU09iamVjdCkgewotCQkJCQljaGlsZHJlbi5hZGQobmV3IEFTTm9kZUltcGxWOChwYXJlbnROb2RlLCBmbGFzaFBsYXllciwKLQkJCQkJCQkoQVNPYmplY3QpIG9iakNoaWxkcmVuW2ldKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KG5ldyBBU05vZGVJbXBsVjhbY2hpbGRyZW4uc2l6ZSgpXSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdE1hcmtlcigpIHsKLQkJaWYgKG9iak1hcmtlciAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlPYmplY3QgcmVzdWx0ID0gaW52b2tlKE1fTkVXX01BUktFUik7Ci0JCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQlvYmpNYXJrZXIgPSAoSW50ZWdlcikgcmVzdWx0OwotCQkJcmV0dXJuOwotCQl9Ci0JCW9iak1hcmtlciA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU0JyaWRnZSNjYWxsTWV0aG9kKG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTTm9kZSwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBjYWxsTWV0aG9kKElBU05vZGUgdGFyZ2V0Tm9kZSwgU3RyaW5nIG1ldGhvZCkgewotCQlyZXR1cm4gaW52b2tlKG5ldyBPYmplY3RbXSB7IE1fQ0FMTF9NRVRIT0QsIHRhcmdldE5vZGUuZ2V0VGFyZ2V0KCksCi0JCQkJbWV0aG9kIH0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2UjY2FsbE1ldGhvZChvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGUsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pCi0JICovCi0JcHVibGljIE9iamVjdCBjYWxsTWV0aG9kKElBU05vZGUgdGFyZ2V0Tm9kZSwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0W10gYXJncykgewotCQlpZiAobnVsbCA9PSBhcmdzKSB7Ci0JCQlhcmdzID0gbmV3IE9iamVjdFswXTsKLQkJfQotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFthcmdzLmxlbmd0aCArIDNdOwotCQlhWzBdID0gTV9DQUxMX01FVEhPRDsKLQkJYVsxXSA9IHRhcmdldE5vZGUuZ2V0VGFyZ2V0KCk7Ci0JCWFbMl0gPSBtZXRob2Q7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJncywgMCwgYSwgMywgYXJncy5sZW5ndGgpOwotCQlyZXR1cm4gaW52b2tlKGEpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2UjZ2V0Q2hpbGRyZW4ob3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5BU05vZGUsCi0JICogICAgICBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBJQVNOb2RlW10gZ2V0Q2hpbGRyZW4oSUFTTm9kZSBwYXJlbnROb2RlLCBib29sZWFuIHZpc3VhbCwKLQkJCWJvb2xlYW4gZGVidWdNb2RlKSB7Ci0JCVN0cmluZyBzaWRNZXRob2Q7Ci0JCWlmICh2aXN1YWwpIHsKLQkJCXNpZE1ldGhvZCA9IE1fR0VUX0lOTkVSX05PREVTOwotCQl9IGVsc2UgewotCQkJc2lkTWV0aG9kID0gZGVidWdNb2RlID8gTV9HRVRfU1VDQ0VTU09SX05PREVTIDogTV9HRVRfQ0hJTERfTk9ERVM7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZUZsYXNoTm9kZUFycmF5KGludm9rZShzaWRNZXRob2QsIHBhcmVudE5vZGUuZ2V0VGFyZ2V0KCkpLAotCQkJCXBhcmVudE5vZGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2UjZ2V0Tm9kZUF0RGVwdGhXaXRoUGF0aChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQVNOb2RlIGdldE5vZGVBdERlcHRoV2l0aFBhdGgoU3RyaW5nIHBhdGgsIGludCBkZXB0aCkgewotCQlPYmplY3QgcmVzdWx0ID0gaW52b2tlKG5ldyBPYmplY3RbXSB7IE1fR0VUX05PREVfQVRfREVQVEgsIHBhdGgsCi0JCQkJSW50ZWdlci52YWx1ZU9mKGRlcHRoKSB9KTsKLQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEFTT2JqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IEFTTm9kZUltcGxWOChudWxsLCBmbGFzaFBsYXllciwgKEFTT2JqZWN0KSByZXN1bHQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2UjZ2V0Tm9kZUZyb21QYXRoKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElBU05vZGUgZ2V0Tm9kZUZyb21QYXRoKFN0cmluZyBwYXRoKSB7Ci0JCU9iamVjdCByZXN1bHQgPSBpbnZva2UoTV9HRVRfTk9ERV9GUk9NX1BBVEgsIHBhdGgpOwotCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgQVNPYmplY3QpIHsKLQkJCXJldHVybiBuZXcgQVNOb2RlSW1wbFY4KG51bGwsIGZsYXNoUGxheWVyLCAoQVNPYmplY3QpIHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU0JyaWRnZSNnZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwYXRoLCBTdHJpbmcgcHJvcCkgewotCQlyZXR1cm4gaW52b2tlKG5ldyBPYmplY3RbXSB7IE1fR0VUX1BST1BFUlRZLCBwYXRoLCBwcm9wIH0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2UjZ2V0Um9vdE5vZGUoKQotCSAqLwotCXB1YmxpYyBJQVNOb2RlIGdldFJvb3ROb2RlKCkgewotCQlPYmplY3QgcmVzdWx0ID0gaW52b2tlKE1fR0VUX1JPT1RfTk9ERSk7Ci0JCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBBU09iamVjdCkgewotCQkJcmV0dXJuIG5ldyBBU05vZGVJbXBsVjgobnVsbCwgZmxhc2hQbGF5ZXIsIChBU09iamVjdCkgcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTQnJpZGdlI2hhc0NoaWxkKG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guQVNOb2RlLAotCSAqICAgICAgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZChJQVNOb2RlIHBhcmVudE5vZGUsIGJvb2xlYW4gdmlzdWFsLAotCQkJYm9vbGVhbiBkZWJ1Z01vZGUpIHsKLQkJaWYgKHZpc3VhbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJU3RyaW5nIHNpZE1ldGhvZDsKLQkJaWYgKHZpc3VhbCkgewotCQkJc2lkTWV0aG9kID0gTV9HRVRfTlVNX1NVQ0NFU1NPUl9OT0RFUzsKLQkJfSBlbHNlIHsKLQkJCXNpZE1ldGhvZCA9IGRlYnVnTW9kZSA/IE1fR0VUX05VTV9TVUNDRVNTT1JfTk9ERVMKLQkJCQkJOiBNX0dFVF9OVU1fQ0hJTERfTk9ERVM7Ci0JCX0KLQkJT2JqZWN0IHJlc3VsdCA9IGludm9rZShzaWRNZXRob2QsIHBhcmVudE5vZGUuZ2V0VGFyZ2V0KCkpOwotCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJcmV0dXJuICgoSW50ZWdlcikgcmVzdWx0KS5pbnRWYWx1ZSgpID4gMDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU0JyaWRnZSNyZXBhaXJGbGFzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVwYWlyRmxhc2goKSB7Ci0JCWlmICghX2lzUmVwYWlyZWQpIHsKLQkJCV9pc1JlcGFpcmVkID0gdHJ1ZTsKLQkJCWludm9rZShNX1JFUEFJUl9GTEFTSCwgUEFUSF9ST09UTEVWRUwpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU0JyaWRnZSNzZWFyY2hTb3VuZCgpCi0JICovCi0JcHVibGljIElBU05vZGVbXSBzZWFyY2hTb3VuZCgpIHsKLQkJcmV0dXJuIGNyZWF0ZUZsYXNoTm9kZUFycmF5KGludm9rZShuZXcgT2JqZWN0W10geyBNX1NFQVJDSF9TT1VORCwKLQkJCQlQQVRIX1JPT1RMRVZFTCwgUEFUSF9HTE9CQUwgfSksIG51bGwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2Ujc2VhcmNoVmlkZW8oKQotCSAqLwotCXB1YmxpYyBJQVNOb2RlW10gc2VhcmNoVmlkZW8oKSB7Ci0JCXJldHVybiBjcmVhdGVGbGFzaE5vZGVBcnJheShpbnZva2UobmV3IE9iamVjdFtdIHsgTV9TRUFSQ0hfVklERU8sCi0JCQkJUEFUSF9ST09UTEVWRUwsIFBBVEhfR0xPQkFMIH0pLCBudWxsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTQnJpZGdlI3NldEZvY3VzKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMoU3RyaW5nIHRhcmdldCkgewotCQlPYmplY3QgcmVzdWx0ID0gaW52b2tlKE1fU0VUX0ZPQ1VTLCB0YXJnZXQpOwotCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJcmV0dXJuICgoQm9vbGVhbikgcmVzdWx0KS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU0JyaWRnZSNzZXRNYXJrZXIoamF2YS5sYW5nLk51bWJlciwKLQkgKiAgICAgIGphdmEubGFuZy5OdW1iZXIsIGphdmEubGFuZy5OdW1iZXIsIGphdmEubGFuZy5OdW1iZXIpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0TWFya2VyKE51bWJlciB4LCBOdW1iZXIgeSwgTnVtYmVyIHdpZHRoLCBOdW1iZXIgaGVpZ2h0KSB7Ci0JCXVuc2V0TWFya2VyKCk7Ci0JCWlmIChudWxsICE9IHggJiYgbnVsbCAhPSB5ICYmIG51bGwgIT0gd2lkdGggJiYgbnVsbCAhPSBoZWlnaHQpIHsKLQkJCWluaXRNYXJrZXIoKTsKLQkJCWlmIChudWxsICE9IG9iak1hcmtlcikgewotCQkJCWludm9rZShuZXcgT2JqZWN0W10geyBNX1NFVF9NQVJLRVIsIG9iak1hcmtlciwgeCwgeSwgd2lkdGgsCi0JCQkJCQloZWlnaHQgfSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2Ujc2V0TWFya2VyKG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTTm9kZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXRNYXJrZXIoSUFTTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzZXRNYXJrZXIobm9kZS5nZXRYKCksIG5vZGUuZ2V0WSgpLCBub2RlLmdldFdpZHRoKCksIG5vZGUKLQkJCQkuZ2V0SGVpZ2h0KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2Ujc2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHBhdGgsIFN0cmluZyBwcm9wLCBPYmplY3QgdmFsdWUpIHsKLQkJaW52b2tlKG5ldyBPYmplY3RbXSB7IE1fU0VUX1BST1BFUlRZLCBwYXRoLCBwcm9wLCB2YWx1ZSB9KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTQnJpZGdlI3RyYW5zbGF0ZVdpdGhQYXRoKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElBU05vZGVbXSB0cmFuc2xhdGVXaXRoUGF0aChTdHJpbmcgcGF0aCkgewotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGludm9rZShNX1RSQU5TTEFURSwgcGF0aCk7Ci0JCX0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gY3JlYXRlRmxhc2hOb2RlQXJyYXkocmVzdWx0LCBudWxsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTQnJpZGdlI3Vuc2V0TWFya2VyKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1bnNldE1hcmtlcigpIHsKLQkJaWYgKG9iak1hcmtlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnZva2UoTV9VTlNFVF9NQVJLRVIsIG9iak1hcmtlcik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2UjdXBkYXRlVGFyZ2V0KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVUYXJnZXQoKSB7Ci0JCU9iamVjdCByZXN1bHQgPSBpbnZva2UobmV3IE9iamVjdFtdIHsgTV9VUERBVEVfVEFSR0VULCBQQVRIX1JPT1RMRVZFTCwKLQkJCQkxMCB9KTsKLQkJcmV0dXJuICgocmVzdWx0IGluc3RhbmNlb2YgQm9vbGVhbikgJiYgKCgoQm9vbGVhbikgcmVzdWx0KQotCQkJCS5ib29sZWFuVmFsdWUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNCcmlkZ2UjY2xlYXJBbGxNYXJrZXJzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbGVhckFsbE1hcmtlcnMoKSB7Ci0JCWludm9rZShNX0NMRUFSX0FMTF9NQVJLRVJTKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvQVNOb2RlSW1wbFY4LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvQVNOb2RlSW1wbFY4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MzFjZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL0FTTm9kZUltcGxWOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIFNoaW4gU0FJVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLkFTQWNjSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JRmxhc2hDb25zdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklGbGFzaFBsYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmFzLkFTT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgQVNOb2RlSW1wbFY4IGltcGxlbWVudHMgSUZsYXNoQ29uc3QsIElBU05vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExFVkVMMF9GT0NVU19NQU5BR0VSID0gIl9sZXZlbDAuZm9jdXNNYW5hZ2VyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUwwX1JFU0VSVkVEID0gIl9sZXZlbDAucmVzZXJ2ZWQiOwotCi0JcHJpdmF0ZSBJRmxhc2hQbGF5ZXIgcGxheWVyOwotCXByaXZhdGUgQVNPYmplY3QgYXNPYmplY3Q7Ci0JcHJpdmF0ZSBJQVNOb2RlIHBhcmVudDsKLQlwcml2YXRlIGludCBsZXZlbDsKLQlwcml2YXRlIGludCBpZDsKLQlwcml2YXRlIEFTQWNjSW5mbyBhY2NJbmZvOwotCXByaXZhdGUgYm9vbGVhbiBpc1JlZmVyZW5jZSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBza2lwQ2hpbGRyZW4gPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNBY2NQcm9wZXJ0aWVzID0gZmFsc2U7Ci0KLQlwcml2YXRlIEJvb2xlYW4gaGFzT25SZWxlYXNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgc3RySWNvblR5cGUgPSBBU05PREVfSUNPTl9PVEhFUlM7Ci0JcHJpdmF0ZSBTdHJpbmcgc3RyVHlwZTsKLQlwcml2YXRlIFN0cmluZyBzdHJDbGFzc05hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgc3RyT2JqZWN0TmFtZTsKLQlwcml2YXRlIFN0cmluZyBzdHJUYXJnZXQ7Ci0JcHJpdmF0ZSBib29sZWFuIGlzVUlDb21wb25lbnQ7Ci0KLQlwdWJsaWMgQVNOb2RlSW1wbFY4KElBU05vZGUgcGFyZW50LCBJRmxhc2hQbGF5ZXIgcGxheWVyLCBBU09iamVjdCBub2RlKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLmxldmVsID0gbnVsbCAhPSBwYXJlbnQgPyBwYXJlbnQuZ2V0TGV2ZWwoKSArIDEgOiAwOwotCQl0aGlzLnBsYXllciA9IHBsYXllcjsKLQotCQlhc09iamVjdCA9IG5vZGU7Ci0JCXN0clR5cGUgPSBnZXRTdHJpbmcoQVNOT0RFX1RZUEUpOwotCQlzdHJDbGFzc05hbWUgPSBnZXRTdHJpbmcoQVNOT0RFX0NMQVNTX05BTUUpOwotCQlzdHJPYmplY3ROYW1lID0gZ2V0U3RyaW5nKEFTTk9ERV9PQkpFQ1RfTkFNRSk7Ci0JCXN0clRhcmdldCA9IGdldFN0cmluZyhBU05PREVfVEFSR0VUKTsKLQkJT2JqZWN0IHRtcElkID0gYXNPYmplY3QuZ2V0KEFTTk9ERV9JRCk7Ci0JCWlmICh0bXBJZCBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCWlkID0gKChJbnRlZ2VyKSB0bXBJZCkuaW50VmFsdWUoKTsKLQkJfSBlbHNlIHsKLQkJCWlkID0gLTE7Ci0JCX0KLQotCQlpc1VJQ29tcG9uZW50ID0gInRydWUiLmVxdWFscyhnZXRTdHJpbmcoQVNOT0RFX0lTX1VJX0NPTVBPTkVOVCkpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKG51bGwgIT0gcGFyZW50KSB7Ci0JCQlTdHJpbmcgdGFyZ2V0UGFyZW50ID0gcGFyZW50LmdldFRhcmdldCgpOwotCQkJaWYgKG51bGwgIT0gdGFyZ2V0UGFyZW50KSB7Ci0JCQkJaWYgKCFzdHJUYXJnZXQuZXF1YWxzKHRhcmdldFBhcmVudCArICIuIiArIHN0ck9iamVjdE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaXNSZWZlcmVuY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBwYXJlbnRPYmplY3ROYW1lID0gcGFyZW50LmdldE9iamVjdE5hbWUoKTsKLQkJCWlmIChBQ0NfUFJPUFMuZXF1YWxzKHBhcmVudE9iamVjdE5hbWUpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkJQUNDX0lNUEwuZXF1YWxzKHBhcmVudE9iamVjdE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpc0FjY1Byb3BlcnRpZXMgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChBU05PREVfVFlQRV9OVU1CRVIuZXF1YWxzKHN0clR5cGUpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQlBU05PREVfVFlQRV9OVUxMLmVxdWFscyhzdHJUeXBlKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJQVNOT0RFX1RZUEVfQk9PTEVBTi5lcXVhbHMoc3RyVHlwZSkgfHwgLy8kTk9OLU5MUy0xJAotCQkJCUFTTk9ERV9UWVBFX1NUUklORy5lcXVhbHMoc3RyVHlwZSkgfHwgLy8kTk9OLU5MUy0xJAotCQkJCUFTTk9ERV9UWVBFX1VOREVGSU5FRC5lcXVhbHMoc3RyVHlwZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJc2tpcENoaWxkcmVuID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChBU05PREVfVFlQRV9PQkpFQ1QuZXF1YWxzKHN0clR5cGUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChudWxsID09IHN0ckNsYXNzTmFtZSB8fCBBU05PREVfQ0xBU1NfQVJSQVkuZXF1YWxzKHN0ckNsYXNzTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXNraXBDaGlsZHJlbiA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoQVNOT0RFX1RZUEVfTU9WSUVDTElQLmVxdWFscyhzdHJUeXBlKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoTEVWRUwwX1JFU0VSVkVELmVxdWFscyhzdHJUYXJnZXQpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkJTEVWRUwwX0ZPQ1VTX01BTkFHRVIuZXF1YWxzKHN0clRhcmdldCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXNraXBDaGlsZHJlbiA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5hY2NJbmZvID0gQVNBY2NJbmZvLmNyZWF0ZShhc09iamVjdCk7Ci0KLQkJaW5pdEljb25UeXBlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRJY29uVHlwZSgpIHsKLQkJaWYgKEFTTk9ERV9UWVBFX01PVklFQ0xJUC5lcXVhbHMoc3RyVHlwZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3RySWNvblR5cGUgPSBzdHJUeXBlOwotCQkJaWYgKGFjY0luZm8gIT0gbnVsbCkgewotCQkJCWludCBhY2NSb2xlID0gYWNjSW5mby5nZXRSb2xlKCk7Ci0JCQkJaWYgKC0xICE9IGFjY1JvbGUpIHsKLQkJCQkJc3RySWNvblR5cGUgPSBBU05PREVfSUNPTl9BQ0NST0xFICsgYWNjUm9sZTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWlmIChoYXNPblJlbGVhc2UoKSkgewotCQkJCXN0ckljb25UeXBlID0gQVNOT0RFX0NMQVNTX0JVVFRPTjsKLQkJCX0KLQkJfSBlbHNlIGlmIChBU05PREVfVFlQRV9PQkpFQ1QuZXF1YWxzKHN0clR5cGUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXN0ckljb25UeXBlID0gc3RyVHlwZTsKLQkJCWlmIChBU05PREVfQ0xBU1NfQlVUVE9OLmVxdWFscyhzdHJDbGFzc05hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdHJJY29uVHlwZSA9IEFTTk9ERV9DTEFTU19CVVRUT047Ci0JCQl9IGVsc2UgaWYgKHN0ckNsYXNzTmFtZS5zdGFydHNXaXRoKEFTTk9ERV9DTEFTU19URVhURklFTEQpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdHJJY29uVHlwZSA9IEFTTk9ERV9JQ09OX1RFWFQ7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChBQ0NfSU1QTC5lcXVhbHMoc3RyT2JqZWN0TmFtZSkgfHwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQUNDX1BST1BTLmVxdWFscyhzdHJPYmplY3ROYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXN0ckljb25UeXBlID0gQVNOT0RFX0lDT05fQUNDUFJPUFM7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKEFTTk9ERV9UWVBFX0ZVTkNUSU9OLmVxdWFscyhzdHJUeXBlKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJQVNOT0RFX1RZUEVfU1RSSU5HLmVxdWFscyhzdHJUeXBlKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzdHJJY29uVHlwZSA9IHN0clR5cGU7Ci0JCX0gZWxzZSBpZiAoQVNOT0RFX1RZUEVfTlVNQkVSLmVxdWFscyhzdHJUeXBlKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJQVNOT0RFX1RZUEVfTlVMTC5lcXVhbHMoc3RyVHlwZSkgfHwgLy8kTk9OLU5MUy0xJAotCQkJCUFTTk9ERV9UWVBFX0JPT0xFQU4uZXF1YWxzKHN0clR5cGUpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQlBU05PREVfVFlQRV9VTkRFRklORUQuZXF1YWxzKHN0clR5cGUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXN0ckljb25UeXBlID0gQVNOT0RFX0lDT05fVkFSSUFCTEU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTTm9kZSNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBzdHJUeXBlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlI2dldENsYXNzTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBzdHJDbGFzc05hbWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGUjZ2V0T2JqZWN0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3ROYW1lKCkgewotCQlyZXR1cm4gc3RyT2JqZWN0TmFtZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTTm9kZSNnZXRUYXJnZXQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gc3RyVGFyZ2V0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlI2lzVUlDb21wb25lbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVUlDb21wb25lbnQoKSB7Ci0JCXJldHVybiBpc1VJQ29tcG9uZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlI2dldFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlpZiAobnVsbCAhPSBhc09iamVjdCkgewotCQkJcmV0dXJuIGRlY29kZVN0cmluZyhnZXRTdHJpbmcoQVNOT0RFX1ZBTFVFKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGUjZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZ2V0VGV4dCh0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTTm9kZSNnZXRUZXh0KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KGJvb2xlYW4gdXNlQWNjTmFtZSkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmICh1c2VBY2NOYW1lICYmIG51bGwgIT0gYWNjSW5mbykgewotCQkJdGV4dCA9IGFjY0luZm8uZ2V0TmFtZSgpOwotCQl9Ci0JCWlmIChudWxsID09IHRleHQpIHsKLQkJCWlmIChudWxsICE9IGFzT2JqZWN0KSB7Ci0JCQkJdGV4dCA9IGdldFN0cmluZyhBU05PREVfVEVYVCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0ZXh0ID0gIlsiICsgdGV4dCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIGRlY29kZVN0cmluZyh0ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTTm9kZSNnZXRUaXRsZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJaWYgKG51bGwgIT0gYXNPYmplY3QpIHsKLQkJCXJldHVybiBkZWNvZGVTdHJpbmcoZ2V0U3RyaW5nKEFTTk9ERV9USVRMRSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgbmFtZSkgewotCQlpZiAobnVsbCAhPSBhc09iamVjdCkgewotCQkJT2JqZWN0IHJlc3VsdCA9IGFzT2JqZWN0LmdldChuYW1lKTsKLQkJCXJldHVybiBudWxsID09IHJlc3VsdCA/IG51bGwgOiByZXN1bHQudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE51bWJlciBnZXROdW1iZXIoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG51bGwgIT0gYXNPYmplY3QpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBhc09iamVjdC5nZXQobmFtZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQllbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBOdW1iZXIpCi0JCQkJcmV0dXJuIChOdW1iZXIpIHJlc3VsdDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTTm9kZSNnZXRPYmplY3QoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdChTdHJpbmcgbmFtZSkgewotCQlpZiAobnVsbCAhPSBhc09iamVjdCkgewotCQkJcmV0dXJuIGFzT2JqZWN0LmdldChuYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBkZWNvZGVTdHJpbmcoU3RyaW5nIGlucHV0KSB7Ci0JCWlmIChudWxsICE9IGlucHV0KSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBVUkxEZWNvZGVyLmRlY29kZShpbnB1dCwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi0JcHJpdmF0ZSBkb3VibGUgZ2V0RG91YmxlVmFsdWUoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCXJldHVybiAoKE51bWJlcikgbykuZG91YmxlVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gRG91YmxlLk5hTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTTm9kZSNnZXRQYXJlbnQoKQotCSAqLwotCXB1YmxpYyBJQVNOb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTTm9kZSNnZXRMZXZlbCgpCi0JICovCi0JcHVibGljIGludCBnZXRMZXZlbCgpIHsKLQkJcmV0dXJuIGxldmVsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRTa2lwKCkgewotCQlyZXR1cm4gKHNraXBDaGlsZHJlbiAmJiAhaXNBY2NQcm9wZXJ0aWVzKSB8fCBpc1JlZmVyZW5jZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FjY1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBpc0FjY1Byb3BlcnRpZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGUjaGFzQ2hpbGQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZChib29sZWFuIHZpc3VhbCkgewotCQlyZXR1cm4gaGFzQ2hpbGQodmlzdWFsLCBmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGUjaGFzQ2hpbGQoYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZChib29sZWFuIHZpc3VhbCwgYm9vbGVhbiBkZWJ1Z01vZGUpIHsKLQkJaWYgKGxldmVsID49IDUwKSB7Ci0JCQl0aHJvdyBuZXcgRXJyb3IoCi0JCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJTWVzc2FnZXMKLQkJCQkJCQkJCQkJLmdldFN0cmluZygiZmxhc2guZXJyb3JfdGFyZ2V0X2xlbmd0aCIpLCBuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihsZXZlbCkgfSkgKyAiXG4iICsgc3RyVGFyZ2V0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHBsYXllci5oYXNDaGlsZCh0aGlzLCB2aXN1YWwsIGRlYnVnTW9kZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGUjZ2V0Q2hpbGRyZW4oYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSUFTTm9kZVtdIGdldENoaWxkcmVuKGJvb2xlYW4gdmlzdWFsKSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbih2aXN1YWwsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgSUFTTm9kZVtdIGdldEVudGlyZUNoaWxkcmVuKCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZmFsc2UsIHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlI2dldENoaWxkcmVuKGJvb2xlYW4sIGJvb2xlYW4sCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXByaXZhdGUgSUFTTm9kZVtdIGdldENoaWxkcmVuKGJvb2xlYW4gdmlzdWFsLCBib29sZWFuIGRlYnVnTW9kZSkgewotCQlJQVNOb2RlW10gY2hpbGRyZW4gPSBwbGF5ZXIuZ2V0Q2hpbGRyZW4odGhpcywgdmlzdWFsLCBkZWJ1Z01vZGUpOwotCQlMaXN0PEFTTm9kZUltcGxWOD4gY2hpbGRMaXN0ID0gbmV3IEFycmF5TGlzdDxBU05vZGVJbXBsVjg+KCk7Ci0JCWZvciAoSUFTTm9kZSBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBBU05vZGVJbXBsVjgpIHsKLQkJCQlBU05vZGVJbXBsVjggbm9kZSA9IChBU05vZGVJbXBsVjgpIGNoaWxkOwotCQkJCWlmICghZGVidWdNb2RlKSB7Ci0JCQkJCWlmICghdmlzdWFsICYmIG5vZGUuc2hvdWxkU2tpcCgpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQljaGlsZExpc3QuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZExpc3QudG9BcnJheShuZXcgSUFTTm9kZVtjaGlsZExpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGUjc2V0TWFya2VyKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXRNYXJrZXIoKSB7Ci0JCWlmIChudWxsICE9IGFzT2JqZWN0KSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBwbGF5ZXIuc2V0TWFya2VyKGdldE51bWJlcihBU05PREVfWCksCi0JCQkJCQlnZXROdW1iZXIoQVNOT0RFX1kpLCBnZXROdW1iZXIoQVNOT0RFX1dJRFRIKSwKLQkJCQkJCWdldE51bWJlcihBU05PREVfSEVJR0hUKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUFTTm9kZSNnZXRQbGF5ZXIoKQotCSAqLwotCXB1YmxpYyBJRmxhc2hQbGF5ZXIgZ2V0UGxheWVyKCkgewotCQlyZXR1cm4gcGxheWVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlI2dldEFjY0luZm8oKQotCSAqLwotCXB1YmxpYyBBU0FjY0luZm8gZ2V0QWNjSW5mbygpIHsKLQkJcmV0dXJuIGFjY0luZm87Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGUjZ2V0S2V5cygpCi0JICovCi0JcHVibGljIFNldDxTdHJpbmc+IGdldEtleXMoKSB7Ci0JCWlmIChudWxsICE9IGFzT2JqZWN0KSB7Ci0JCQlyZXR1cm4gYXNPYmplY3QuZ2V0S2V5cygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlI2hhc09uUmVsZWFzZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT25SZWxlYXNlKCkgewotCQlpZiAobnVsbCA9PSBoYXNPblJlbGVhc2UpIHsKLQkJCUlBU05vZGUgb25SZWxlYXNlTm9kZSA9IHBsYXllci5nZXROb2RlRnJvbVBhdGgoc3RyVGFyZ2V0Ci0JCQkJCSsgUEFUSF9PTl9SRUxFQVNFKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG51bGwgIT0gb25SZWxlYXNlTm9kZSkgewotCQkJCWhhc09uUmVsZWFzZSA9IEJvb2xlYW4uVFJVRTsKLQkJCX0gZWxzZSB7Ci0JCQkJaGFzT25SZWxlYXNlID0gQm9vbGVhbi5GQUxTRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFzT25SZWxlYXNlLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlI2dldFgoKQotCSAqLwotCXB1YmxpYyBkb3VibGUgZ2V0WCgpIHsKLQkJcmV0dXJuIGdldERvdWJsZVZhbHVlKGFzT2JqZWN0LmdldChBU05PREVfWCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlI2dldFkoKQotCSAqLwotCXB1YmxpYyBkb3VibGUgZ2V0WSgpIHsKLQkJcmV0dXJuIGdldERvdWJsZVZhbHVlKGFzT2JqZWN0LmdldChBU05PREVfWSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlI2dldFdpZHRoKCkKLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldFdpZHRoKCkgewotCQlyZXR1cm4gZ2V0RG91YmxlVmFsdWUoYXNPYmplY3QuZ2V0KEFTTk9ERV9XSURUSCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlI2dldEhlaWdodCgpCi0JICovCi0JcHVibGljIGRvdWJsZSBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBnZXREb3VibGVWYWx1ZShhc09iamVjdC5nZXQoQVNOT0RFX0hFSUdIVCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGUjZ2V0RGVwdGgoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVwdGgoKSB7Ci0JCUludGVnZXIgdGFyZ2V0ID0gKEludGVnZXIpIGFzT2JqZWN0LmdldChBU05PREVfREVQVEgpOwotCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQlyZXR1cm4gdGFyZ2V0LmludFZhbHVlKCk7Ci0JCXJldHVybiBJTlZBTElEX0RFUFRIOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlI2dldEN1cnJlbnRGcmFtZSgpCi0JICovCi0JcHVibGljIGludCBnZXRDdXJyZW50RnJhbWUoKSB7Ci0JCUludGVnZXIgdGFyZ2V0ID0gKEludGVnZXIpIGFzT2JqZWN0LmdldChBU05PREVfQ1VSUkVOVF9GUkFNRSk7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbCkKLQkJCXJldHVybiB0YXJnZXQuaW50VmFsdWUoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlI2lzSW5wdXRhYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lucHV0YWJsZSgpIHsKLQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIGFzT2JqZWN0LmdldChBU05PREVfSVNfSU5QVVRBQkxFKTsKLQkJaWYgKGIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGUjaXNPcGFxdWVPYmplY3QoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3BhcXVlT2JqZWN0KCkgewotCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgYXNPYmplY3QuZ2V0KEFTTk9ERV9JU19PUEFRVUVfT0JKRUNUKTsKLQkJaWYgKGIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLklBU05vZGUjZ2V0VGFiSW5kZXgoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFiSW5kZXgoKSB7Ci0JCU51bWJlciBudW0gPSBnZXROdW1iZXIoQVNOT0RFX1RBQl9JTkRFWCk7Ci0JCWlmIChudW0gPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bS5pbnRWYWx1ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlI2dldEljb25UeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEljb25UeXBlKCkgewotCQlyZXR1cm4gc3RySWNvblR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvRmxhc2hNb2RlbFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL0ZsYXNoTW9kZWxQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzMTJkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvRmxhc2hNb2RlbFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5icmlkZ2UuSVdhWGNvZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoLmJyaWRnZS5XYVhjb2RpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgRmxhc2hNb2RlbFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBGbGFzaE1vZGVsUGx1Z2luIHBsdWdpbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdGggaW1wb3NlZFNXRlBhdGggPSBuZXcgUGF0aCgiYnJpZGdlU1dGL2ltcG9zZWQuc3dmIik7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0aCBib290bG9hZGVyU1dGUGF0aCA9IG5ldyBQYXRoKAotCQkJImJyaWRnZVNXRi9ib290X2xvYWRlci5zd2YiKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXRoIGJyaWRnZUluaXRTV0ZQYXRoID0gbmV3IFBhdGgoCi0JCQkiYnJpZGdlU1dGL2Jvb3RfYnJpZGdlLnN3ZiIpOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEZsYXNoTW9kZWxQbHVnaW4oKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQkJSW5wdXRTdHJlYW0gaXM7Ci0JCWlzID0gdHJ5T3BlblN0cmVhbShpbXBvc2VkU1dGUGF0aCk7Ci0JCUlXYVhjb2Rpbmcgd2F4ID0gV2FYY29kaW5nRmFjdG9yeS5nZXRXYVhjb2RpbmcoKTsKLQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCXdheC5zZXRTV0ZUcmFuc2NvZGluZ0ltcG9zZWRGaWxlKGlzKTsKLQkJfQotCQlpcyA9IHRyeU9wZW5TdHJlYW0oYm9vdGxvYWRlclNXRlBhdGgpOwotCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJd2F4LnNldFNXRkJvb3Rsb2FkZXIoaXMpOwotCQl9Ci0JCWlzID0gdHJ5T3BlblN0cmVhbShicmlkZ2VJbml0U1dGUGF0aCk7Ci0JCWlmIChpcyAhPSBudWxsKSB7Ci0JCQl3YXguc2V0U1dGQnJpZGdlSW5pdChpcyk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmxhc2hNb2RlbFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gdHJ5T3BlblN0cmVhbShQYXRoIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBGaWxlTG9jYXRvci5vcGVuU3RyZWFtKGdldEJ1bmRsZSgpLCBwYXRoLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvRmxhc2hTdGF0dXNVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvRmxhc2hTdGF0dXNVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MDE3NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL0ZsYXNoU3RhdHVzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC5JQVNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guSUZsYXNoUGxheWVyOwotCi1wdWJsaWMgY2xhc3MgRmxhc2hTdGF0dXNVdGlsIHsKLQotCS8vIG1lc3NhZ2VzIGZvciBzdGF0dXMgdGV4dAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfT0sgPSBNZXNzYWdlcwotCQkJLmdldFN0cmluZygiZmxhc2gucGxheWVyX29rIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTX05HID0gTWVzc2FnZXMKLQkJCS5nZXRTdHJpbmcoImZsYXNoLnBsYXllcl9lbWJlZCIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRVU19OQSA9IE1lc3NhZ2VzCi0JCQkuZ2V0U3RyaW5nKCJmbGFzaC5wbGF5ZXJfbm9feGNvZGUiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfV0FJVCA9IE1lc3NhZ2VzCi0JCQkuZ2V0U3RyaW5nKCJmbGFzaC5wbGF5ZXJfbG9hZGluZyIpOyAvLyROT04tTkxTLTEkCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfSFRUUFMgPSBNZXNzYWdlcwotCQkJLmdldFN0cmluZygiZmxhc2gucGxheWVyX2h0dHBzIik7Ci0KLQkvLyBjb25zdGFudHMgZm9yIGNoZWNrCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVCA9ICJPQkpFQ1QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJ0YWdOYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUFMgPSAiaHR0cHM6Ly8iOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RhdHVzKElGbGFzaFBsYXllciBwbGF5ZXIpIHsKLQkJaWYgKG51bGwgPT0gcGxheWVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlBU05vZGUgcm9vdE5vZGUgPSBwbGF5ZXIuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKG51bGwgIT0gcm9vdE5vZGUpIHsKLQkJCXJldHVybiBTVEFUVVNfT0s7Ci0JCX0KLQotCQkvLyBUT0RPIGNoZWNrIHN3ZiB2ZXJzaW9uIGhlcmUKLQotCQlTdHJpbmcgdGFnTmFtZSA9IHBsYXllci5nZXRQbGF5ZXJQcm9wZXJ0eShUQUdfTkFNRSk7Ci0JCWlmICghT0JKRUNULmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkpIHsKLQkJCXJldHVybiBTVEFUVVNfTkc7Ci0JCX0KLQotCQlpZiAoIXBsYXllci5pc1JlYWR5KCkpIHsKLQkJCXJldHVybiBTVEFUVVNfV0FJVDsKLQkJfQotCi0JCWlmIChwbGF5ZXIuZ2V0Q29udGVudFVSTCgpLnN0YXJ0c1dpdGgoSFRUUFMpKSB7Ci0JCQlyZXR1cm4gU1RBVFVTX0hUVFBTOwotCQl9Ci0KLQkJcmV0dXJuIFNUQVRVU19OQTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGY1ZWQ4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJtZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuICchJyArIGtleSArICchJzsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9icmlkZ2UvV2FYY29kaW5nQ29uZmlnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvYnJpZGdlL1dhWGNvZGluZ0NvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODBmYTQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9icmlkZ2UvV2FYY29kaW5nQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLmJyaWRnZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LkhUVFBMb2NhbFNlcnZlclNXRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eS5Qcm94eVRyYW5zY29kZXJTV0Y7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eS5TV0ZCb290bG9hZGVyOwotCi1wdWJsaWMgY2xhc3MgV2FYY29kaW5nQ29uZmlnIHsKLQotCXByaXZhdGUgYm9vbGVhbiBzd2ZUcmFuc2NvZGluZ0ZsYWcgPSBmYWxzZTsKLQlwcml2YXRlIGludCBzd2ZUcmFuc2NvZGluZ01pbmltdW1WZXJzaW9uID0gMDsKLQlwcml2YXRlIGJvb2xlYW4gc3dmQm9vdGxvYWRlckZsYWcgPSB0cnVlOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0U1dGVHJhbnNjb2RpbmdGbGFnKCkgewotCQlyZXR1cm4gc3dmVHJhbnNjb2RpbmdGbGFnOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNXRlRyYW5zY29kaW5nRmxhZyhib29sZWFuIGZsYWcpIHsKLQkJdGhpcy5zd2ZUcmFuc2NvZGluZ0ZsYWcgPSBmbGFnOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNXRkJvb3Rsb2FkZXJGbGFnKGJvb2xlYW4gc3dmQm9vdGxvYWRlckZsYWcpIHsKLQkJdGhpcy5zd2ZCb290bG9hZGVyRmxhZyA9IHN3ZkJvb3Rsb2FkZXJGbGFnOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFNXRkJvb3Rsb2FkZXJGbGFnKCkgewotCQlyZXR1cm4gc3dmQm9vdGxvYWRlckZsYWc7Ci0JfQotCi0JcHVibGljIGludCBnZXRTV0ZUcmFuc2NvZGluZ01pbmltdW1WZXJzaW9uKCkgewotCQlyZXR1cm4gc3dmVHJhbnNjb2RpbmdNaW5pbXVtVmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTV0ZUcmFuc2NvZGluZ01pbmltdW1WZXJzaW9uKGludCB2ZXJzaW9uKSB7Ci0JCXRoaXMuc3dmVHJhbnNjb2RpbmdNaW5pbXVtVmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U1dGVHJhbnNjb2RpbmdJbXBvc2VkRmlsZShJbnB1dFN0cmVhbSBpcykgewotCQlQcm94eVRyYW5zY29kZXJTV0Yuc2V0U1dGVHJhbnNjb2RpbmdJbXBvc2VkRmlsZShpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U1dGQm9vdExvYWRlcihJbnB1dFN0cmVhbSBpcykgewotCQlTV0ZCb290bG9hZGVyLnNldFNXRkJvb3RMb2FkZXJGaWxlKGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTV0ZCcmlkZ2VJbml0KElucHV0U3RyZWFtIGlzKSB7Ci0JCUhUVFBMb2NhbFNlcnZlclNXRkZhY3Rvcnkuc2V0QnJpZGdlSW5pdFN3Zihpcyk7Ci0JfQotCi0JCi0JcHJpdmF0ZSBzdGF0aWMgV2FYY29kaW5nQ29uZmlnIGluc3RhbmNlID0gbmV3IFdhWGNvZGluZ0NvbmZpZygpOwotCi0JcHVibGljIHN0YXRpYyBXYVhjb2RpbmdDb25maWcgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvYnJpZGdlL1dhWGNvZGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9icmlkZ2UvV2FYY29kaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzFhY2YyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9icmlkZ2UvV2FYY29kaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLmJyaWRnZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2guYnJpZGdlLklXYVhjb2Rpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eS5IVFRQTG9jYWxTZXJ2ZXJTV0ZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHkuUHJveHlUcmFuc2NvZGVyU1dGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5LlNXRkJvb3Rsb2FkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHkuU1dGU2VjcmV0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LkV4dGVybmFsUHJveHlDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5IVFRQUHJveHlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuSUhUVFBQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LlByb3h5Q29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5Mb2dnZXI7Ci0KLXB1YmxpYyBjbGFzcyBXYVhjb2RpbmdJbXBsIGltcGxlbWVudHMgSVdhWGNvZGluZyB7Ci0JcHJpdmF0ZSBJSFRUUFByb3h5IHByb3h5OwotCXByaXZhdGUgUHJveHlDb25maWcgcHJveHlDb25maWc7Ci0JcHJpdmF0ZSBFeHRlcm5hbFByb3h5Q29uZmlnIGV4UHJveHlDb25maWc7Ci0JcHJpdmF0ZSBXYVhjb2RpbmdDb25maWcgd2F4Q29uZmlnOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxvZ0NvbmZpZyA9ICJoYW5kbGVycyA9IGphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyLCBqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlclxuIgotCQkJKyAiamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIubGV2ZWw9SU5GT1xuIgotCQkJKyAiamF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIuZm9ybWF0dGVyPWphdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlclxuIgotCQkJKyAiamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIubGV2ZWw9RklORVNUXG4iCi0JCQkrICJqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5wYXR0ZXJuPWM6L3dheGNvZGluZy5sb2dcbiIKLQkJCSsgImphdmEudXRpbC5sb2dnaW5nLkZpbGVIYW5kbGVyLmZvcm1hdHRlcj1qYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXJcbiI7Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdGFydChib29sZWFuIGluaXRMb2dnZXIpIHsKLQkJaWYgKHByb3h5ICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJaWYgKGluaXRMb2dnZXIpIHsKLQkJCWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGxvZ0NvbmZpZy5nZXRCeXRlcygpKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlMb2dnZXIuY29uZmlndXJlKGlzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXByb3h5ID0gSFRUUFByb3h5RmFjdG9yeS5uZXdQcm94eShwcm94eUNvbmZpZywgZXhQcm94eUNvbmZpZyk7Ci0JCWlmIChwcm94eSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlwcm94eS5zdGFydFRocmVhZCgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdG9wKCkgewotCQlpZiAocHJveHkgIT0gbnVsbCkgewotCQkJcHJveHkuc3RvcFRocmVhZCgpOwotCQkJcHJveHkgPSBudWxsOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VjcmV0KFN0cmluZyBpZCwgYm9vbGVhbiByZW1vdmUpIHsKLQkJcmV0dXJuIHByb3h5LmdldFNlY3JldChpZCwgcmVtb3ZlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7Ci0JCXByb3h5Q29uZmlnLnNldFBvcnQocG9ydCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQb3J0KCkgewotCQlpZiAocHJveHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHByb3h5LmdldExpc3RlblBvcnQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcm94eUNvbmZpZy5nZXRQb3J0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbFByb3h5RmxhZyhib29sZWFuIGZsYWcpIHsKLQkJZXhQcm94eUNvbmZpZy5zZXRFeHRlcm5hbFByb3h5RmxhZyhmbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbFByb3h5KFN0cmluZyBob3N0LCBpbnQgcG9ydCkgewotCQlleFByb3h5Q29uZmlnLnNldEV4dGVybmFsUHJveHkoaG9zdCwgcG9ydCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U1dGVHJhbnNjb2RpbmdGbGFnKGJvb2xlYW4gZmxhZykgewotCQl3YXhDb25maWcuc2V0U1dGVHJhbnNjb2RpbmdGbGFnKGZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNXRlRyYW5zY29kaW5nTWluaW11bVZlcnNpb24oaW50IHZlcnNpb24pIHsKLQkJd2F4Q29uZmlnLnNldFNXRlRyYW5zY29kaW5nTWluaW11bVZlcnNpb24odmVyc2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U1dGVHJhbnNjb2RpbmdJbXBvc2VkRmlsZShJbnB1dFN0cmVhbSBpcykgewotCQl3YXhDb25maWcuc2V0U1dGVHJhbnNjb2RpbmdJbXBvc2VkRmlsZShpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWF4Q29ubmVjdGlvbihpbnQgY29ubmVjdGlvbnMpIHsKLQkJcHJveHlDb25maWcuc2V0TWF4Q29ubmVjdGlvbihjb25uZWN0aW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCkgewotCQlwcm94eUNvbmZpZy5zZXRUaW1lb3V0KHRpbWVvdXQpOwotCX0KLQotCXByaXZhdGUgV2FYY29kaW5nSW1wbCgpIHsKLQkJcHJveHlDb25maWcgPSBuZXcgUHJveHlDb25maWcoKTsKLQkJZXhQcm94eUNvbmZpZyA9IG5ldyBFeHRlcm5hbFByb3h5Q29uZmlnKCk7Ci0JCXdheENvbmZpZyA9IFdhWGNvZGluZ0NvbmZpZy5nZXRJbnN0YW5jZSgpOwotCi0JCXByb3h5Q29uZmlnLnNldFByb3h5VHJhbnNjb2RlckZhY3RvcnkobmV3IFByb3h5VHJhbnNjb2RlclNXRkZhY3RvcnkoKSk7Ci0JCXByb3h5Q29uZmlnLnNldFNlc3Npb25PdmVycmlkZXJGYWN0b3J5KG5ldyBTV0ZCb290bG9hZGVyRmFjdG9yeSgpKTsKLQkJcHJveHlDb25maWcuc2V0TG9jYWxTZXJ2ZXJGYWN0b3J5KG5ldyBIVFRQTG9jYWxTZXJ2ZXJTV0ZGYWN0b3J5KCkpOwotCQlwcm94eUNvbmZpZy5zZXRTZWNyZXRNYW5hZ2VyKG5ldyBTV0ZTZWNyZXRNYW5hZ2VyKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElXYVhjb2RpbmcgaW5zdGFuY2UgPSBuZXcgV2FYY29kaW5nSW1wbCgpOwotCi0JcHVibGljIHN0YXRpYyBJV2FYY29kaW5nIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U1dGQm9vdGxvYWRlckZsYWcoYm9vbGVhbiBmbGFnKSB7Ci0JCXdheENvbmZpZy5zZXRTV0ZCb290bG9hZGVyRmxhZyhmbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTV0ZCb290bG9hZGVyKElucHV0U3RyZWFtIGlzKSB7Ci0JCXdheENvbmZpZy5zZXRTV0ZCb290TG9hZGVyKGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTV0ZCcmlkZ2VJbml0KElucHV0U3RyZWFtIGlzKSB7Ci0JCXdheENvbmZpZy5zZXRTV0ZCcmlkZ2VJbml0KGlzKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L0hUVFBMb2NhbFNlcnZlclNXRi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L0hUVFBMb2NhbFNlcnZlclNXRi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhlY2YzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9IVFRQTG9jYWxTZXJ2ZXJTV0YuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuVGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQTG9jYWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5Q29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQUHJveHlUcmFuc2NvZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSVNlY3JldE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkhUVFBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLlBhcnNlVVJJOwotCi1wdWJsaWMgY2xhc3MgSFRUUExvY2FsU2VydmVyU1dGIGltcGxlbWVudHMgSUhUVFBMb2NhbFNlcnZlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0NBTF9GSUxFX0FDQ0VTUyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhUVFBfV0VMTF9LTk9XTl9QT1JUID0gODA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIE1JTUVfVFlQRV9BUFBMSUNBVElPTl9YTUxfQSA9ICJhcHBsaWNhdGlvbi94bWwiLmdldEJ5dGVzKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihIVFRQTG9jYWxTZXJ2ZXJTV0YuY2xhc3MpOwotCi0Jc3RhdGljIHB1YmxpYyBjbGFzcyBNSU1FVHlwZSB7Ci0JCXB1YmxpYyBmaW5hbCBTdHJpbmcgc3VmZml4OwotCQlwdWJsaWMgZmluYWwgU3RyaW5nIHR5cGU7Ci0JCXB1YmxpYyBmaW5hbCBTdHJpbmcgc3VidHlwZTsKLQotCQlNSU1FVHlwZShTdHJpbmcgc3VmZml4LCBTdHJpbmcgdHlwZSwgU3RyaW5nIHN1YnR5cGUpIHsKLQkJCXRoaXMuc3VmZml4ID0gc3VmZml4OwotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMuc3VidHlwZSA9IHN1YnR5cGU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwIG1pbWVUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNSU1FVHlwZShTdHJpbmcgc3VmZml4LCBTdHJpbmcgdHlwZSwgU3RyaW5nIHN1YnR5cGUpIHsKLQkJbWltZVR5cGVNYXAucHV0KHN1ZmZpeCwgbmV3IE1JTUVUeXBlKHN1ZmZpeCwgdHlwZSwgc3VidHlwZSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTUlNRVR5cGUgZ2V0TUlNRVR5cGUoU3RyaW5nIHN1ZmZpeCkgewotCQlyZXR1cm4gKE1JTUVUeXBlKSBtaW1lVHlwZU1hcC5nZXQoc3VmZml4KTsKLQl9ICAgIAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBicmlkZ2VJbml0U3dmOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEJyaWRnZUluaXRTd2YoSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBpbnQgYjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgYiA9IGlzLnJlYWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoYiA8IDApIGJyZWFrOwotICAgICAgICAgICAgICAgIG9zLndyaXRlKGIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnJpZGdlSW5pdFN3ZiA9IG9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJSFRUUFJlc3BvbnNlTWVzc2FnZSBwcm9jZXNzQnJpZGdlSW5pdFN3ZihJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QpIHsKLSAgICAgICAgSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UgPSBIVFRQVXRpbC5jcmVhdGVIVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UocmVxdWVzdC5nZXRTZXJpYWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUhUVFBIZWFkZXIuSFRUUF9WRVJTSU9OXzFfMF9BLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwIi5nZXRCeXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT0siLmdldEJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaWRnZUluaXRTd2YpOwotICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoSUhUVFBIZWFkZXIuQ09OVEVOVF9UWVBFX0EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTV0ZVdGlsLk1JTUVfVFlQRV9BUFBMSUNBVElPTl9YX1NIT0NLV0FWRV9GTEFTSF9BKTsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBJSFRUUFJlc3BvbnNlTWVzc2FnZSBwcm9jZXNzTG9hZFZhcnNGb3JTd2YoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0LCBJU2VjcmV0TWFuYWdlciBzZWNyZXRNYW5hZ2VyKSB7Ci0gICAgICAgIElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlID0gSFRUUFV0aWwuY3JlYXRlSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKHJlcXVlc3QuZ2V0U2VyaWFsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElIVFRQSGVhZGVyLkhUVFBfVkVSU0lPTl8xXzBfQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMCIuZ2V0Qnl0ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9LIi5nZXRCeXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNyZXRNYW5hZ2VyLnJlcXVlc3RTZWNyZXQoKSk7Ci0gICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcihJSFRUUEhlYWRlci5DT05URU5UX1RZUEVfQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXRlV0aWwuTUlNRV9UWVBFX0FQUExJQ0FUSU9OX1hfV1dXX0ZPUk1fVVJMRU5DT0RFRF9BKTsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLQotICAgIHByaXZhdGUgSUhUVFBSZXNwb25zZU1lc3NhZ2UgcHJvY2Vzc1N3ZkNyb3NzRG9tYWluUG9saWN5RmlsZShJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QpIHsKLSAgICAgICAgLy9pbnQgcG9ydCA9IFN3Zk9SQkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMaXN0ZW5Qb3J0KCk7Ci0gICAgICAgIExPR0dFUi5pbmZvKCJSZXF1ZXN0IGNyb3NzZG9tYWluLnhtbCBwb2xpY3kgZmlsZS4iKTsKLSAgICAgICAgaW50IHBvcnQgPSBnZXRTd2ZPUkJQb3J0KCk7Ci0gICAgICAgIC8qCi0gICAgICAgIFN0cmluZyBjb250ZW50cyA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiPz5cbjxjcm9zcy1kb21haW4tcG9saWN5PjxhbGxvdy1hY2Nlc3MtZnJvbSBkb21haW49XCIqXCIgdG8tcG9ydHM9XCIiCi0gICAgICAgICAgICArIHBvcnQgKyAiXCIvPjwvY3Jvc3MtZG9tYWluLXBvbGljeT5cbiI7Ci0gICAgICAgICovCi0gICAgICAgIFN0cmluZyBjb250ZW50cyA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiPz5cbjxjcm9zcy1kb21haW4tcG9saWN5PjxhbGxvdy1hY2Nlc3MtZnJvbSBkb21haW49XCIqXCIvPjwvY3Jvc3MtZG9tYWluLXBvbGljeT5cbiI7Ci0gICAgICAgIElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlID0gSFRUUFV0aWwuY3JlYXRlSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKHJlcXVlc3QuZ2V0U2VyaWFsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElIVFRQSGVhZGVyLkhUVFBfVkVSU0lPTl8xXzBfQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMCIuZ2V0Qnl0ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9LIi5nZXRCeXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cy5nZXRCeXRlcygpKTsKLSAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKElIVFRQSGVhZGVyLkNPTlRFTlRfVFlQRV9BLCBNSU1FX1RZUEVfQVBQTElDQVRJT05fWE1MX0EpOwotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJSFRUUFJlc3BvbnNlTWVzc2FnZSBwcm9jZXNzTG9jYWxGaWxlKGludCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFic1BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUhUVFBQcm94eVRyYW5zY29kZXIgdHJhbnNjb2RlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWJzUGF0aCA9IFVSTERlY29kZXIuZGVjb2RlKGFic1BhdGgsICJVVEYtOCIpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIExPR0dFUi5pbmZvKCJMb2NhbCBTZXJ2ZXIgTW9kZS4gU2VuZDoiICsgYWJzUGF0aCk7Ci0KLSAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYWJzUGF0aCk7Ci0gICAgICAgIGlmICghZi5jYW5SZWFkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGxlbiA9IChpbnQpIGYubGVuZ3RoKCk7Ci0gICAgICAgIGJ5dGVbXSBjb250ZW50cyA9IG5ldyBieXRlW2xlbl07Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7Ci0gICAgICAgICAgICBpcy5yZWFkKGNvbnRlbnRzLCAwLCBsZW4pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UgPSBIVFRQVXRpbC5jcmVhdGVIVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UocmVxdWVzdC5nZXRTZXJpYWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUhUVFBIZWFkZXIuSFRUUF9WRVJTSU9OXzFfMF9BLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwIi5nZXRCeXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT0siLmdldEJ5dGVzKCksIGNvbnRlbnRzKTsKLSAgICAgICAgaW50IGRvdFBvcyA9IGFic1BhdGgubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgaWYgKGRvdFBvcyA+IDApIHsKLSAgICAgICAgICAgIGludCBzUG9zID0gYWJzUGF0aC5sYXN0SW5kZXhPZigiLyIpOwotICAgICAgICAgICAgaWYgKGRvdFBvcyA+IHNQb3MpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3VmZml4ID0gYWJzUGF0aC5zdWJzdHJpbmcoZG90UG9zICsgMSk7Ci0gICAgICAgICAgICAgICAgTUlNRVR5cGUgbXQgPSBnZXRNSU1FVHlwZShzdWZmaXgpOwotICAgICAgICAgICAgICAgIGlmIChtdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG10LnR5cGUpLmFwcGVuZCgnLycpLmFwcGVuZChtdC5zdWJ0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKElIVFRQSGVhZGVyLkNPTlRFTlRfVFlQRV9BLCBzYi50b1N0cmluZygpLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0cmFuc2NvZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3BvbnNlID0gdHJhbnNjb2Rlci50cmFuc2NvZGUoaWQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUExvY2FsU2VydmVyI3Byb2Nlc3NSZXF1ZXN0KGludCwgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5IVFRQUHJveHlDb25uZWN0aW9uLCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSFRUUFJlcXVlc3RNZXNzYWdlLCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQUHJveHlUcmFuc2NvZGVyKQotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NSZXF1ZXN0KGludCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSFRUUFByb3h5Q29ubmVjdGlvbiBmQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSFRUUFByb3h5VHJhbnNjb2RlciB0cmFuc2NvZGVyKQotICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFJSFRUUEhlYWRlci5NRVRIT0RfR0VULmVxdWFscyhyZXF1ZXN0LmdldE1ldGhvZEFzU3RyaW5nKCkpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBTdHJpbmcgdXJpU3RyID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJU3RyaW5nKCk7Ci0gICAgICAgIFN0cmluZyBhdXRob3JpdHkgPSBQYXJzZVVSSS5nZXRBdXRob3JpdHkodXJpU3RyKTsKLSAgICAgICAgU3RyaW5nIGFic1BhdGggPSBQYXJzZVVSSS5nZXRBYnNvbHV0ZVBhdGgodXJpU3RyKTsKLQotICAgICAgICBTdHJpbmcgaG9zdFN0cjsKLSAgICAgICAgU3RyaW5nIGhvc3Q7Ci0gICAgICAgIGludCBwb3J0OwotICAgICAgICBpZiAoYXV0aG9yaXR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGhvc3RTdHIgPSBhdXRob3JpdHk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJSFRUUEhlYWRlciBob3N0SGVhZGVyID0gcmVxdWVzdC5nZXRIZWFkZXIoSUhUVFBIZWFkZXIuSE9TVF9BKTsKLSAgICAgICAgICAgIGlmIChob3N0SGVhZGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaG9zdFN0ciA9IG5ldyBTdHJpbmcoaG9zdEhlYWRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBob3N0ID0gUGFyc2VVUkkucGFyc2VIb3N0KGhvc3RTdHIpOwotICAgICAgICBwb3J0ID0gUGFyc2VVUkkucGFyc2VQb3J0KGhvc3RTdHIsIEhUVFBfV0VMTF9LTk9XTl9QT1JUKTsKLQotICAgICAgICBJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSA9IG51bGw7Ci0gICAgICAgIGlmIChhYnNQYXRoLmVuZHNXaXRoKFNXRlV0aWwuQlJJREdFX0lOSVRfU1dGX0ZJTEVOQU1FKSkgewotICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm9jZXNzQnJpZGdlSW5pdFN3ZihyZXF1ZXN0KTsKLSAgICAgICAgfSBlbHNlIGlmIChhYnNQYXRoLmVuZHNXaXRoKFNXRlV0aWwuTE9BRFZBUlNfUFJPUEVSVFlfRklMRU5BTUUpKSB7Ci0gICAgICAgICAgICByZXNwb25zZSA9IHByb2Nlc3NMb2FkVmFyc0ZvclN3ZihyZXF1ZXN0LCBmQ2xpZW50LmdldFNlY3JldE1hbmFnZXIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoISgibG9jYWxob3N0Ii5lcXVhbHMoaG9zdCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmICgocG9ydCA9PSBIVFRQX1dFTExfS05PV05fUE9SVCkgJiYgKCIvY3Jvc3Nkb21haW4ueG1sIi5lcXVhbHMoYWJzUGF0aCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm9jZXNzU3dmQ3Jvc3NEb21haW5Qb2xpY3lGaWxlKHJlcXVlc3QpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChMT0NBTF9GSUxFX0FDQ0VTUykgewotICAgICAgICAgICAgICAgIGlmIChwb3J0ICE9IGZDbGllbnQuZ2V0TGlzdGVuUG9ydCgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm9jZXNzTG9jYWxGaWxlKGlkLCByZXF1ZXN0LCBhYnNQYXRoLCB0cmFuc2NvZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgSFRUUFV0aWwuc2VuZEZhaWxlZFRvQ2xpZW50KGZDbGllbnQsIHJlcXVlc3QpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZkNsaWVudC5zZW5kUmVzcG9uc2UoMCwgcmVzcG9uc2UpOwotICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPR0dFUi5mYXRhbCgiVGltZW91dCBpbiBsb2NhbCBzZXJ2ZXIgbW9kZSIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCS8vIFRPRE8hISEhCi0JcHJpdmF0ZSBpbnQgc3dmT1JCUG9ydCA9IC0xOwotCi0JcHVibGljIGludCBnZXRTd2ZPUkJQb3J0KCkgewotCQlpZiAoc3dmT1JCUG9ydCA8IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzd2ZPUkJQb3J0IGlzIG5vdCBzZXQiKTsKLQkJcmV0dXJuIHN3Zk9SQlBvcnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3dmT1JCUG9ydChpbnQgc3dmT1JCUG9ydCkgewotCQl0aGlzLnN3Zk9SQlBvcnQgPSBzd2ZPUkJQb3J0OwotCX0KLQotICAgIAotICAgIHB1YmxpYyBIVFRQTG9jYWxTZXJ2ZXJTV0YoKSB7ICAgICAgICAKLQkJYWRkTUlNRVR5cGUoImh0bWwiLCAidGV4dCIsICJodG1sIik7Ci0JCWFkZE1JTUVUeXBlKCJodG0iLCAidGV4dCIsICJodG1sIik7Ci0JCWFkZE1JTUVUeXBlKCJqcyIsICJhcHBsaWNhdGlvbiIsICJ4LWphdmFzY3JpcHQiKTsKLQkJYWRkTUlNRVR5cGUoInN3ZiIsICJhcHBsaWNhdGlvbiIsICJ4LXNob2Nrd2F2ZS1mbGFzaCIpOwotCQlhZGRNSU1FVHlwZSgiZ2lmIiwgImltYWdlIiwgImdpZiIpOwotCQlhZGRNSU1FVHlwZSgianBlZyIsICJpbWFnZSIsICJqcGVnIik7Ci0JCWFkZE1JTUVUeXBlKCJqcGciLCAiaW1hZ2UiLCAianBlZyIpOwotCQlhZGRNSU1FVHlwZSgicG5nIiwgImltYWdlIiwgInBuZyIpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L0hUVFBMb2NhbFNlcnZlclNXRkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9IVFRQTG9jYWxTZXJ2ZXJTV0ZGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZTY5NGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L0hUVFBMb2NhbFNlcnZlclNXRkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQTG9jYWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUExvY2FsU2VydmVyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEhUVFBMb2NhbFNlcnZlclNXRkZhY3RvcnkgaW1wbGVtZW50cyBJSFRUUExvY2FsU2VydmVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QnJpZGdlSW5pdFN3ZihJbnB1dFN0cmVhbSBpcyl7Ci0JCUhUVFBMb2NhbFNlcnZlclNXRi5zZXRCcmlkZ2VJbml0U3dmKGlzKTsKLQl9Ci0JCi0JcHVibGljIEhUVFBMb2NhbFNlcnZlclNXRkZhY3RvcnkoKSB7Ci0JfQotCQotCXB1YmxpYyBJSFRUUExvY2FsU2VydmVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEhUVFBMb2NhbFNlcnZlclNXRigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L1Byb3h5VHJhbnNjb2RlclNXRi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L1Byb3h5VHJhbnNjb2RlclNXRi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2RiZGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9Qcm94eVRyYW5zY29kZXJTV0YuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC50cmFuc2NvZGVyLklTd2ZUcmFuc2NvZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gudHJhbnNjb2Rlci5JU3dmVHJhbnNjb2RlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5icmlkZ2UuV2FYY29kaW5nQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklQdXNoYmFja01lc3NhZ2VCb2R5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5UaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBQcm94eVRyYW5zY29kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkhUVFBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5Mb2dnZXI7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eVRyYW5zY29kZXJTV0YgaW1wbGVtZW50cyBJSFRUUFByb3h5VHJhbnNjb2RlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUHJveHlUcmFuc2NvZGVyU1dGLmNsYXNzKTsKLQotCXByaXZhdGUgc3RhdGljIElTd2ZUcmFuc2NvZGVyRmFjdG9yeSBnZXRTd2ZUcmFuc2NvZGVyRmFjdG9yeSgpIHsKLQkJdHJ5IHsKLQkJCS8vIFRPRE86IG1heWJlIHdlIHNob3VsZCByZW5hbWUgdGhlIGZhY3RvcnkgcGFja2FnZS4KLQkJCUNsYXNzIGNsYXp6ID0gQ2xhc3MKLQkJCQkJLmZvck5hbWUoIm9yZy5lY2xpcHNlLmFjdGYudXRpbC5zd2Z0cmFuc2NvZGVyLlN3ZlRyYW5zY29kZXJGYWN0b3J5Iik7Ci0JCQlyZXR1cm4gKElTd2ZUcmFuc2NvZGVyRmFjdG9yeSkgY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3dmVHJhbnNjb2RlckZhY3Rvcnkgc3dmVHJhbnNjb2RlckZhY3RvcnkgPSBnZXRTd2ZUcmFuc2NvZGVyRmFjdG9yeSgpOwotCi0JcHJpdmF0ZSBmaW5hbCBJU3dmVHJhbnNjb2RlciBzd2ZUcmFuc2NvZGVyOwotCi0JcHJpdmF0ZSBQcm94eVRyYW5zY29kZXJTV0YoaW50IGlkKSB7Ci0JCXRoaXMuc3dmVHJhbnNjb2RlciA9IHN3ZlRyYW5zY29kZXJGYWN0b3J5Lm5ld0luc3RhbmNlKGlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFByb3h5VHJhbnNjb2RlclNXRiBuZXdJbnN0YW5jZShpbnQgaWQpIHsKLQkJaWYgKHN3ZlRyYW5zY29kZXJGYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBQcm94eVRyYW5zY29kZXJTV0YoaWQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE9iamVjdCBpbXBvc2VkU1dGOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNXRlRyYW5zY29kaW5nSW1wb3NlZEZpbGUoSW5wdXRTdHJlYW0gaXMpIHsKLQkJaWYgKHN3ZlRyYW5zY29kZXJGYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTd2ZUcmFuc2NvZGVyIHN0ID0gc3dmVHJhbnNjb2RlckZhY3RvcnkubmV3SW5zdGFuY2UoMCk7Ci0JCXRyeSB7Ci0JCQlpbXBvc2VkU1dGID0gc3QucGFyc2UoaXMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRUZW1wb3JhcnlEZXN0U1dGKEZpbGUgc3JjKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEZpbGUoc3JjLmdldEFic29sdXRlUGF0aCgpICsgIi5vdXQiKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgZ2V0VGVtcG9yYXJ5U3JjU1dGKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEZpbGUuY3JlYXRlVGVtcEZpbGUoIlNXRlRDLSIsICIuc3dmIik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVHJhbnNjb2RlVGFyZ2V0KGludCBpZCwgSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0LAotCQkJSUhUVFBSZXNwb25zZVB1c2hiYWNrTWVzc2FnZSByZXNwb25zZSkgewotCQlpZiAocmVxdWVzdC5nZXRIZWFkZXIoU1dGVXRpbC5YX0ZMQVNIX1ZFUlNJT05fQSkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFTV0ZVdGlsLmlzUG9zc2libHlTV0ZDb250ZW50VHlwZShyZXNwb25zZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVB1c2hiYWNrTWVzc2FnZUJvZHkgYm9keSA9IHJlc3BvbnNlLmdldFB1c2hiYWNrTWVzc2FnZUJvZHkoKTsKLQkJaWYgKGJvZHkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJUHVzaGJhY2tJbnB1dFN0cmVhbSBib2R5SW5wdXRTdHJlYW0gPSBib2R5Ci0JCQkJLmdldE1lc3NhZ2VCb2R5UHVzaEJhY2tJbnB1dFN0cmVhbSgpOwotCQlpbnQgdmVyc2lvbiA9IFNXRlV0aWwuaXNTV0YoYm9keUlucHV0U3RyZWFtKTsKLQkJLy8KLQkJaWYgKHZlcnNpb24gPj0gV2FYY29kaW5nQ29uZmlnLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0U1dGVHJhbnNjb2RpbmdNaW5pbXVtVmVyc2lvbigpKSB7Ci0JCQlMT0dHRVIuaW5mbygiW2lkOiIgKyBpZCArICJdIFNXVFRyYW5zY29kZXI6IFNXRiB0byBiZSB0cmFuc2NvZGVkICgiCi0JCQkJCSsgcmVxdWVzdC5nZXRPcmlnaW5hbFJlcXVlc3RVUklTdHJpbmcoKSArICIpLSBWZXJzaW9uOiIKLQkJCQkJKyB2ZXJzaW9uKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJaWYgKHZlcnNpb24gPiAwKQotCQkJCUxPR0dFUi5pbmZvKCJbaWQ6IiArIGlkCi0JCQkJCQkrICJdIFNXVFRyYW5zY29kZXI6IFNXRiBub3QgdG8gYmUgdHJhbnNjb2RlZCAoIgotCQkJCQkJKyByZXF1ZXN0LmdldE9yaWdpbmFsUmVxdWVzdFVSSVN0cmluZygpICsgIiktIFZlcnNpb246IgotCQkJCQkJKyB2ZXJzaW9uKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBvdXRwdXRGYWlsdXJlTG9nKFN0cmluZ0J1ZmZlciBidWYsIElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCwKLQkJCUZpbGUgb3V0RmlsZSwgVGhyb3dhYmxlIGUpIHsKLQkJYnVmLmFwcGVuZCgiKCIpOwotCQlidWYuYXBwZW5kKHJlcXVlc3QuZ2V0T3JpZ2luYWxSZXF1ZXN0VVJJU3RyaW5nKCkpOwotCQlidWYuYXBwZW5kKCIpXG4iKTsKLQkJYnVmLmFwcGVuZChzdGFja1RyYWNlVG9TdHJpbmcoZSkpOwotCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkgJiYgKG91dEZpbGUgIT0gbnVsbCkpIHsKLQkJCWJ1Zi5hcHBlbmQoIlRoZSBTV0YgZmlsZSBpcyBzZWN1cmVkIGluICIpOwotCQkJYnVmLmFwcGVuZChvdXRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCWJ1Zi5hcHBlbmQoIlxuIik7Ci0JCX0KLQkJTE9HR0VSLmZhdGFsKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgc2F2ZVNXRkZpbGUoRmlsZSBmLCBieXRlW10gdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCQlvcy53cml0ZSh0YXJnZXQpOwotCQkJcmV0dXJuIGY7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAob3MgIT0gbnVsbCkgewotCQkJCW9zLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgc3RhY2tUcmFjZVRvU3RyaW5nKFRocm93YWJsZSB0KSB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0ob3MpOwotICAgICAgICB0LnByaW50U3RhY2tUcmFjZShwcyk7Ci0gICAgICAgIHJldHVybiBvcy50b1N0cmluZygpOwotICAgIH0KLQotCXB1YmxpYyBJSFRUUFJlc3BvbnNlTWVzc2FnZSB0cmFuc2NvZGUoaW50IGlkLCBJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QsCi0JCQlJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSkgewotCQlpZiAoIVdhWGNvZGluZ0NvbmZpZy5nZXRJbnN0YW5jZSgpLmdldFNXRlRyYW5zY29kaW5nRmxhZygpKQotCQkJcmV0dXJuIHJlc3BvbnNlOwotCQlpZiAoaW1wb3NlZFNXRiA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3BvbnNlOwotCQlJSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlIG5ld1Jlc3BvbnNlID0gSFRUUFV0aWwuY3JlYXRlSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlKAotCQkJCXJlc3BvbnNlLCBTV0ZVdGlsLkZMQVNIX01BR0lDX05VTUJFUl9TSVpFKTsKLQotCQlpZiAoIWlzVHJhbnNjb2RlVGFyZ2V0KGlkLCByZXF1ZXN0LCBuZXdSZXNwb25zZSkpCi0JCQlyZXR1cm4gbmV3UmVzcG9uc2U7Ci0KLQkJYnl0ZVtdIHRyYW5zY29kZWQ7Ci0JCUZpbGUgc3JjU1dGRmlsZSA9IG51bGw7Ci0JCUZpbGUgZGVzdFNXRkZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJc3JjU1dGRmlsZSA9IGdldFRlbXBvcmFyeVNyY1NXRigpOwotCQkJYnl0ZVtdIHRhcmdldEJ5dGVzOwotCQkJdHJ5IHsKLQkJCQl0YXJnZXRCeXRlcyA9IG5ld1Jlc3BvbnNlLnJlYWRCb2R5KDAsIGZhbHNlKTsKLQkJCX0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgewotCQkJCUxPR0dFUi5mYXRhbCgiW2lkOiIgKyBpZAotCQkJCQkJKyAiXSBNZXNzYWdlIGJvZHkgY2Fubm90IGJlIHJlYWQgYnkgdGltZW91dC4iKTsKLQkJCQkvLyBUaGlzIHNob3VsZCBiZSBpbnRlZ3JhdGVkIHdpdGggc2VuZEdhdGV3YXlUaW1lb3V0Li4uCi0JCQkJcmV0dXJuIEhUVFBVdGlsLmNyZWF0ZUhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZShyZXF1ZXN0LmdldFNlcmlhbCgpLAotCQkJCQkJSUhUVFBIZWFkZXIuSFRUUF9WRVJTSU9OXzFfMF9BLCAiNTA0Ii5nZXRCeXRlcygpLAotCQkJCQkJIkdhdGV3YXkgVGltZW91dCIuZ2V0Qnl0ZXMoKSwKLQkJCQkJCUlIVFRQUmVzcG9uc2VNZXNzYWdlLkVNUFRZX0JPRFkpOwotCQkJfQotCQkJaWYgKHRhcmdldEJ5dGVzID09IG51bGwpCi0JCQkJcmV0dXJuIHJlc3BvbnNlOwotCi0JCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQlzYXZlU1dGRmlsZShzcmNTV0ZGaWxlLCB0YXJnZXRCeXRlcyk7Ci0JCQl9Ci0JCQlPYmplY3Qgc3JjU3dmID0gc3dmVHJhbnNjb2Rlci5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0JCQkJCXRhcmdldEJ5dGVzKSk7Ci0JCQlPYmplY3QgZGVzdFN3ZiA9IHN3ZlRyYW5zY29kZXIuaW1wb3NlKGltcG9zZWRTV0YsIHNyY1N3Zik7Ci0JCQl0cmFuc2NvZGVkID0gc3dmVHJhbnNjb2Rlci5nZW5lcmF0ZShkZXN0U3dmLCBmYWxzZSwgOCk7Ci0KLQkJCWRlc3RTV0ZGaWxlID0gZ2V0VGVtcG9yYXJ5RGVzdFNXRihzcmNTV0ZGaWxlKTsKLQkJCWlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJCXNhdmVTV0ZGaWxlKGRlc3RTV0ZGaWxlLCB0cmFuc2NvZGVkKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiByZXNwb25zZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJTV0YgdHJhbnNjb2RpbmcgZmFpbGVkICIpOwotCQkJb3V0cHV0RmFpbHVyZUxvZyhidWYsIHJlcXVlc3QsIHNyY1NXRkZpbGUsIGUpOwotCQkJcmV0dXJuIHJlc3BvbnNlOwotCQl9Ci0KLQkJSUhUVFBSZXNwb25zZU1lc3NhZ2UgbXNnID0gSFRUUFV0aWwuY3JlYXRlSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKAotCQkJCXJlc3BvbnNlLCB0cmFuc2NvZGVkKTsKLQkJcmV0dXJuIG1zZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvUHJveHlUcmFuc2NvZGVyU1dGRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L1Byb3h5VHJhbnNjb2RlclNXRkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhZTk4Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvUHJveHlUcmFuc2NvZGVyU1dGRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5VHJhbnNjb2RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQUHJveHlUcmFuc2NvZGVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgUHJveHlUcmFuc2NvZGVyU1dGRmFjdG9yeSBpbXBsZW1lbnRzIElIVFRQUHJveHlUcmFuc2NvZGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgUHJveHlUcmFuc2NvZGVyU1dGRmFjdG9yeSgpIHsKLQl9Ci0JCi0JcHVibGljIElIVFRQUHJveHlUcmFuc2NvZGVyIG5ld0luc3RhbmNlKGludCBpZCkgewotCQlyZXR1cm4gUHJveHlUcmFuc2NvZGVyU1dGLm5ld0luc3RhbmNlKGlkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9TV0ZCb290bG9hZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvU1dGQm9vdGxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjgwNmQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9TV0ZCb290bG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2guYnJpZGdlLldhWGNvZGluZ0NvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JUHVzaGJhY2tNZXNzYWdlQm9keTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuVGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklDbGllbnRTdGF0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFNlc3Npb25PdmVycmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkNhY2hlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5IVFRQVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5QYXJzZVVSSTsKLQotcHVibGljIGNsYXNzIFNXRkJvb3Rsb2FkZXIgaW1wbGVtZW50cyBJSFRUUFNlc3Npb25PdmVycmlkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNXRkJvb3Rsb2FkZXIuY2xhc3MpOwotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGJvb3RMb2FkZXJTV0Y7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVwbGFjZWRGbGFnOwotCXByaXZhdGUgYm9vbGVhbiBib290bG9hZGVyUmVxdWVzdGluZ0ZsYWc7Ci0KLQlwcml2YXRlIElIVFRQUmVxdWVzdE1lc3NhZ2Ugc2Vzc2lvblJlcXVlc3Q7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBTZXNzaW9uT3ZlcnJpZGVyI2dldFNlc3Npb25SZXF1ZXN0KCkKLQkgKi8KLQlwdWJsaWMgSUhUVFBSZXF1ZXN0TWVzc2FnZSBnZXRTZXNzaW9uUmVxdWVzdCgpIHsKLQkJcmV0dXJuIHNlc3Npb25SZXF1ZXN0OwotCX0KLQotCXByaXZhdGUgSUhUVFBSZXNwb25zZU1lc3NhZ2Ugc2Vzc2lvblJlc3BvbnNlOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQU2Vzc2lvbk92ZXJyaWRlciNnZXRTZXNzaW9uUmVzcG9uc2UoKQotCSAqLwotCXB1YmxpYyBJSFRUUFJlc3BvbnNlTWVzc2FnZSBnZXRTZXNzaW9uUmVzcG9uc2UoKSB7Ci0JCXJldHVybiBzZXNzaW9uUmVzcG9uc2U7Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBpbnQgaWQ7Ci0KLQlwdWJsaWMgU1dGQm9vdGxvYWRlcihpbnQgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTV0ZCb290TG9hZGVyRmlsZShJbnB1dFN0cmVhbSBpcykgewotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJaW50IGI7Ci0JCQl0cnkgewotCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCWIgPSBpcy5yZWFkKCk7Ci0JCQkJCWlmIChiIDwgMCkKLQkJCQkJCWJyZWFrOwotCQkJCQlvcy53cml0ZShiKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJYm9vdExvYWRlclNXRiA9IG9zLnRvQnl0ZUFycmF5KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2FjaGVkU2xvdCB7Ci0JCXB1YmxpYyBmaW5hbCBTdHJpbmcgdXJpOwotCQlwdWJsaWMgSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0OwotCQlwdWJsaWMgSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2U7Ci0KLQkJQ2FjaGVkU2xvdChTdHJpbmcgdXJpKSB7Ci0JCQl0aGlzLnVyaSA9IHVyaTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ2FjaGVkU2xvdCBzZXNzaW9uQ2FjaGVkU2xvdDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVGRVJFUl9MRU5HVEggPSAxMjg7Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRDYWNoZWRPYmplY3QoSUNsaWVudFN0YXRlTWFuYWdlciBjc20sIFN0cmluZyB1cmkpIHsKLQkJQ2FjaGVNYXAgbWFwID0gKENhY2hlTWFwKSBjc20uZ2V0KFNXRkJvb3Rsb2FkZXIuY2xhc3MpOwotCQlpZiAobWFwID09IG51bGwpIHsKLQkJCW1hcCA9IG5ldyBDYWNoZU1hcCgxMjgsIDIwKTsKLQkJCWNzbS5wdXQoU1dGQm9vdGxvYWRlci5jbGFzcywgbWFwKTsKLQkJfQotCQlpZiAodXJpLmxlbmd0aCgpID4gTUFYX1JFRkVSRVJfTEVOR1RIKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKG1hcCkgewotCQkJCXJldHVybiBtYXAubWF0Y2hTdGFydHNXaXRoKHVyaSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzeW5jaHJvbml6ZWQgKG1hcCkgewotCQkJCXJldHVybiBtYXAuZ2V0KHVyaSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVPYmplY3QoSUNsaWVudFN0YXRlTWFuYWdlciBjc20sIFN0cmluZyB1cmksIE9iamVjdCBjb2JqKSB7Ci0JCU1hcCBtYXAgPSAoTWFwKSBjc20uZ2V0KFNXRkJvb3Rsb2FkZXIuY2xhc3MpOwotCQlpZiAobWFwID09IG51bGwpIHsKLQkJCW1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQljc20ucHV0KFNXRkJvb3Rsb2FkZXIuY2xhc3MsIG1hcCk7Ci0JCX0KLQkJc3luY2hyb25pemVkIChtYXApIHsKLQkJCW1hcC5wdXQodXJpLCBjb2JqKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIElIVFRQUmVzcG9uc2VNZXNzYWdlIGJvb3Rsb2FkZXJSZXNwb25zZU1lc3NhZ2UoCi0JCQlJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QpIHsKLQkJSUhUVFBSZXNwb25zZU1lc3NhZ2UgbXNnID0gSFRUUFV0aWwuY3JlYXRlSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKAotCQkJCXJlcXVlc3QuZ2V0U2VyaWFsKCksIElIVFRQSGVhZGVyLkhUVFBfVkVSU0lPTl8xXzBfQSwgIjIwMCIKLQkJCQkJCS5nZXRCeXRlcygpLCAiT0siLmdldEJ5dGVzKCksIGJvb3RMb2FkZXJTV0YpOwotCQltc2cKLQkJCQkuc2V0SGVhZGVyKElIVFRQSGVhZGVyLkNBQ0hFX0NPTlRST0xfQSwgIm11c3QtcmV2YWxpZGF0ZSIKLQkJCQkJCS5nZXRCeXRlcygpKTsKLQkJbXNnLnNldEhlYWRlcihJSFRUUEhlYWRlci5DT05URU5UX1RZUEVfQSwKLQkJCQlTV0ZVdGlsLk1JTUVfVFlQRV9BUFBMSUNBVElPTl9YX1NIT0NLV0FWRV9GTEFTSF9BKTsKLQkJcmV0dXJuIG1zZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBTZXNzaW9uT3ZlcnJpZGVyI3JlcGxhY2VSZXF1ZXN0KG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuQ2xpZW50U3RhdGVNYW5hZ2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLkhUVFBSZXF1ZXN0TWVzc2FnZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXBsYWNlUmVxdWVzdChJQ2xpZW50U3RhdGVNYW5hZ2VyIGNzbSwKLQkJCUlIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmVwbGFjZWRGbGFnID0gZmFsc2U7Ci0JCWlmICghV2FYY29kaW5nQ29uZmlnLmdldEluc3RhbmNlKCkuZ2V0U1dGQm9vdGxvYWRlckZsYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHJlcXVlc3QuZ2V0SGVhZGVyKFNXRlV0aWwuWF9GTEFTSF9WRVJTSU9OX0EpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHVyaVN0ciA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSVN0cmluZygpOwotCQlTdHJpbmcgbWV0aG9kID0gcmVxdWVzdC5nZXRNZXRob2RBc1N0cmluZygpOwotCQlPYmplY3QgY29iaiA9IGdldENhY2hlZE9iamVjdChjc20sIHVyaVN0cik7Ci0JCWlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIm1ldGhvZDoiKTsKLQkJCWJ1Zi5hcHBlbmQobWV0aG9kKTsKLQkJCWJ1Zi5hcHBlbmQoJyAnKTsKLQkJCWJ1Zi5hcHBlbmQodXJpU3RyKTsKLQkJCUxpc3Q8SUhUVFBIZWFkZXI+IGwgPSByZXF1ZXN0LmdldEhlYWRlcnMoKTsKLQkJCUl0ZXJhdG9yPElIVFRQSGVhZGVyPiBpdCA9IGwuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJSFRUUEhlYWRlciBoID0gKElIVFRQSGVhZGVyKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCFoLmlzUmVtb3ZlZCgpKSB7Ci0JCQkJCWJ1Zi5hcHBlbmQoaC50b1N0cmluZygpKTsKLQkJCQkJYnVmLmFwcGVuZCgnXG4nKTsKLQkJCQl9Ci0JCQl9Ci0JCQlERUJVRyhidWYudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAoSUhUVFBIZWFkZXIuTUVUSE9EX1BPU1QuZXF1YWxzKG1ldGhvZCkpIHsKLQkJCWlmIChjb2JqIGluc3RhbmNlb2YgQ2FjaGVkU2xvdCkgewotCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQl0cnkgewotCQkJCQlyZXF1ZXN0LndyaXRlKDAsIG9iKTsKLQkJCQl9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCQkJCURFQlVHKCJCb290bG9hZGVyJ3MgUE9TVCBjb21tYW5kOiIKLQkJCQkJCQkrIG5ldyBTdHJpbmcob2IudG9CeXRlQXJyYXkoKSkpOwotCQkJCX0KLQkJCQlJTkZPKCJib290bG9hZGVyIHJlcXVlc3RzIHRoZSBvcmlnaW5hbCBTV0Y6IiArIHVyaVN0cik7Ci0JCQkJdGhpcy5yZXBsYWNlZEZsYWcgPSB0cnVlOwotCQkJCXRoaXMuYm9vdGxvYWRlclJlcXVlc3RpbmdGbGFnID0gdHJ1ZTsKLQkJCQl0aGlzLnNlc3Npb25DYWNoZWRTbG90ID0gKENhY2hlZFNsb3QpIGNvYmo7Ci0JCQkJdGhpcy5zZXNzaW9uUmVxdWVzdCA9IHNlc3Npb25DYWNoZWRTbG90LnJlcXVlc3Q7Ci0JCQkJdGhpcy5zZXNzaW9uUmVxdWVzdAotCQkJCQkJLnJlbW92ZUhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLmdldEJ5dGVzKCkpOwotCQkJCXRoaXMuc2Vzc2lvblJlc3BvbnNlID0gc2Vzc2lvbkNhY2hlZFNsb3QucmVzcG9uc2U7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlJSFRUUEhlYWRlciByZWZlcmVyID0gcmVxdWVzdC5nZXRIZWFkZXIoSUhUVFBIZWFkZXIuUkVGRVJFUl9BKTsKLQkJaWYgKHJlZmVyZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIHJlZlN0ckJhc2U7Ci0JCQlTdHJpbmcgdXJpU3RyQmFzZTsKLQotCQkJaWYgKGZhbHNlKSB7Ci0JCQkJcmVmU3RyQmFzZSA9IFBhcnNlVVJJLmVsaW1pbmF0ZVF1ZXJ5KG5ldyBTdHJpbmcocmVmZXJlcgotCQkJCQkJLmdldFZhbHVlKCkpLnRyaW0oKSk7Ci0JCQkJdXJpU3RyQmFzZSA9IFBhcnNlVVJJLmVsaW1pbmF0ZVF1ZXJ5KHVyaVN0cik7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJSOiAiICsgcmVmU3RyQmFzZSk7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJVOiAiICsgdXJpU3RyQmFzZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlZlN0ckJhc2UgPSBuZXcgU3RyaW5nKHJlZmVyZXIuZ2V0VmFsdWUoKSkudHJpbSgpOwotCQkJCXVyaVN0ckJhc2UgPSB1cmlTdHI7Ci0JCQl9Ci0KLQkJCU9iamVjdCBvID0gZ2V0Q2FjaGVkT2JqZWN0KGNzbSwgcmVmU3RyQmFzZSk7Ci0JCQlpZiAobyAhPSBudWxsKSB7Ci0JCQkJSU5GTyh1cmlTdHJCYXNlICsgIiBzZWVtcyB0byBiZSByZWZlcnJlZCBieSAiICsgcmVmU3RyQmFzZSk7Ci0JCQkJaWYgKGNvYmogPT0gbnVsbCkgewotCQkJCQljYWNoZU9iamVjdChjc20sIHVyaVN0ckJhc2UsIEJvb2xlYW4udmFsdWVPZih0cnVlKSk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIHNlbmQgYm9vdGxvYWRlciBzd2YKLQotCQlDYWNoZWRTbG90IGNzOwotCQlpZiAoY29iaiBpbnN0YW5jZW9mIENhY2hlZFNsb3QpIHsKLQkJCWNzID0gKENhY2hlZFNsb3QpIGNvYmo7Ci0JCX0gZWxzZSB7Ci0JCQljcyA9IG5ldyBDYWNoZWRTbG90KHVyaVN0cik7Ci0JCQlpZiAoZmFsc2UpIHsKLQkJCQljYWNoZU9iamVjdChjc20sIFBhcnNlVVJJLmVsaW1pbmF0ZVF1ZXJ5KHVyaVN0ciksIGNzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FjaGVPYmplY3QoY3NtLCB1cmlTdHIsIGNzKTsKLQkJCX0KLQkJfQotCQljcy5yZXF1ZXN0ID0gcmVxdWVzdDsKLQkJLyoKLQkJICogSU5GTygiYm9vdGxvYWRlciBpcyB1c2VkIGZvciAiICsgdXJpU3RyKTsgSFRUUFJlc3BvbnNlTWVzc2FnZSBtc2cgPQotCQkgKiBib290bG9hZGVyUmVzcG9uc2VNZXNzYWdlKHJlcXVlc3QpOyB0aGlzLnNlc3Npb25SZXNwb25zZSA9IG1zZzsKLQkJICovCi0JCXRoaXMucmVwbGFjZWRGbGFnID0gdHJ1ZTsKLQkJdGhpcy5ib290bG9hZGVyUmVxdWVzdGluZ0ZsYWcgPSBmYWxzZTsKLQkJdGhpcy5zZXNzaW9uQ2FjaGVkU2xvdCA9IGNzOwotCQl0aGlzLnNlc3Npb25SZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdGhpcy5zZXNzaW9uUmVxdWVzdC5yZW1vdmVIZWFkZXIoSUhUVFBIZWFkZXIuSUZfTU9ESUZJRURfU0lOQ0VfQSk7Ci0JCXRoaXMuc2Vzc2lvblJlcXVlc3QucmVtb3ZlSGVhZGVyKElIVFRQSGVhZGVyLkFDQ0VQVF9FTkNPRElOR19BKTsKLQkJdGhpcy5zZXNzaW9uUmVzcG9uc2UgPSBudWxsOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBTZXNzaW9uT3ZlcnJpZGVyI3JlcGxhY2VSZXNwb25zZShvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LkNsaWVudFN0YXRlTWFuYWdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5IVFRQUmVxdWVzdE1lc3NhZ2UsCi0JICogICAgICBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSFRUUFJlc3BvbnNlTWVzc2FnZSwgaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlcGxhY2VSZXNwb25zZShJQ2xpZW50U3RhdGVNYW5hZ2VyIGNzbSwKLQkJCUlIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCwgSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UsCi0JCQlpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLQkJaWYgKCFyZXBsYWNlZEZsYWcpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGJvb3Rsb2FkZXJSZXF1ZXN0aW5nRmxhZykgewotCQkJaWYgKHJlc3BvbnNlICE9IHNlc3Npb25DYWNoZWRTbG90LnJlc3BvbnNlKSB7Ci0JCQkJcmVzcG9uc2Uuc2V0SGVhZGVyKElIVFRQSGVhZGVyLkNBQ0hFX0NPTlRST0xfQSwgIm5vLWNhY2hlIgotCQkJCQkJLmdldEJ5dGVzKCkpOwotCQkJfQotCQkJdGhpcy5zZXNzaW9uUmVzcG9uc2UgPSByZXNwb25zZTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJaWYgKCFTV0ZVdGlsLmlzUG9zc2libHlTV0ZDb250ZW50VHlwZShyZXNwb25zZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJSUhUVFBSZXNwb25zZVB1c2hiYWNrTWVzc2FnZSBuZXdSZXNwb25zZSA9IEhUVFBVdGlsCi0JCQkJCS5jcmVhdGVIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2UocmVzcG9uc2UsCi0JCQkJCQkJU1dGVXRpbC5GTEFTSF9NQUdJQ19OVU1CRVJfU0laRSk7Ci0KLQkJCUlQdXNoYmFja01lc3NhZ2VCb2R5IGJvZHkgPSBuZXdSZXNwb25zZS5nZXRQdXNoYmFja01lc3NhZ2VCb2R5KCk7Ci0JCQlpZiAoYm9keSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCVB1c2hiYWNrSW5wdXRTdHJlYW0gYm9keUlucHV0U3RyZWFtID0gYm9keQotCQkJCQkuZ2V0TWVzc2FnZUJvZHlQdXNoQmFja0lucHV0U3RyZWFtKCk7Ci0JCQlpbnQgdmVyc2lvbiA9IFNXRlV0aWwuaXNTV0YoYm9keUlucHV0U3RyZWFtKTsKLQkJCUlORk8oIlRoZSBpbmNvbWluZyBTV0YgaXMgdmVyc2lvbiAiICsgdmVyc2lvbik7Ci0JCQlTdHJpbmcgdXJpU3RyID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJU3RyaW5nKCk7Ci0JCQlpZiAoKHZlcnNpb24gPj0gV2FYY29kaW5nQ29uZmlnLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldFNXRlRyYW5zY29kaW5nTWluaW11bVZlcnNpb24oKSkKLQkJCQkJLy8gRmxhc2ggVmVyc2lvbiA5IG9yIGxhdGVyIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgotCQkJCQkmJiAodmVyc2lvbiA8IDkpKSB7Ci0JCQkJSU5GTygiYm9vdGxvYWRlciBpcyB1c2VkIGZvciAiICsgdXJpU3RyKTsKLQkJCQlJSFRUUFJlc3BvbnNlTWVzc2FnZSBtc2cgPSBib290bG9hZGVyUmVzcG9uc2VNZXNzYWdlKHJlcXVlc3QpOwotCQkJCXRoaXMuc2Vzc2lvblJlc3BvbnNlID0gbXNnOwotCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQluZXdSZXNwb25zZS53cml0ZUJvZHkodGltZW91dCwgYm9keSwgb3MpOwotCQkJCUlIVFRQUmVzcG9uc2VNZXNzYWdlIGNhY2hlZFJlc3BvbnNlID0gSFRUUFV0aWwKLQkJCQkJCS5jcmVhdGVIVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UocmVzcG9uc2UsIG9zCi0JCQkJCQkJCS50b0J5dGVBcnJheSgpKTsKLQkJCQljYWNoZWRSZXNwb25zZS5zZXRIZWFkZXIoSUhUVFBIZWFkZXIuQ0FDSEVfQ09OVFJPTF9BLAotCQkJCQkJIm5vLWNhY2hlLG11c3QtcmV2YWxpZGF0ZSIuZ2V0Qnl0ZXMoKSk7Ci0JCQkJY2FjaGVkUmVzcG9uc2Uuc2V0SGVhZGVyKElIVFRQSGVhZGVyLlBSQUdNQV9BLCAibm8tY2FjaGUiCi0JCQkJCQkuZ2V0Qnl0ZXMoKSk7Ci0JCQkJY2FjaGVkUmVzcG9uc2UKLQkJCQkJCS5zZXRIZWFkZXIoSUhUVFBIZWFkZXIuRVhQSVJFU19BLCAiLTEiLmdldEJ5dGVzKCkpOwotCi0JCQkJSU5GTygiVGhlIG9yaWdpbmFsIHJlc3BvbnNlIGlzIGNhY2hlZCBmb3IgbGF0ZXIgdXNlLiIpOwotCQkJCWlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiQ2FjaGVkTWVzc2FnZTogIik7Ci0JCQkJCUxpc3Q8SUhUVFBIZWFkZXI+IGwgPSBjYWNoZWRSZXNwb25zZS5nZXRIZWFkZXJzKCk7Ci0JCQkJCUl0ZXJhdG9yPElIVFRQSGVhZGVyPiBpdCA9IGwuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQkJSUhUVFBIZWFkZXIgaCA9IChJSFRUUEhlYWRlcikgaXQubmV4dCgpOwotCQkJCQkJaWYgKCFoLmlzUmVtb3ZlZCgpKSB7Ci0JCQkJCQkJYnVmLmFwcGVuZChoLnRvU3RyaW5nKCkpOwotCQkJCQkJCWJ1Zi5hcHBlbmQoJ1xuJyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJREVCVUcoYnVmLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQlzZXNzaW9uQ2FjaGVkU2xvdC5yZXNwb25zZSA9IGNhY2hlZFJlc3BvbnNlOwotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlJTkZPKCJEdWUgdG8gdGhlIHVuc3VwcG9ydGVkIHZlcnNpb24sIHRoZSBib290bG9hZGVyIGlzIG5vdCBhcHBsaWVkIHRvICIKLQkJCQkJCSsgdXJpU3RyKTsKLQkJCQl0aGlzLnNlc3Npb25SZXNwb25zZSA9IG5ld1Jlc3BvbnNlOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoIltpZDoiKS5hcHBlbmQoaWQpLmFwcGVuZCgiXSBTV0ZCb290bG9hZGVyIik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgZmluYWwgdm9pZCBJTkZPKFN0cmluZyBtc2cpIHsKLQkJLy8gU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyBzYi5hcHBlbmQodGhpcy50b1N0cmluZygpKS5hcHBlbmQoIjogIikuYXBwZW5kKG1zZyk7Ci0JCS8vIExPR0dFUi5pbmZvKHNiLnRvU3RyaW5nKCkpOwotCQlMT0dHRVIuaW5mbyhtc2cpOwotCX0KLQotCXByaXZhdGUgZmluYWwgdm9pZCBERUJVRyhTdHJpbmcgbXNnKSB7Ci0JCS8vIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy8gc2IuYXBwZW5kKHRoaXMudG9TdHJpbmcoKSkuYXBwZW5kKCI6ICIpLmFwcGVuZChtc2cpOwotCQkvLyBMT0dHRVIuZGVidWcoc2IudG9TdHJpbmcoKSk7Ci0JCUxPR0dFUi5kZWJ1Zyhtc2cpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L1NXRkJvb3Rsb2FkZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvU1dGQm9vdGxvYWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3OTNiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvU1dGQm9vdGxvYWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC5mbGFzaC5wcm94eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBTZXNzaW9uT3ZlcnJpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFNXRkJvb3Rsb2FkZXJGYWN0b3J5IGltcGxlbWVudHMgSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgU1dGQm9vdGxvYWRlckZhY3RvcnkoKSB7Ci0JfQotCQotCXB1YmxpYyBJSFRUUFNlc3Npb25PdmVycmlkZXIgbmV3SW5zdGFuY2UoaW50IGlkKSB7Ci0JCXJldHVybiBuZXcgU1dGQm9vdGxvYWRlcihpZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvU1dGU2VjcmV0TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmZsYXNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL2ZsYXNoL3Byb3h5L1NXRlNlY3JldE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5ZTMzZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvU1dGU2VjcmV0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLmZsYXNoLnByb3h5OwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSVNlY3JldE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkNhY2hlTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBTV0ZTZWNyZXRNYW5hZ2VyIGltcGxlbWVudHMgSVNlY3JldE1hbmFnZXIgewotICAgIHByaXZhdGUgTWFwIHNlY3JldHMgPSBuZXcgQ2FjaGVNYXAoMjU2LCAyMCk7Ci0gICAgcHJpdmF0ZSBTZWN1cmVSYW5kb20gcmFuZG9tOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUNSRVRfTEVOR1RIID0gMjA7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklTZWNyZXRNYW5hZ2VyI2dldFNlY3JldChqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldFNlY3JldChTdHJpbmcgaWQsIGJvb2xlYW4gcmVtb3ZlKSB7Ci0gICAgICAgIFN0cmluZyBzZWNyZXQgPSAoU3RyaW5nKSBzZWNyZXRzLmdldChpZCk7Ci0gICAgICAgIGlmIChyZW1vdmUgJiYgKHNlY3JldCAhPSBudWxsKSkgewotICAgICAgICAgICAgc2VjcmV0cy5yZW1vdmUoaWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZWNyZXQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JU2VjcmV0TWFuYWdlciNyZXF1ZXN0U2VjcmV0KCkKLQkgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIHJlcXVlc3RTZWNyZXQoKSB7Ci0gICAgICAgIGJ5dGVbXSBzZWNyZXRCeXRlcyA9IG5ldyBieXRlW1NFQ1JFVF9MRU5HVEggKiAyXTsKLSAgICAgICAgcmFuZG9tLm5leHRCeXRlcyhzZWNyZXRCeXRlcyk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJjb250ZW50aWQ9Iik7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFNFQ1JFVF9MRU5HVEg7IGkrKykgewotICAgICAgICAgICAgYnl0ZSBiID0gc2VjcmV0Qnl0ZXNbaV07Ci0gICAgICAgICAgICBidWYyLmFwcGVuZChiICUgMTAwKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgaWQgPSBidWYyLnRvU3RyaW5nKCk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoYnVmMik7Ci0gICAgICAgIGJ1ZjIuc2V0TGVuZ3RoKDApOwotICAgICAgICBidWYuYXBwZW5kKCImc2VjcmV0PSIpOwotICAgICAgICBmb3IgKDsgaSA8IFNFQ1JFVF9MRU5HVEggKiAyOyBpKyspIHsKLSAgICAgICAgICAgIGJ5dGUgYiA9IHNlY3JldEJ5dGVzW2ldOwotICAgICAgICAgICAgYnVmMi5hcHBlbmQoYiAlIDEwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmLmFwcGVuZChidWYyKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiJmVuZD10ZXJtIik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoJ1xyJyk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgIFN0cmluZyBzZWNyZXQgPSBidWYyLnRvU3RyaW5nKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgc2VjcmV0cy5wdXQoaWQsIHNlY3JldCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpLmdldEJ5dGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNXRlNlY3JldE1hbmFnZXIoKSB7Ci0gICAgICAgIHRoaXMucmFuZG9tID0gbmV3IFNlY3VyZVJhbmRvbSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9TV0ZVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwuZmxhc2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvZmxhc2gvcHJveHkvU1dGVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhhZjYwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5mbGFzaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC9mbGFzaC9wcm94eS9TV0ZVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwuZmxhc2gucHJveHk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBTV0ZVdGlsIHsKLQkvLyBwcml2YXRlIGZpbmFsIGJ5dGVbXSBDVF9TSE9DS1dBVkVfRkxBU0ggPQotCS8vICJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIuZ2V0Qnl0ZXMoKTsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlW10gQ1RfSU1BR0UgPSAiaW1hZ2UiLmdldEJ5dGVzKCk7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgYnl0ZVtdIENUX1ZJREVPID0gInZpZGVvIi5nZXRCeXRlcygpOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBieXRlW10gWF9GTEFTSF9WRVJTSU9OX0EgPSAieC1mbGFzaC12ZXJzaW9uIi5nZXRCeXRlcygpOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgYnl0ZVtdIE1JTUVfVFlQRV9BUFBMSUNBVElPTl9YX1NIT0NLV0FWRV9GTEFTSF9BID0gImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIgotCQkJLmdldEJ5dGVzKCk7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBieXRlW10gTUlNRV9UWVBFX0FQUExJQ0FUSU9OX1hfV1dXX0ZPUk1fVVJMRU5DT0RFRF9BID0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLQkJCS5nZXRCeXRlcygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJREdFX0lOSVRfU1dGX0ZJTEVOQU1FID0gIkVjbGlwc2UtQUNURi1TV0YtSW5pdGlhbGl6ZS1CcmlkZ2UtUGFja2FnZS0xMDgyMDE3MzA5MTMwMTg3NDcyLnN3ZiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRFZBUlNfUFJPUEVSVFlfRklMRU5BTUUgPSAiRWNsaXBzZS1BQ1RGLVNXRi1Mb2FkVmFycy0xMDgyMDE3MzA5MTMwMTg3NDcyLnR4dCI7Ci0KLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBGTEFTSF9NQUdJQ19OVU1CRVJfU0laRSA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250ZW50VHlwZUVxdWFsKGJ5dGVbXSBjdCwgYnl0ZVtdIHR5cGUpIHsKLQkJaWYgKGN0Lmxlbmd0aCA8IHR5cGUubGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IHR5cGUubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjdFtpXSAhPSB0eXBlW2ldKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoKGN0W2ldID09ICcvJykgfHwgKGN0Lmxlbmd0aCA9PSB0eXBlLmxlbmd0aCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Bvc3NpYmx5U1dGQ29udGVudFR5cGUoSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UpIHsKLQkJSUhUVFBIZWFkZXIgY29udGVudFR5cGVIID0gcmVzcG9uc2UKLQkJCQkuZ2V0SGVhZGVyKElIVFRQSGVhZGVyLkNPTlRFTlRfVFlQRV9BKTsKLQkJaWYgKGNvbnRlbnRUeXBlSCAhPSBudWxsKSB7Ci0JCQlieXRlW10gY3QgPSBjb250ZW50VHlwZUguZ2V0VmFsdWUoKTsKLQkJCWlmIChpc0NvbnRlbnRUeXBlRXF1YWwoY3QsIENUX0lNQUdFKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoaXNDb250ZW50VHlwZUVxdWFsKGN0LCBDVF9WSURFTykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXN0YXRpYyBwdWJsaWMgaW50IGlzU1dGKFB1c2hiYWNrSW5wdXRTdHJlYW0gcGJpcykgewotCQl0cnkgewotCQkJYnl0ZVtdIG1hZ2ljTnVtYmVyID0gbmV3IGJ5dGVbRkxBU0hfTUFHSUNfTlVNQkVSX1NJWkVdOwotCQkJaW50IHJldHVyblZhbHVlID0gLTE7Ci0JCQlpbnQgc2l6ZSA9IHBiaXMucmVhZChtYWdpY051bWJlcik7Ci0JCQlpZiAoc2l6ZSA8IEZMQVNIX01BR0lDX05VTUJFUl9TSVpFKSB7Ci0JCQkJaWYgKHNpemUgPiAwKSB7Ci0JCQkJCXBiaXMudW5yZWFkKG1hZ2ljTnVtYmVyLCAwLCBzaXplKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaWYgKCgobWFnaWNOdW1iZXJbMF0gPT0gJ0MnKSB8fCAobWFnaWNOdW1iZXJbMF0gPT0gJ0YnKSkKLQkJCQkJJiYgKG1hZ2ljTnVtYmVyWzFdID09ICdXJykgJiYgKG1hZ2ljTnVtYmVyWzJdID09ICdTJykpIHsKLQkJCQlyZXR1cm5WYWx1ZSA9IG1hZ2ljTnVtYmVyWzNdOwotCQkJfQotCQkJcGJpcy51bnJlYWQobWFnaWNOdW1iZXIpOwotCQkJcmV0dXJuIHJldHVyblZhbHVlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYTQxNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhOGRhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVjbGlwc2UgQUNURiBXZWIgQnJvd3NlciBJRSBQbHVnLWluIChJbmN1YmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLkJyb3dzZXJJRV9QbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuYWN0Zi5jb3JlLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWksCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uZG9tYnljb20sCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbCwKLSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIsCi0gb3JnLmVjbGlwc2UuYWN0Zi51aSwKLSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxZGJjZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4MDAzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0JCQkgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbl9qYS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL2ljb25zL2JsXzI0XzAyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL2ljb25zL2JsXzI0XzAyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5OTJjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9pY29ucy9ibF8yNF8wMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTMyYjlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYnJvd3Nlci5pZS50aXRsZT1XZWIgQnJvd3NlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYzk0NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5XZWJCcm93c2VyRWRpdG9yIgotICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLldlYkJyb3dzZXJFZGl0b3JDb250cmlidXRvciIKLSAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJodG1sLCBodG0sIHhodG1sLCBtaHQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9ibF8yNF8wMi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLldlYkJyb3dzZXJFZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIlYnJvd3Nlci5pZS50aXRsZSIvPgotICAgICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvcGx1Z2luX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMzJiOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvcGx1Z2luX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1icm93c2VyLmllLnRpdGxlPVdlYiBCcm93c2VyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL0Jyb3dzZXJJRV9QbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvQnJvd3NlcklFX1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmIyZjVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvQnJvd3NlcklFX1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnVpLnV0aWwuQWJzdHJhY3RVSVBsdWdpbkFDVEY7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBCcm93c2VySUVfUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbkFDVEYgewotCi0gICAgLy8gVGhlIHBsdWctaW4gSUQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllIjsKLQotICAgIC8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBCcm93c2VySUVfUGx1Z2luIHBsdWdpbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQnJvd3NlcklFX1BsdWdpbigpIHsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCcm93c2VySUVfUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL0N1cnJlbnRTdHlsZXNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL0N1cnJlbnRTdHlsZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlN2UyNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9DdXJyZW50U3R5bGVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5kb21ieWNvbS5JRWxlbWVudEV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5icm93c2VyLklDdXJyZW50U3R5bGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC54cGF0aC5YUGF0aENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLQotcHVibGljIGNsYXNzIEN1cnJlbnRTdHlsZXNJbXBsIGltcGxlbWVudHMgSUN1cnJlbnRTdHlsZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFfVklTSUJJTElUWSA9ICJ2aXNpYmlsaXR5IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBX1RFWFRfREVDT1JBVElPTiA9ICJ0ZXh0RGVjb3JhdGlvbiI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQV9URVhUX0FMSUdOID0gInRleHRBbGlnbiI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQV9QT1NJVElPTiA9ICJwb3NpdGlvbiI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQV9MSU5FX0hFSUdIVCA9ICJsaW5lSGVpZ2h0IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBX0xFVFRFUl9TUEFDSU5HID0gImxldHRlclNwYWNpbmciOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFfRk9OVF9WQVJJQU5UID0gImZvbnRWYXJpYW50IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBX0ZPTlRfU1RZTEUgPSAiZm9udFN0eWxlIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBX0ZPTlRfU0laRSA9ICJmb250U2l6ZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQV9GT05UX0ZBTUlMWSA9ICJmb250RmFtaWx5IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBX0RJU1BMQVkgPSAiZGlzcGxheSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQV9DT0xPUiA9ICJjb2xvciI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQV9CQUNLR1JPVU5EX1JFUEVBVCA9ICJiYWNrZ3JvdW5kUmVwZWF0IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBX0JBQ0tHUk9VTkRfQ09MT1IgPSAiYmFja2dyb3VuZENvbG9yIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIUkVGID0gImhyZWYiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BID0gIkEiOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgeHBhdGg7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyB0YWdOYW1lOwotCi0JcHJpdmF0ZSBmaW5hbCBSZWN0YW5nbGUgcmVjdDsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGJhY2tncm91bmRDb2xvcjsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGJhY2tncm91bmRSZXBlYXQ7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBjb2xvcjsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZvbnRGYW1pbHk7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmb250U2l6ZTsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZvbnRTdHlsZTsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGZvbnRWYXJpYW50OwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGluZUhlaWdodDsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHRleHRBbGlnbjsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHZpc2liaWxpdHk7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkaXNwbGF5OwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcG9zaXRpb247Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyB0ZXh0RGVjb3JhdGlvbjsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxldHRlclNwYWNpbmc7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMaW5rOwotCi0JcHJpdmF0ZSBVUkwgdGFyZ2V0ID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDdXJyZW50U3R5bGVzSW1wbChJRWxlbWVudEV4IGVsZW1lbnQsIFVSTCBiYXNlVXJsKSB7Ci0JCXJlY3QgPSBlbGVtZW50LmdldExvY2F0aW9uKCk7Ci0JCXhwYXRoID0gWFBhdGhDcmVhdG9yLmNoaWxkUGF0aFNlcXVlbmNlKGVsZW1lbnQpOwotCQl0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0KLQkJaXNMaW5rID0gZmFsc2U7Ci0JCWlmIChUQUdfQS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpKSB7Ci0JCQlTdHJpbmcgaHJlZiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEhSRUYpOwotCQkJaWYgKG51bGwgIT0gaHJlZikgewotCQkJCWlmIChudWxsICE9IGJhc2VVcmwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXRhcmdldCA9IG5ldyBVUkwoYmFzZVVybCwgaHJlZik7Ci0JCQkJCQlpc0xpbmsgPSB0cnVlOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdGFyZ2V0ID0gbmV3IFVSTChocmVmKTsKLQkJCQkJCQlpc0xpbmsgPSB0cnVlOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7Ci0JCQkJCQkJLy8gZTIucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl0cnkgewotCQkJCQkJdGFyZ2V0ID0gbmV3IFVSTChocmVmKTsKLQkJCQkJCWlzTGluayA9IHRydWU7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotCQkJCQkJLy9lMi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlTdHlsZSBzdHlsZSA9IGVsZW1lbnQuZ2V0U3R5bGUoKTsKLQkJYmFja2dyb3VuZENvbG9yID0gKFN0cmluZykgc3R5bGUuZ2V0KEFfQkFDS0dST1VORF9DT0xPUik7Ci0JCWJhY2tncm91bmRSZXBlYXQgPSAoU3RyaW5nKSBzdHlsZS5nZXQoQV9CQUNLR1JPVU5EX1JFUEVBVCk7Ci0JCWNvbG9yID0gKFN0cmluZykgc3R5bGUuZ2V0KEFfQ09MT1IpOwotCQlkaXNwbGF5ID0gKFN0cmluZykgc3R5bGUuZ2V0KEFfRElTUExBWSk7Ci0JCWZvbnRGYW1pbHkgPSAoU3RyaW5nKSBzdHlsZS5nZXQoQV9GT05UX0ZBTUlMWSk7Ci0JCWZvbnRTaXplID0gKFN0cmluZykgc3R5bGUuZ2V0KEFfRk9OVF9TSVpFKTsKLQkJZm9udFN0eWxlID0gKFN0cmluZykgc3R5bGUuZ2V0KEFfRk9OVF9TVFlMRSk7Ci0JCWZvbnRWYXJpYW50ID0gKFN0cmluZykgc3R5bGUuZ2V0KEFfRk9OVF9WQVJJQU5UKTsKLQkJbGV0dGVyU3BhY2luZyA9IChTdHJpbmcpIHN0eWxlLmdldChBX0xFVFRFUl9TUEFDSU5HKTsKLQkJbGluZUhlaWdodCA9IChTdHJpbmcpIHN0eWxlLmdldChBX0xJTkVfSEVJR0hUKTsKLQkJcG9zaXRpb24gPSAoU3RyaW5nKSBzdHlsZS5nZXQoQV9QT1NJVElPTik7Ci0JCXRleHRBbGlnbiA9IChTdHJpbmcpIHN0eWxlLmdldChBX1RFWFRfQUxJR04pOwotCQl0ZXh0RGVjb3JhdGlvbiA9IChTdHJpbmcpIHN0eWxlLmdldChBX1RFWFRfREVDT1JBVElPTik7Ci0JCXZpc2liaWxpdHkgPSAoU3RyaW5nKSBzdHlsZS5nZXQoQV9WSVNJQklMSVRZKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0QmFja2dyb3VuZENvbG9yKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmRDb2xvcigpIHsKLQkJcmV0dXJuIGJhY2tncm91bmRDb2xvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0QmFja2dyb3VuZFJlcGVhdCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kUmVwZWF0KCkgewotCQlyZXR1cm4gYmFja2dyb3VuZFJlcGVhdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0Q29sb3IoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKSB7Ci0JCXJldHVybiBjb2xvcjsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5JQ3VycmVudFN0eWxlcyNnZXRDc3NUZXh0KCkKLQkvLyAqLwotCS8vIHB1YmxpYyBTdHJpbmcgZ2V0Q3NzVGV4dCgpIHsKLQkvLyByZXR1cm4gY3NzVGV4dDsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0RGlzcGxheSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5KCkgewotCQlyZXR1cm4gZGlzcGxheTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0Rm9udEZhbWlseSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250RmFtaWx5KCkgewotCQlyZXR1cm4gZm9udEZhbWlseTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0Rm9udFNpemUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFNpemUoKSB7Ci0JCXJldHVybiBmb250U2l6ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0Rm9udFN0eWxlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRTdHlsZSgpIHsKLQkJcmV0dXJuIGZvbnRTdHlsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0Rm9udFZhcmlhbnQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFZhcmlhbnQoKSB7Ci0JCXJldHVybiBmb250VmFyaWFudDsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5JQ3VycmVudFN0eWxlcyNnZXRGb250V2VpZ2h0KCkKLQkvLyAqLwotCS8vIHB1YmxpYyBTdHJpbmcgZ2V0Rm9udFdlaWdodCgpIHsKLQkvLyByZXR1cm4gZm9udFdlaWdodDsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0TGV0dGVyU3BhY2luZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZXR0ZXJTcGFjaW5nKCkgewotCQlyZXR1cm4gbGV0dGVyU3BhY2luZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0TGluZUhlaWdodCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaW5lSGVpZ2h0KCkgewotCQlyZXR1cm4gbGluZUhlaWdodDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0UG9zaXRpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBwb3NpdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0VGV4dEFsaWduKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRBbGlnbigpIHsKLQkJcmV0dXJuIHRleHRBbGlnbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0VGV4dERlY29yYXRpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dERlY29yYXRpb24oKSB7Ci0JCXJldHVybiB0ZXh0RGVjb3JhdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0VmlzaWJpbGl0eSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWaXNpYmlsaXR5KCkgewotCQlyZXR1cm4gdmlzaWJpbGl0eTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0VGFnTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWdOYW1lKCkgewotCQlyZXR1cm4gdGFnTmFtZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0WFBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WFBhdGgoKSB7Ci0JCXJldHVybiB4cGF0aDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjZ2V0UmVjdGFuZ2xlKCkKLQkgKi8KLQlwdWJsaWMgUmVjdGFuZ2xlIGdldFJlY3RhbmdsZSgpIHsKLQkJcmV0dXJuIHJlY3Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5icm93c2VyLklDdXJyZW50U3R5bGVzI2dldExpbmtVUkwoKQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0TGlua1VSTCgpIHsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSUN1cnJlbnRTdHlsZXMjaXNMaW5rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xpbmsoKSB7Ci0JCXJldHVybiBpc0xpbms7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL1dlYkJyb3dzZXJFZGl0b3JDb250cmlidXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9XZWJCcm93c2VyRWRpdG9yQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0NThjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL1dlYkJyb3dzZXJFZGl0b3JDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5hY3Rpb25zLkRpc2FibGVEZWJ1Z01lc3NhZ2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYWN0aW9ucy5Hb0JhY2tBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYWN0aW9ucy5Hb0ZvcndhcmRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYWN0aW9ucy5SZWZyZXNoQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmFjdGlvbnMuU3RvcEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5hY3Rpb25zLlRleHRTaXplTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnVpLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgV2ViQnJvd3NlckVkaXRvckNvbnRyaWJ1dG9yIGV4dGVuZHMgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0gICAgcHJpdmF0ZSBEaXNhYmxlRGVidWdNZXNzYWdlQWN0aW9uIHNpbGVudEFjdGlvbjsKLQotICAgIHByaXZhdGUgRGlzYWJsZURlYnVnTWVzc2FnZUFjdGlvbiBzaWxlbnRBY3Rpb24yOwotCi0gICAgcHVibGljIFdlYkJyb3dzZXJFZGl0b3JDb250cmlidXRvcigpIHsKLSAgICAgICAgc2lsZW50QWN0aW9uID0gbmV3IERpc2FibGVEZWJ1Z01lc3NhZ2VBY3Rpb24oKTsKLSAgICAgICAgc2lsZW50QWN0aW9uMiA9IG5ldyBEaXNhYmxlRGVidWdNZXNzYWdlQWN0aW9uKGZhbHNlKTsKLSAgICAgICAgc2lsZW50QWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoc2lsZW50QWN0aW9uMik7Ci0gICAgICAgIHNpbGVudEFjdGlvbjIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihzaWxlbnRBY3Rpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgICAgICBzdXBlci5pbml0KGJhcnMsIHBhZ2UpOwotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4ocGFnZSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Db29sQmFyKElDb29sQmFyTWFuYWdlciBjb29sQmFyTWFuYWdlcikgewotICAgICAgICAvLyBub3Qgc3luYyB3aXRoIEVkaXRvciBzaG93L2hpZGUuLi4KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0gICAgICAgIC8vIFRPRE8gdXNlIHRoaXMgdG8gZ2V0IElXZWJCcm93c2VyIGZvciBBY3Rpb25zLiBkb24ndCBkZXBlbmQgb24gTWVkaWF0b3IKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0gICAgICAgIC8vIHRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoIk5hdmlnYXRlIikpOwotICAgICAgICB0b29sQmFyTWFuYWdlci5hZGQobmV3IEdvQmFja0FjdGlvbigpKTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBHb0ZvcndhcmRBY3Rpb24oKSk7Ci0gICAgICAgIHRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgUmVmcmVzaEFjdGlvbigpKTsKLSAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTdG9wQWN0aW9uKCkpOwotICAgICAgICBpZiAoUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSkgewotICAgICAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKHNpbGVudEFjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotICAgICAgICAvLyBUT0RPIGNvbnNpZGVyIGFpQnJvd3NlcgotICAgICAgICAvLyBtZW51TWFuYWdlci5hZGQobmV3Ci0gICAgICAgIC8vIEZhdm9yaXRlc01lbnUoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSkpOwotICAgICAgICAvLyBEaXNwbGF5IFRPRE8gb25seSBmb3IgQnJvd3NlcgotICAgICAgICAvLyBUT0RPCi0gICAgICAgIE1lbnVNYW5hZ2VyIGRpc3BsYXlNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKE1lc3NhZ2VzLmdldFN0cmluZygiTWVudUNvbnN0LiZEaXNwbGF5XzEiKSwKLSAgICAgICAgICAgICAgICAiZGlzcGxheU1lbnUiKTsKLSAgICAgICAgZGlzcGxheU1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoIm5hdmlnYXRlIikpOwotICAgICAgICBkaXNwbGF5TWVudS5hZGQobmV3IEdvQmFja0FjdGlvbihmYWxzZSkpOwotICAgICAgICBkaXNwbGF5TWVudS5hZGQobmV3IEdvRm9yd2FyZEFjdGlvbihmYWxzZSkpOwotICAgICAgICBkaXNwbGF5TWVudS5hZGQobmV3IFJlZnJlc2hBY3Rpb24oZmFsc2UpKTsKLSAgICAgICAgZGlzcGxheU1lbnUuYWRkKG5ldyBTdG9wQWN0aW9uKGZhbHNlKSk7Ci0gICAgICAgIGlmIChQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpKSB7Ci0gICAgICAgICAgICBkaXNwbGF5TWVudS5hZGQoc2lsZW50QWN0aW9uMik7Ci0gICAgICAgIH0KLQotICAgICAgICBkaXNwbGF5TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgZGlzcGxheU1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoInZpZXciKSk7Ci0gICAgICAgIGRpc3BsYXlNZW51LmFkZChuZXcgVGV4dFNpemVNZW51KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkpKTsKLSAgICAgICAgbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0ZJTEUsIGRpc3BsYXlNZW51KTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9XZWJCcm93c2VySUVDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvV2ViQnJvd3NlcklFQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMjQ5NDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9XZWJCcm93c2VySUVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLkJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5Ccm93c2VyRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLkRvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuTmF2aWdhdGVFcnJvclBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5OZXdXaW5kb3cyUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLlByb2dyZXNzQ2hhbmdlUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLlN0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuVGl0bGVDaGFuZ2VQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuV2luZG93Q2xvc2luZ1BhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5pbXBsLkJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnNJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuaW1wbC5Eb2N1bWVudENvbXBsZXRlUGFyYW1ldGVyc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5pbXBsLk5hdmlnYXRlQ29tcGxldGUyUGFyYW1ldGVyc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5pbXBsLk5hdmlnYXRlRXJyb3JQYXJhbWV0ZXJzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLmltcGwuTmV3V2luZG93MlBhcmFtZXRlcnNJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuaW1wbC5Qcm9ncmVzc0NoYW5nZVBhcmFtZXRlcnNJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuaW1wbC5TdGF0dXNUZXh0Q2hhbmdlUGFyYW1ldGVyc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5pbXBsLlRpdGxlQ2hhbmdlUGFyYW1ldGVyc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5pbXBsLldpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUud2luMzIuSVBlcnNpc3RGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuSW1hZ2VQb3NpdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5DYWxsYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkNPTTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLklEaXNwYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9MRTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUF1dG9tYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVDb250cm9sU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLlZhcmlhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgV2ViQnJvd3NlcklFQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9CWSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfVE8gPSAxOwotCQotCU9sZUZyYW1lIGZyYW1lOwotCi0JT2xlQ29udHJvbFNpdGUgc2l0ZTsvLyAsIHNpdGUyOwotCi0JT2xlQXV0b21hdGlvbiBhdXRvOy8vICwgYXV0bzI7Ci0KLQlib29sZWFuIGRpc3Bvc2luZyA9IGZhbHNlOwotCi0JYm9vbGVhbiBiRGlzYWJsZVNjcmlwdERlYnVnZ2VyID0gZmFsc2U7Ci0KLQlwcml2YXRlIEJyb3dzZXJFdmVudExpc3RlbmVyW10gZXZlbnRMaXN0ZW5lcnMgPSBuZXcgQnJvd3NlckV2ZW50TGlzdGVuZXJbMF07Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEJST1dTRVJfUFJPR0lEID0gIlNoZWxsLkV4cGxvcmVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBpbnQgb2xkUHJvYyA9IDA7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDbG9zZWQgPSBmYWxzZTsKLQotCS8vIEV2ZW50IElEcwotCS8vIFRPRE8gaW4gY2FwaXRhbAotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFdmVudElEX0JFRk9SRU5BVklHQVRFID0gMTAwLAotCQkJRXZlbnRJRF9OQVZJR0FURUNPTVBMRVRFID0gMTAxLCBFdmVudElEX1NUQVRVU1RFWFRDSEFOR0UgPSAxMDIsCi0JCQlFdmVudElEX1FVSVQgPSAxMDMsIEV2ZW50SURfRE9XTkxPQURDT01QTEVURSA9IDEwNCwKLQkJCUV2ZW50SURfQ09NTUFORFNUQVRFQ0hBTkdFID0gMTA1LCBFdmVudElEX0RPV05MT0FEQkVHSU4gPSAxMDYsCi0JCQlFdmVudElEX05FV1dJTkRPVyA9IDEwNywgRXZlbnRJRF9QUk9HUkVTU0NIQU5HRSA9IDEwOCwKLQkJCUV2ZW50SURfV0lORE9XTU9WRSA9IDEwOSwgRXZlbnRJRF9XSU5ET1dSRVNJWkUgPSAxMTAsCi0JCQlFdmVudElEX1dJTkRPV0FDVElWQVRFID0gMTExLCBFdmVudElEX1BST1BFUlRZQ0hBTkdFID0gMTEyLAotCQkJRXZlbnRJRF9USVRMRUNIQU5HRSA9IDExMywgRXZlbnRJRF9USVRMRUlDT05DSEFOR0UgPSAxMTQsCi0JCQlFdmVudElEX0ZSQU1FQkVGT1JFTkFWSUdBVEUgPSAyMDAsCi0JCQlFdmVudElEX0ZSQU1FTkFWSUdBVEVDT01QTEVURSA9IDIwMSwgRXZlbnRJRF9GUkFNRU5FV1dJTkRPVyA9IDIwNCwKLQkJCUV2ZW50SURfQkVGT1JFTkFWSUdBVEUyID0gMjUwLCBFdmVudElEX05FV1dJTkRPVzIgPSAyNTEsCi0JCQlFdmVudElEX05BVklHQVRFQ09NUExFVEUyID0gMjUyLCBFdmVudElEX09OUVVJVCA9IDI1MywKLQkJCUV2ZW50SURfT05WSVNJQkxFID0gMjU0LCBFdmVudElEX09OVE9PTEJBUiA9IDI1NSwKLQkJCUV2ZW50SURfT05NRU5VQkFSID0gMjU2LCBFdmVudElEX09OU1RBVFVTQkFSID0gMjU3LAotCQkJRXZlbnRJRF9PTkZVTExTQ1JFRU4gPSAyNTgsIEV2ZW50SURfRE9DVU1FTlRDT01QTEVURSA9IDI1OSwKLQkJCUV2ZW50SURfT05USEVBVEVSTU9ERSA9IDI2MCwgRXZlbnRJRF9PTkFERFJFU1NCQVIgPSAyNjEsCi0JCQlFdmVudElEX1dJTkRPV1NFVFJFU0laQUJMRSA9IDI2MiwgRXZlbnRJRF9XSU5ET1dDTE9TSU5HID0gMjYzLAotCQkJRXZlbnRJRF9XSU5ET1dTRVRMRUZUID0gMjY0LCBFdmVudElEX1dJTkRPV1NFVFRPUCA9IDI2NSwKLQkJCUV2ZW50SURfV0lORE9XU0VUV0lEVEggPSAyNjYsIEV2ZW50SURfV0lORE9XU0VUSEVJR0hUID0gMjY3LAotCQkJRXZlbnRJRF9DTElFTlRUT0hPU1RXSU5ET1cgPSAyNjgsIEV2ZW50SURfU0VUU0VDVVJFTE9DS0lDT04gPSAyNjksCi0JCQlFdmVudElEX0ZJTEVET1dOTE9BRCA9IDI3MCwgRXZlbnRJRF9OQVZJR0FURUVSUk9SID0gMjcxLAotCQkJRXZlbnRJRF9QUklWQUNZSU1QQUNURURTVEFURUNIQU5HRSA9IDI3MiwgRXZlbnRJRF9ORVdXSU5ET1czID0gMjczOwotCi0JcHVibGljIFdlYkJyb3dzZXJJRUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCS8qCi0JCSAqIENyZWF0ZSBPTEUgZnJhbWUKLQkJICovCi0JCXRyeSB7Ci0JCQlmcmFtZSA9IG5ldyBPbGVGcmFtZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCQlmcmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCXNpdGUgPSBuZXcgV2ViQnJvd3NlcklFQ29udHJvbFNpdGUoZnJhbWUsIFNXVC5OT05FLCBCUk9XU0VSX1BST0dJRCk7Ci0JCQlzaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfSU5QTEFDRUFDVElWQVRFKTsKLQkJCWF1dG8gPSBuZXcgT2xlQXV0b21hdGlvbihzaXRlKTsKLQotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJZGlzcG9zZSgpOwotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9OT19IQU5ETEVTKTsKLQkJfQotCi0JCS8qCi0JCSAqIE1pc2Mgc2V0dGluZ3MKLQkJICovCi0JCXNldEJyb3dzZXJCb29sZWFuKCJSZWdpc3RlckFzRHJvcFRhcmdldCIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkJLyoKLQkJICogQWRkIFNXVCBFdmVudCBoYW5kbGVycwotCQkgKi8KLQkJTGlzdGVuZXIgc3d0TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQljYXNlIFNXVC5EaXNwb3NlOiB7Ci0JCQkJCWlmICghZGlzcG9zaW5nKSB7Ci0JCQkJCQlkaXNwb3NpbmcgPSB0cnVlOwotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKGUudHlwZSwgZSk7Ci0JCQkJCQllLnR5cGUgPSBTV1QuTk9ORTsKLQkJCQkJCWlmIChhdXRvICE9IG51bGwpIHsKLQkJCQkJCQlhdXRvLmRpc3Bvc2UoKTsKLQkJCQkJCQlhdXRvID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBTV1QuUmVzaXplOiB7Ci0JCQkJCWZyYW1lLnNldEJvdW5kcyhnZXRDbGllbnRBcmVhKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRMaXN0ZW5lcihTV1QuRGlzcG9zZSwgc3d0TGlzdGVuZXIpOwotCQlhZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBzd3RMaXN0ZW5lcik7Ci0KLQkJTGlzdGVuZXIga2V5TGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJc3dpdGNoIChlLnR5cGUpIHsKLQkJCQljYXNlIFNXVC5LZXlEb3duOgotCQkJCWNhc2UgU1dULktleVVwOiB7Ci0JCQkJCW5vdGlmeUxpc3RlbmVycyhlLnR5cGUsIGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlzaXRlLmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCBrZXlMaXN0ZW5lcik7Ci0JCXNpdGUuYWRkTGlzdGVuZXIoU1dULktleVVwLCBrZXlMaXN0ZW5lcik7Ci0KLQkJLyoKLQkJICogQWRkIE9MRSBFdmVudCBoYW5kbGVycwotCQkgKi8KLQkJT2xlTGlzdGVuZXIgYnJvd3Nlckxpc3RlbmVyID0gbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAobnVsbCAhPSBhdXRvKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQkJCWNhc2UgRXZlbnRJRF9CRUZPUkVOQVZJR0FURTI6Ci0JCQkJCQkJb25CZWZvcmVOYXZpZ2F0ZTIobmV3IEJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnNJbXBsKAotCQkJCQkJCQkJZXZlbnQpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgRXZlbnRJRF9OQVZJR0FURUNPTVBMRVRFMjoKLQkJCQkJCQlvbk5hdmlnYXRlQ29tcGxldGUyKG5ldyBOYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnNJbXBsKAotCQkJCQkJCQkJZXZlbnQpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgRXZlbnRJRF9OQVZJR0FURUVSUk9SOgotCQkJCQkJCW9uTmF2aWdhdGVFcnJvcihuZXcgTmF2aWdhdGVFcnJvclBhcmFtZXRlcnNJbXBsKAotCQkJCQkJCQkJZXZlbnQpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgRXZlbnRJRF9ET0NVTUVOVENPTVBMRVRFOgotCQkJCQkJCW9uRG9jdW1lbnRDb21wbGV0ZShuZXcgRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnNJbXBsKAotCQkJCQkJCQkJZXZlbnQpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgRXZlbnRJRF9ORVdXSU5ET1cyOgotCQkJCQkJCW9uTmV3V2luZG93MihuZXcgTmV3V2luZG93MlBhcmFtZXRlcnNJbXBsKGV2ZW50KSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIEV2ZW50SURfV0lORE9XQ0xPU0lORzoKLQkJCQkJCQlvbldpbmRvd0Nsb3NpbmcobmV3IFdpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzSW1wbCgKLQkJCQkJCQkJCWV2ZW50KSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIEV2ZW50SURfU1RBVFVTVEVYVENIQU5HRToKLQkJCQkJCQlvblN0YXR1c1RleHRDaGFuZ2UobmV3IFN0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzSW1wbCgKLQkJCQkJCQkJCWV2ZW50KSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIEV2ZW50SURfVElUTEVDSEFOR0U6Ci0JCQkJCQkJb25UaXRsZUNoYW5nZShuZXcgVGl0bGVDaGFuZ2VQYXJhbWV0ZXJzSW1wbChldmVudCkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBFdmVudElEX1BST0dSRVNTQ0hBTkdFOgotCQkJCQkJCW9uUHJvZ3Jlc3NDaGFuZ2UobmV3IFByb2dyZXNzQ2hhbmdlUGFyYW1ldGVyc0ltcGwoCi0JCQkJCQkJCQlldmVudCkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiZXZlbnQudHlwZT0iICsgZXZlbnQudHlwZSArICIgLGV2ZW50LmFyZ3VtZW50cz0iICsgZHVtcEFyYWdzKGV2ZW50LmFyZ3VtZW50cykpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbihkdW1wQXJhZ3MoZXZlbnQuYXJndW1lbnRzKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJc2l0ZS5hZGRFdmVudExpc3RlbmVyKEV2ZW50SURfQkVGT1JFTkFWSUdBVEUyLCBicm93c2VyTGlzdGVuZXIpOwotCQlzaXRlLmFkZEV2ZW50TGlzdGVuZXIoRXZlbnRJRF9ET0NVTUVOVENPTVBMRVRFLCBicm93c2VyTGlzdGVuZXIpOwotCQlzaXRlLmFkZEV2ZW50TGlzdGVuZXIoRXZlbnRJRF9OQVZJR0FURUNPTVBMRVRFMiwgYnJvd3Nlckxpc3RlbmVyKTsKLQkJc2l0ZS5hZGRFdmVudExpc3RlbmVyKEV2ZW50SURfTkFWSUdBVEVFUlJPUiwgYnJvd3Nlckxpc3RlbmVyKTsKLQkJc2l0ZS5hZGRFdmVudExpc3RlbmVyKEV2ZW50SURfTkVXV0lORE9XMiwgYnJvd3Nlckxpc3RlbmVyKTsKLQkJc2l0ZS5hZGRFdmVudExpc3RlbmVyKEV2ZW50SURfUFJPR1JFU1NDSEFOR0UsIGJyb3dzZXJMaXN0ZW5lcik7Ci0JCXNpdGUuYWRkRXZlbnRMaXN0ZW5lcihFdmVudElEX1NUQVRVU1RFWFRDSEFOR0UsIGJyb3dzZXJMaXN0ZW5lcik7Ci0JCXNpdGUuYWRkRXZlbnRMaXN0ZW5lcihFdmVudElEX1RJVExFQ0hBTkdFLCBicm93c2VyTGlzdGVuZXIpOwotCQlzaXRlLmFkZEV2ZW50TGlzdGVuZXIoRXZlbnRJRF9XSU5ET1dDTE9TSU5HLCBicm93c2VyTGlzdGVuZXIpOwotCi0JCS8vIGZvciBKYXZhU2NyaXB0IHdpbmRvdy5jbG9zZSgpCi0KLQkJQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgQ2FsbGJhY2sodGhpcywgInNpdGVXaW5kb3dQcm9jIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGFkZHJlc3MgPSBjYWxsYmFjay5nZXRBZGRyZXNzKCk7Ci0JCWlmIChhZGRyZXNzICE9IDApIHsKLQkJCW9sZFByb2MgPSBPUy5HZXRXaW5kb3dMb25nKHNpdGUuaGFuZGxlLCBPUy5HV0xfV05EUFJPQyk7Ci0JCQlPUy5TZXRXaW5kb3dMb25nKHNpdGUuaGFuZGxlLCBPUy5HV0xfV05EUFJPQywgYWRkcmVzcyk7Ci0JCX0gZWxzZSB7Ci0JCQljYWxsYmFjay5kaXNwb3NlKCk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogUHVibGljIGludGVyZmFjZXMKLQkgKi8KLQotCXB1YmxpYyB2b2lkIGFkZEJyb3dzZXJFdmVudExpc3RlbmVyKEJyb3dzZXJFdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCVNldCBzZXQgPSBnZXRFdmVudExpc3RlbmVycygpOwotCQlzZXQuYWRkKGxpc3RlbmVyKTsKLQkJc2V0RXZlbnRMaXN0ZW5lcnMoc2V0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVCcm93c2VyRXZlbnRMaXN0ZW5lcihCcm93c2VyRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlTZXQgc2V0ID0gZ2V0RXZlbnRMaXN0ZW5lcnMoKTsKLQkJc2V0LnJlbW92ZShsaXN0ZW5lcik7Ci0JCXNldEV2ZW50TGlzdGVuZXJzKHNldCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZWZ0KCkgewotCQlyZXR1cm4gZ2V0QnJvd3NlckludGVnZXIoIkxlZnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VG9wKCkgewotCQlyZXR1cm4gZ2V0QnJvd3NlckludGVnZXIoIlRvcCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldEJyb3dzZXJJbnRlZ2VyKCJXaWR0aCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBnZXRCcm93c2VySW50ZWdlcigiSGVpZ2h0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFJlYWR5U3RhdGUoKSB7Ci0JCXJldHVybiBnZXRCcm93c2VySW50ZWdlcigiUmVhZHlTdGF0ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0QnJvd3NlclN0cmluZygiVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSTCgpIHsKLQkJcmV0dXJuIGdldEJyb3dzZXJTdHJpbmcoIkxvY2F0aW9uVVJMIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIGdldEJyb3dzZXJTdHJpbmcoIkxvY2F0aW9uTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0U2lsZW50KCkgewotCQlyZXR1cm4gZ2V0QnJvd3NlckJvb2xlYW4oIlNpbGVudCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0U2lsZW50KGJvb2xlYW4gc2lsZW50KSB7Ci0JCXNldEJyb3dzZXJCb29sZWFuKCJTaWxlbnQiLCBzaWxlbnQpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZVNjcmlwdERlYnVnZ2VyKCkgewotCQlyZXR1cm4gYkRpc2FibGVTY3JpcHREZWJ1Z2dlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlU2NyaXB0RGVidWdnZXIoYm9vbGVhbiBiRGlzYWJsZSkgewotCQliRGlzYWJsZVNjcmlwdERlYnVnZ2VyID0gYkRpc2FibGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ29CYWNrKCkgewotCQlyZXR1cm4gaW52b2tlQnJvd3Nlck1ldGhvZCgiR29CYWNrIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnb0ZvcndhcmQoKSB7Ci0JCXJldHVybiBpbnZva2VCcm93c2VyTWV0aG9kKCJHb0ZvcndhcmQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0b3AoKSB7Ci0JCXJldHVybiBpbnZva2VCcm93c2VyTWV0aG9kKCJTdG9wIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZyZXNoKCkgewotCQlyZXR1cm4gaW52b2tlQnJvd3Nlck1ldGhvZCgiUmVmcmVzaCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gbmF2aWdhdGUoU3RyaW5nIHVybCkgewotCQlpbnRbXSBwSWROYXZpZ2F0ZSA9IGF1dG8KLQkJCQkuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyAiTmF2aWdhdGUiLCAiVVJMIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChudWxsICE9IHBJZE5hdmlnYXRlKSB7Ci0JCQlWYXJpYW50IHZhclVybCA9IG5ldyBWYXJpYW50KHVybCk7Ci0JCQlWYXJpYW50IHZhclJlc3VsdCA9IGF1dG8uaW52b2tlKHBJZE5hdmlnYXRlWzBdLAotCQkJCQluZXcgVmFyaWFudFtdIHsgdmFyVXJsIH0sIG5ldyBpbnRbXSB7IHBJZE5hdmlnYXRlWzFdIH0pOwotCQkJdmFyVXJsLmRpc3Bvc2UoKTsKLQkJCWlmICh2YXJSZXN1bHQgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gcmVzdWx0ID0gdmFyUmVzdWx0LmdldFR5cGUoKSA9PSBPTEUuVlRfRU1QVFk7Ci0JCQkJdmFyUmVzdWx0LmRpc3Bvc2UoKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBuYXZpZ2F0ZTIoU3RyaW5nIHVybCwgaW50IGZsYWdzLCBTdHJpbmcgdGFyZ2V0RnJhbWVOYW1lLAotCQkJT2JqZWN0IHBvc3REYXRhLCBTdHJpbmcgaGVhZGVycykgewotCQlpbnRbXSBwSWROYXZpZ2F0ZTIgPSBhdXRvLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIk5hdmlnYXRlMiIgfSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG51bGwgIT0gcElkTmF2aWdhdGUyKSB7Ci0JCQlWYXJpYW50IHZhclVybCA9IG5ldyBWYXJpYW50KHVybCk7Ci0JCQlWYXJpYW50IHZhckZsYWdzID0gbmV3IFZhcmlhbnQoZmxhZ3MpOwotCQkJVmFyaWFudCB2YXJUYXJnZXRGcmFtZU5hbWUgPSBudWxsID09IHRhcmdldEZyYW1lTmFtZSA/IG5ldyBWYXJpYW50KCkKLQkJCQkJOiBuZXcgVmFyaWFudCh0YXJnZXRGcmFtZU5hbWUpOwotCQkJVmFyaWFudCB2YXJIZWFkZXJzID0gbnVsbCA9PSBoZWFkZXJzID8gbmV3IFZhcmlhbnQoKSA6IG5ldyBWYXJpYW50KAotCQkJCQloZWFkZXJzKTsKLQkJCWlmICghKHBvc3REYXRhIGluc3RhbmNlb2YgVmFyaWFudCkpIHsKLQkJCQlwb3N0RGF0YSA9IG5ldyBWYXJpYW50KCk7Ci0JCQl9Ci0JCQlWYXJpYW50IHZhclJlc3VsdCA9IGF1dG8uaW52b2tlKHBJZE5hdmlnYXRlMlswXSwgbmV3IFZhcmlhbnRbXSB7Ci0JCQkJCXZhclVybCwgdmFyRmxhZ3MsIHZhclRhcmdldEZyYW1lTmFtZSwgKFZhcmlhbnQpIHBvc3REYXRhLAotCQkJCQl2YXJIZWFkZXJzIH0pOwotCQkJdmFyVXJsLmRpc3Bvc2UoKTsKLQkJCXZhckZsYWdzLmRpc3Bvc2UoKTsKLQkJCXZhclRhcmdldEZyYW1lTmFtZS5kaXNwb3NlKCk7Ci0JCQl2YXJIZWFkZXJzLmRpc3Bvc2UoKTsKLQkJCWlmICh2YXJSZXN1bHQgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gcmVzdWx0ID0gdmFyUmVzdWx0LmdldFR5cGUoKSA9PSBPTEUuVlRfRU1QVFk7Ci0JCQkJdmFyUmVzdWx0LmRpc3Bvc2UoKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXRGb250U2l6ZShpbnQgblNpemUpIHsKLQkJVmFyaWFudCB2YXJJbiA9IG5ldyBWYXJpYW50KG5TaXplKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBPTEUuU19PSyA9PSBzaXRlLmV4ZWMoT0xFLk9MRUNNRElEX1pPT00sCi0JCQkJCU9MRS5PTEVDTURFWEVDT1BUX0RPTlRQUk9NUFRVU0VSLCB2YXJJbiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0gZmluYWxseSB7Ci0JCQl2YXJJbi5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Rm9udFNpemUoKSB7Ci0JCVZhcmlhbnQgdmFyT3V0ID0gbmV3IFZhcmlhbnQoKTsKLQkJdHJ5IHsKLQkJCWlmIChPTEUuU19PSyA9PSBzaXRlLmV4ZWMoT0xFLk9MRUNNRElEX1pPT00sCi0JCQkJCU9MRS5PTEVDTURFWEVDT1BUX0RPTlRQUk9NUFRVU0VSLCBudWxsLCB2YXJPdXQpKSB7Ci0JCQkJaWYgKE9MRS5WVF9JNCA9PSB2YXJPdXQuZ2V0VHlwZSgpKSB7Ci0JCQkJCXJldHVybiB2YXJPdXQuZ2V0SW50KCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9IGZpbmFsbHkgewotCQkJdmFyT3V0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2F2ZUxpdmVEb20oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVZhcmlhbnQgdmFyRG9jdW1lbnQgPSBnZXRCcm93c2VyVmFyaWFudCgiRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobnVsbCAhPSB2YXJEb2N1bWVudCkgewotCQkJdHJ5IHsKLQkJCQlPbGVBdXRvbWF0aW9uIGRvY3VtZW50ID0gdmFyRG9jdW1lbnQuZ2V0QXV0b21hdGlvbigpOwotCQkJCVZhcmlhbnQgdmFyRG9jRWxlID0gZ2V0VmFyaWFudChkb2N1bWVudCwgImRvY3VtZW50RWxlbWVudCIpOwotCQkJCWRvY3VtZW50LmRpc3Bvc2UoKTsKLQkJCQlpZiAobnVsbCAhPSB2YXJEb2NFbGUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU9sZUF1dG9tYXRpb24gZG9jRWxlID0gdmFyRG9jRWxlLmdldEF1dG9tYXRpb24oKTsKLQkJCQkJCVZhcmlhbnQgdmFyT3V0ZXJIVE1MID0gZ2V0VmFyaWFudChkb2NFbGUsICJvdXRlckhUTUwiKTsKLQkJCQkJCWRvY0VsZS5kaXNwb3NlKCk7Ci0JCQkJCQlpZiAobnVsbCAhPSB2YXJPdXRlckhUTUwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQkvLyBmb3IgYnVnCi0JCQkJCQkJCS8vIHJlcGxhY2UgImFsdD1cdTMwMDAiIHdpdGggImFsdD1cIiBcIiIKLQkJCQkJCQkJLy8gcmVwbGFjZSAiYWx0PSogIiB3aXRoICJhbHQ9XCIqXCIgIgotCi0JCQkJCQkJCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKAotCQkJCQkJCQkJCW5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0JCQkJCQkJCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlTmFtZSksCi0JCQkJCQkJCQkJCQkiVVRGLTgiKSk7Ci0JCQkJCQkJCXB3LnByaW50bG4odmFyT3V0ZXJIVE1MLmdldFN0cmluZygpKTsKLQkJCQkJCQkJcHcuZmx1c2goKTsKLQkJCQkJCQkJcHcuY2xvc2UoKTsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUzKSB7Ci0JCQkJCQkJCWUzLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCXZhck91dGVySFRNTC5kaXNwb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKLQkJCQkJCWUyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJdmFyRG9jRWxlLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl2YXJEb2N1bWVudC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhdmUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVZhcmlhbnQgdmFyRG9jdW1lbnQgPSBnZXRCcm93c2VyVmFyaWFudCgiRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobnVsbCAhPSB2YXJEb2N1bWVudCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gc2F2ZURvY3VtZW50KHZhckRvY3VtZW50LCBmaWxlTmFtZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXZhckRvY3VtZW50LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGludCBnZXRCcm93c2VyQWRkcmVzcygpIHsKLQkJVmFyaWFudCB2YXJpYW50ID0gbmV3IFZhcmlhbnQoYXV0byk7Ci0JCUlEaXNwYXRjaCBpRGlzcGF0Y2ggPSB2YXJpYW50LmdldERpc3BhdGNoKCk7Ci0JCXJldHVybiBpRGlzcGF0Y2guZ2V0QWRkcmVzcygpOwotCX0KLQotCXB1YmxpYyBpbnRbXSBnZXRXaG9sZVNpemUoKSB7Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbXSB7IC0xLCAtMSB9OwotCQlWYXJpYW50IHZhckRvY3VtZW50ID0gZ2V0QnJvd3NlclZhcmlhbnQoIkRvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG51bGwgIT0gdmFyRG9jdW1lbnQpIHsKLQkJCXRyeSB7Ci0JCQkJT2xlQXV0b21hdGlvbiBkb2N1bWVudCA9IHZhckRvY3VtZW50LmdldEF1dG9tYXRpb24oKTsKLQkJCQlWYXJpYW50IHZhckRvY0VsZSA9IGdldFZhcmlhbnQoZG9jdW1lbnQsICJkb2N1bWVudEVsZW1lbnQiKTsKLQkJCQlpZiAobnVsbCAhPSB2YXJEb2NFbGUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU9sZUF1dG9tYXRpb24gZG9jRWxlID0gdmFyRG9jRWxlLmdldEF1dG9tYXRpb24oKTsKLQkJCQkJCXJlc3VsdFswXSA9IGdldEludEZyb21PbGVBdXRvbWF0aW9uKGRvY0VsZSwgInNjcm9sbFdpZHRoIik7Ci0JCQkJCQlyZXN1bHRbMV0gPSBnZXRJbnRGcm9tT2xlQXV0b21hdGlvbihkb2NFbGUsICJzY3JvbGxIZWlnaHQiKTsKLQkJCQkJCWRvY0VsZS5kaXNwb3NlKCk7Ci0KLQkJCQkJCWludCBib2R5U2l6ZVtdID0gZ2V0Qm9keVNpemUoZG9jdW1lbnQpOwotCi0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0WzBdKyIgIityZXN1bHRbMV0rIiA6Ci0JCQkJCQkvLyAiK2JvZHlTaXplWzBdKyIgIitib2R5U2l6ZVsxXSk7Ci0KLQkJCQkJCWlmIChyZXN1bHRbMF0gPCBib2R5U2l6ZVswXSkgewotCQkJCQkJCXJlc3VsdFswXSA9IGJvZHlTaXplWzBdOwotCQkJCQkJfQotCQkJCQkJaWYgKHJlc3VsdFsxXSA8IGJvZHlTaXplWzFdKSB7Ci0JCQkJCQkJcmVzdWx0WzFdID0gYm9keVNpemVbMV07Ci0JCQkJCQl9Ci0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXZhckRvY0VsZS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZG9jdW1lbnQuZGlzcG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl2YXJEb2N1bWVudC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChyZXN1bHQpOwotCX0KLQotCXB1YmxpYyBJbWFnZVBvc2l0aW9uSW5mb1tdIGdldEFsbEltYWdlUG9zaXRpb24oKSB7Ci0JCUltYWdlUG9zaXRpb25JbmZvW10gcmVzdWx0ID0gbmV3IEltYWdlUG9zaXRpb25JbmZvWzBdOwotCQlWYXJpYW50IHZhckRvY3VtZW50ID0gZ2V0QnJvd3NlclZhcmlhbnQoIkRvY3VtZW50Iik7Ci0JCWlmIChudWxsICE9IHZhckRvY3VtZW50KSB7Ci0JCQl0cnkgewotCQkJCU9sZUF1dG9tYXRpb24gZG9jdW1lbnQgPSB2YXJEb2N1bWVudC5nZXRBdXRvbWF0aW9uKCk7Ci0JCQkJVmFyaWFudCB2YXJJbWFnZXMgPSBnZXRWYXJpYW50KGRvY3VtZW50LCAiaW1hZ2VzIik7Ci0JCQkJZG9jdW1lbnQuZGlzcG9zZSgpOwotCQkJCWlmIChudWxsICE9IHZhckltYWdlcykgewotCQkJCQl0cnkgewotCQkJCQkJT2xlQXV0b21hdGlvbiBpbWFnZXMgPSB2YXJJbWFnZXMuZ2V0QXV0b21hdGlvbigpOwotCQkJCQkJcmVzdWx0ID0gIGdldEFsbEltYWdlUG9zaXRpb24oaW1hZ2VzKTsKLQkJCQkJCWltYWdlcy5kaXNwb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQl2YXJJbWFnZXMuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl2YXJEb2N1bWVudC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzY3JvbGwoaW50IHgsIGludCB5LCBpbnQgdHlwZSkgewotCQlpZiAodHlwZSA9PSAwIHx8IHR5cGUgPT0gMSkgewotCQkJVmFyaWFudCB2YXJEb2N1bWVudCA9IGdldEJyb3dzZXJWYXJpYW50KCJEb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobnVsbCAhPSB2YXJEb2N1bWVudCkgewotCQkJCXRyeSB7Ci0JCQkJCU9sZUF1dG9tYXRpb24gZG9jdW1lbnQgPSB2YXJEb2N1bWVudC5nZXRBdXRvbWF0aW9uKCk7Ci0JCQkJCVZhcmlhbnQgdmFyV2luZG93ID0gZ2V0VmFyaWFudChkb2N1bWVudCwgInBhcmVudFdpbmRvdyIpOwotCQkJCQlkb2N1bWVudC5kaXNwb3NlKCk7Ci0JCQkJCWlmIChudWxsICE9IHZhcldpbmRvdykgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlPbGVBdXRvbWF0aW9uIHdpbmRvdyA9IHZhcldpbmRvdy5nZXRBdXRvbWF0aW9uKCk7Ci0JCQkJCQkJU3RyaW5nIHNjcm9sbFR5cGUgPSAic2Nyb2xsQnkiOwotCQkJCQkJCWlmICh0eXBlID09IDEpIHsKLQkJCQkJCQkJc2Nyb2xsVHlwZSA9ICJzY3JvbGxUbyI7Ci0JCQkJCQkJfQotCQkJCQkJCWludFtdIGlkU2Nyb2xsID0gd2luZG93Ci0JCQkJCQkJCQkuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyBzY3JvbGxUeXBlIH0pOwotCQkJCQkJCWlmIChudWxsICE9IGlkU2Nyb2xsKSB7Ci0JCQkJCQkJCXdpbmRvdy5pbnZva2UoaWRTY3JvbGxbMF0sIG5ldyBWYXJpYW50W10gewotCQkJCQkJCQkJCW5ldyBWYXJpYW50KHgpLCBuZXcgVmFyaWFudCh5KSB9KTsKLQkJCQkJCQkJd2luZG93LmRpc3Bvc2UoKTsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCXdpbmRvdy5kaXNwb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJdmFyV2luZG93LmRpc3Bvc2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl2YXJEb2N1bWVudC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEJyb3dzZXIgZXZlbnQgaGFuZGxlcnMKLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIG9uQmVmb3JlTmF2aWdhdGUyKEJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnMgcGFyYW0pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZXZlbnRMaXN0ZW5lcnNbaV0uYmVmb3JlTmF2aWdhdGUyKHBhcmFtKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9uTmF2aWdhdGVDb21wbGV0ZTIoTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzIHBhcmFtKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCWV2ZW50TGlzdGVuZXJzW2ldLm5hdmlnYXRlQ29tcGxldGUyKHBhcmFtKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9uTmF2aWdhdGVFcnJvcihOYXZpZ2F0ZUVycm9yUGFyYW1ldGVycyBwYXJhbSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50TGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlldmVudExpc3RlbmVyc1tpXS5uYXZpZ2F0ZUVycm9yKHBhcmFtKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9uRG9jdW1lbnRDb21wbGV0ZShEb2N1bWVudENvbXBsZXRlUGFyYW1ldGVycyBwYXJhbSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50TGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlldmVudExpc3RlbmVyc1tpXS5kb2N1bWVudENvbXBsZXRlKHBhcmFtKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9uTmV3V2luZG93MihOZXdXaW5kb3cyUGFyYW1ldGVycyBwYXJhbSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50TGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlldmVudExpc3RlbmVyc1tpXS5uZXdXaW5kb3cyKHBhcmFtKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9uV2luZG93Q2xvc2luZyhXaW5kb3dDbG9zaW5nUGFyYW1ldGVycyBwYXJhbSkgewotCQkvLyBwYXJhbS5zZXRDYW5jZWwodHJ1ZSk7Ci0JCS8vICAgICAgICAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZXZlbnRMaXN0ZW5lcnNbaV0ud2luZG93Q2xvc2luZyhwYXJhbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvbldpbmRvd0Nsb3NlZCgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZXZlbnRMaXN0ZW5lcnNbaV0ud2luZG93Q2xvc2VkKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvblN0YXR1c1RleHRDaGFuZ2UoU3RhdHVzVGV4dENoYW5nZVBhcmFtZXRlcnMgcGFyYW0pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJZXZlbnRMaXN0ZW5lcnNbaV0uc3RhdHVzVGV4dENoYW5nZShwYXJhbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvblRpdGxlQ2hhbmdlKFRpdGxlQ2hhbmdlUGFyYW1ldGVycyBwYXJhbSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50TGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlldmVudExpc3RlbmVyc1tpXS50aXRsZUNoYW5nZShwYXJhbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvblByb2dyZXNzQ2hhbmdlKFByb2dyZXNzQ2hhbmdlUGFyYW1ldGVycyBwYXJhbSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50TGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlldmVudExpc3RlbmVyc1tpXS5wcm9ncmVzc0NoYW5nZShwYXJhbSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFByaXZhdGUgbWV0aG9kcwotCSAqLwotCi0JcHJpdmF0ZSBTZXQgZ2V0RXZlbnRMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBuZXcgTGlua2VkSGFzaFNldChBcnJheXMuYXNMaXN0KGV2ZW50TGlzdGVuZXJzKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEV2ZW50TGlzdGVuZXJzKFNldCBzZXQpIHsKLQkJZXZlbnRMaXN0ZW5lcnMgPSAoQnJvd3NlckV2ZW50TGlzdGVuZXJbXSkgc2V0Ci0JCQkJLnRvQXJyYXkobmV3IEJyb3dzZXJFdmVudExpc3RlbmVyW3NldC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNhdmVEb2N1bWVudChWYXJpYW50IHZhckRvY3VtZW50LCBTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaWYgKE9MRS5WVF9ESVNQQVRDSCA9PSB2YXJEb2N1bWVudC5nZXRUeXBlKCkpIHsKLQkJCWludFtdIHBQZXJzaXN0RmlsZSA9IG5ldyBpbnRbMV07Ci0JCQl0cnkgewotCQkJCWlmIChPTEUuU19PSyA9PSB2YXJEb2N1bWVudC5nZXREaXNwYXRjaCgpLlF1ZXJ5SW50ZXJmYWNlKAotCQkJCQkJQ09NLklJRElQZXJzaXN0RmlsZSwgcFBlcnNpc3RGaWxlKSkgewotCQkJCQlpbnQgcFN0ckFkZHJlc3MgPSBDT00KLQkJCQkJCQkuU3lzQWxsb2NTdHJpbmcoKGZpbGVOYW1lICsgIlwwIikudG9DaGFyQXJyYXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiBPTEUuU19PSyA9PSBuZXcgSVBlcnNpc3RGaWxlKHBQZXJzaXN0RmlsZVswXSkKLQkJCQkJCQkJLlNhdmUocFN0ckFkZHJlc3MsIGZhbHNlKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCUNPTS5TeXNGcmVlU3RyaW5nKHBTdHJBZGRyZXNzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGludm9rZUJyb3dzZXJNZXRob2QoU3RyaW5nIG5hbWUpIHsKLQkJaW50W10gcElkTmFtZSA9IGF1dG8uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyBuYW1lIH0pOwotCQlpZiAobnVsbCAhPSBwSWROYW1lKSB7Ci0JCQlWYXJpYW50IHZhclJlc3VsdCA9IGF1dG8uaW52b2tlKHBJZE5hbWVbMF0pOwotCQkJaWYgKG51bGwgIT0gdmFyUmVzdWx0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHZhclJlc3VsdC5nZXRUeXBlKCkgPT0gT0xFLlZUX0VNUFRZOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXZhclJlc3VsdC5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIFZhcmlhbnQgZ2V0QnJvd3NlclZhcmlhbnQoU3RyaW5nIG5hbWUpIHsKLQkJaW50W10gcElkTmFtZSA9IGF1dG8uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyBuYW1lIH0pOwotCQlpZiAobnVsbCAhPSBwSWROYW1lKSB7Ci0JCQlyZXR1cm4gYXV0by5nZXRQcm9wZXJ0eShwSWROYW1lWzBdKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRCcm93c2VySW50ZWdlcihTdHJpbmcgbmFtZSkgewotCQlWYXJpYW50IHZhclJlc3VsdCA9IGdldEJyb3dzZXJWYXJpYW50KG5hbWUpOwotCQlpZiAobnVsbCAhPSB2YXJSZXN1bHQpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHZhclJlc3VsdC5nZXRJbnQoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdmFyUmVzdWx0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRCcm93c2VyU3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0JCVZhcmlhbnQgdmFyUmVzdWx0ID0gZ2V0QnJvd3NlclZhcmlhbnQobmFtZSk7Ci0JCWlmIChudWxsICE9IHZhclJlc3VsdCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gdmFyUmVzdWx0LmdldFN0cmluZygpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl2YXJSZXN1bHQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXRCcm93c2VyQm9vbGVhbihTdHJpbmcgbmFtZSkgewotCQlWYXJpYW50IHZhclJlc3VsdCA9IGdldEJyb3dzZXJWYXJpYW50KG5hbWUpOwotCQlpZiAobnVsbCAhPSB2YXJSZXN1bHQpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHZhclJlc3VsdC5nZXRCb29sZWFuKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXZhclJlc3VsdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZXRCcm93c2VyVmFyaWFudChTdHJpbmcgbmFtZSwgVmFyaWFudCB2YXIpIHsKLQkJaW50W10gcElkTmFtZSA9IGF1dG8uZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyBuYW1lIH0pOwotCQlpZiAobnVsbCAhPSBwSWROYW1lKSB7Ci0JCQlyZXR1cm4gYXV0by5zZXRQcm9wZXJ0eShwSWROYW1lWzBdLCB2YXIpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2V0QnJvd3NlckludGVnZXIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotCQlyZXR1cm4gc2V0QnJvd3NlclZhcmlhbnQobmFtZSwgbmV3IFZhcmlhbnQodmFsdWUpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2V0QnJvd3NlclN0cmluZyhTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXJldHVybiBzZXRCcm93c2VyVmFyaWFudChuYW1lLCBuZXcgVmFyaWFudCh2YWx1ZSkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZXRCcm93c2VyQm9vbGVhbihTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlyZXR1cm4gc2V0QnJvd3NlclZhcmlhbnQobmFtZSwgbmV3IFZhcmlhbnQodmFsdWUpKTsKLQl9Ci0KLQlwcml2YXRlIGludFtdIGdldEJvZHlTaXplKE9sZUF1dG9tYXRpb24gZG9jdW1lbnQpIHsKLQkJaW50W10gcmVzdWx0ID0geyAtMSwgLTEgfTsKLQkJVmFyaWFudCB2YXJCb2R5ID0gZ2V0VmFyaWFudChkb2N1bWVudCwgImJvZHkiKTsKLQkJaWYgKG51bGwgIT0gdmFyQm9keSkgewotCQkJdHJ5IHsKLQkJCQlPbGVBdXRvbWF0aW9uIGJvZHkgPSB2YXJCb2R5LmdldEF1dG9tYXRpb24oKTsKLQkJCQlpbnQgc2Nyb2xsV2lkdGggPSBnZXRJbnRGcm9tT2xlQXV0b21hdGlvbihib2R5LCAic2Nyb2xsV2lkdGgiKTsKLQkJCQlpbnQgb2Zmc2V0TGVmdCA9IGdldEludEZyb21PbGVBdXRvbWF0aW9uKGJvZHksICJvZmZzZXRMZWZ0Iik7Ci0JCQkJaW50IHNjcm9sbEhlaWdodCA9IGdldEludEZyb21PbGVBdXRvbWF0aW9uKGJvZHksICJzY3JvbGxIZWlnaHQiKTsKLQkJCQlpbnQgb2Zmc2V0VG9wID0gZ2V0SW50RnJvbU9sZUF1dG9tYXRpb24oYm9keSwgIm9mZnNldFRvcCIpOwotCi0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHNjcm9sbFdpZHRoKyIgIitvZmZzZXRMZWZ0KyIKLQkJCQkvLyAiK3Njcm9sbEhlaWdodCsiICIrb2Zmc2V0VG9wKTsKLQotCQkJCXJlc3VsdFswXSA9IHNjcm9sbFdpZHRoICsgb2Zmc2V0TGVmdCAqIDI7Ci0JCQkJcmVzdWx0WzFdID0gc2Nyb2xsSGVpZ2h0ICsgb2Zmc2V0VG9wICogMjsKLQotCQkJCWJvZHkuZGlzcG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl2YXJCb2R5LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSW1hZ2VQb3NpdGlvbkluZm9bXSBnZXRBbGxJbWFnZVBvc2l0aW9uKE9sZUF1dG9tYXRpb24gaW1hZ2VzKSB7Ci0JCUltYWdlUG9zaXRpb25JbmZvW10gcmVzdWx0ID0gbmV3IEltYWdlUG9zaXRpb25JbmZvWzBdOwotCQlpbnQgc2l6ZSA9IGdldEludEZyb21PbGVBdXRvbWF0aW9uKGltYWdlcywgImxlbmd0aCIpOwotCQlpZiAoc2l6ZSA+IC0xKSB7Ci0JCQlJbWFnZVBvc2l0aW9uSW5mb1tdIHRtcCA9IG5ldyBJbWFnZVBvc2l0aW9uSW5mb1tzaXplXTsKLQkJCWludFtdIGlkSXRlbSA9IGltYWdlcy5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJJdGVtIiB9KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJVmFyaWFudCB2YXJJbWFnZSA9IGltYWdlcy5pbnZva2UoaWRJdGVtWzBdLAotCQkJCQkJbmV3IFZhcmlhbnRbXSB7IG5ldyBWYXJpYW50KGkpIH0pOwotCQkJCWlmIChudWxsICE9IHZhckltYWdlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlPbGVBdXRvbWF0aW9uIGltYWdlID0gdmFySW1hZ2UuZ2V0QXV0b21hdGlvbigpOwotCQkJCQkJaW50W10gYmNyID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGltYWdlKTsKLQkJCQkJCWludCB3aWR0aCA9IGdldEludEZyb21PbGVBdXRvbWF0aW9uKGltYWdlLCAiV2lkdGgiKTsKLQkJCQkJCWludCBoZWlnaHQgPSBnZXRJbnRGcm9tT2xlQXV0b21hdGlvbihpbWFnZSwgIkhlaWdodCIpOwotCQkJCQkJU3RyaW5nIHVybCA9IGdldFN0cmluZ0Zyb21PbGVBdXRvbWF0aW9uKGltYWdlLCAic3JjIik7Ci0JCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0KLQkJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKGJjclswXSsiICIrYmNyWzFdKyIgIitiY3JbMl0rIiAiK2JjclszXSsiICIrd2lkdGgrIiAiK2hlaWdodCsiICIrdXJsKTsKLQkJCQkJCQotCQkJCQkJdG1wW2ldID0gbmV3IEltYWdlUG9zaXRpb25JbmZvKGJjclswXSxiY3JbMV0sd2lkdGgsaGVpZ2h0LHVybCk7Ci0JCQkJCQkKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7Ci0JCQkJCQllMi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQl2YXJJbWFnZS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXN1bHQgPSB0bXA7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGludFtdIGdldEJvdW5kaW5nQ2xpZW50UmVjdChPbGVBdXRvbWF0aW9uIGltYWdlKSB7Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbXSB7IDAsIDB9Oy8vTGVmdCwgVG9wCi0JCWlmIChudWxsICE9IGltYWdlKSB7Ci0JCQlpbnRbXSBpZEJDUiA9IGltYWdlLmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsiZ2V0Qm91bmRpbmdDbGllbnRSZWN0In0pOwotCQkJVmFyaWFudCB2YXJCQ1IgPSBpbWFnZS5pbnZva2UoaWRCQ1JbMF0pOwotCQkJaWYgKG51bGwgIT0gdmFyQkNSKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJT2xlQXV0b21hdGlvbiBiY3IgPSB2YXJCQ1IuZ2V0QXV0b21hdGlvbigpOwotCQkJCQlyZXN1bHQgPSBuZXcgaW50W10geyBnZXRJbnRGcm9tT2xlQXV0b21hdGlvbihiY3IsICJMZWZ0IiksCi0JCQkJCQkJZ2V0SW50RnJvbU9sZUF1dG9tYXRpb24oYmNyLCAiVG9wIiksCi0JCQkJCQkJLy9nZXRJbnRGcm9tT2xlQXV0b21hdGlvbihiY3IsICJSaWdodCIpLAotCQkJCQkJCS8vZ2V0SW50RnJvbU9sZUF1dG9tYXRpb24oYmNyLCAiQm90dG9tIikKLQkJCQkJCQl9OwotCQkJCQliY3IuZGlzcG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJdmFyQkNSLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsvLwotCX0KLQotCXByaXZhdGUgVmFyaWFudCBnZXRWYXJpYW50KE9sZUF1dG9tYXRpb24gdGFyZ2V0LCBTdHJpbmcgbmFtZSkgewotCQlpZiAobnVsbCAhPSB0YXJnZXQpIHsKLQkJCWludFtdIHBJZE5hbWUgPSB0YXJnZXQuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyBuYW1lIH0pOwotCQkJaWYgKG51bGwgIT0gcElkTmFtZSkgewotCQkJCXJldHVybiB0YXJnZXQuZ2V0UHJvcGVydHkocElkTmFtZVswXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0SW50RnJvbU9sZUF1dG9tYXRpb24oT2xlQXV0b21hdGlvbiB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCVZhcmlhbnQgdmFyUmVzdWx0ID0gZ2V0VmFyaWFudCh0YXJnZXQsIG5hbWUpOwotCQlpZiAobnVsbCAhPSB2YXJSZXN1bHQpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHZhclJlc3VsdC5nZXRJbnQoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdmFyUmVzdWx0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ly8gVE9ETwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0cmluZ0Zyb21PbGVBdXRvbWF0aW9uKE9sZUF1dG9tYXRpb24gdGFyZ2V0LCBTdHJpbmcgbmFtZSkgewotCQlWYXJpYW50IHZhclJlc3VsdCA9IGdldFZhcmlhbnQodGFyZ2V0LCBuYW1lKTsKLQkJaWYgKG51bGwgIT0gdmFyUmVzdWx0KSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiB2YXJSZXN1bHQuZ2V0U3RyaW5nKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXZhclJlc3VsdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOy8vIFRPRE8KLQl9Ci0KLQkvKioKLQkgKiBXaW5kb3cgcHJvY2VkdXJlCi0JICogCi0JICogQHBhcmFtIGh3bmQKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIHdQYXJhbQotCSAqIEBwYXJhbSBsUGFyYW0KLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IHNpdGVXaW5kb3dQcm9jKGludCBod25kLCBpbnQgbXNnLCBpbnQgd1BhcmFtLCBpbnQgbFBhcmFtKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoIWlzQ2xvc2VkICYmIE9TLldNX1BBUkVOVE5PVElGWSA9PSBtc2cKLQkJCQkJJiYgd1BhcmFtID09IE9TLldNX0RFU1RST1kpIHsKLQkJCQlpc0Nsb3NlZCA9IHRydWU7Ci0JCQkJb25XaW5kb3dDbG9zZWQoKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCXJldHVybiBPUy5DYWxsV2luZG93UHJvYyhvbGRQcm9jLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZXJyb3I6IHNpdGVXaW5kb3dQcm9jIik7Ci0JCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogZm9yIGRlYnVnCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGR1bXBBcmFncyhWYXJpYW50W10gYXJncykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgPiAwKSB7Ci0JCQkJc2IuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzYi5hcHBlbmQoaSArICI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICgoT0xFLlZUX0JZUkVGIHwgT0xFLlZUX1ZBUklBTlQpID09IGFyZ3NbaV0uZ2V0VHlwZSgpKSB7Ci0JCQkJaW50IGJ5UmVmID0gYXJnc1tpXS5nZXRCeVJlZigpOwotCQkJCXNob3J0W10gZGF0YVR5cGUgPSBuZXcgc2hvcnRbMV07Ci0JCQkJQ09NLk1vdmVNZW1vcnkoZGF0YVR5cGUsIGJ5UmVmLCAyKTsKLQkJCQlTdHJpbmcgc3RyVHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IHR5cGUgPSBkYXRhVHlwZVswXTsKLQkJCQlpZiAoKHR5cGUgJiBPTEUuVlRfQllSRUYpICE9IDApIHsKLQkJCQkJc3RyVHlwZSA9ICJWVF9CWVJFRnwiOyAvLyROT04tTkxTLTEkCi0JCQkJCXR5cGUgPSB0eXBlICYgfk9MRS5WVF9CWVJFRjsKLQkJCQl9Ci0JCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSBPTEUuVlRfQk9PTDoKLQkJCQkJc3RyVHlwZSArPSAiVlRfQk9PTCI7YnJlYWs7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIE9MRS5WVF9JMjoKLQkJCQkJc3RyVHlwZSArPSAiVlRfSTIiO2JyZWFrOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSBPTEUuVlRfSTQ6Ci0JCQkJCXN0clR5cGUgKz0gIlZUX0k0IjticmVhazsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgT0xFLlZUX0k4OgotCQkJCQlzdHJUeXBlICs9ICJWVF9JOCI7YnJlYWs7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIE9MRS5WVF9SNDoKLQkJCQkJc3RyVHlwZSArPSAiVlRfUjQiO2JyZWFrOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSBPTEUuVlRfUjg6Ci0JCQkJCXN0clR5cGUgKz0gIlZUX1I4IjticmVhazsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgT0xFLlZUX0JTVFI6Ci0JCQkJCXN0clR5cGUgKz0gIlZUX0JTVFIiO2JyZWFrOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSBPTEUuVlRfRElTUEFUQ0g6Ci0JCQkJCXN0clR5cGUgKz0gIlZUX0RJU1BBVENIIjticmVhazsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgT0xFLlZUX1VOS05PV046Ci0JCQkJCXN0clR5cGUgKz0gIlZUX1VOS05PV04iO2JyZWFrOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSBPTEUuVlRfRU1QVFk6Ci0JCQkJCXN0clR5cGUgKz0gIlZUX0VNUFRZIjticmVhazsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgT0xFLlZUX1ZBUklBTlQ6Ci0JCQkJCXN0clR5cGUgKz0gIlZUX1ZBUklBTlQiO2JyZWFrOyAvLyROT04tTkxTLTEkCi0JCQkJZGVmYXVsdDoKLQkJCQkJc3RyVHlwZSArPSAidHlwZT0iICsgdHlwZTticmVhazsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlzYi5hcHBlbmQoIlJFRl9WQVJJQU5UKCIgKyBzdHJUeXBlICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9IGVsc2UgewotCQkJCXNiLmFwcGVuZChhcmdzW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvV2ViQnJvd3NlcklFQ29udHJvbFNpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvV2ViQnJvd3NlcklFQ29udHJvbFNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmYmViNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL1dlYkJyb3dzZXJJRUNvbnRyb2xTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuQ09NOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuQ09NT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuR1VJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuTVNHOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUNvbnRyb2xTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLQotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJJRUNvbnRyb2xTaXRlIGV4dGVuZHMgT2xlQ29udHJvbFNpdGUgewotICAgIENPTU9iamVjdCBpRG9jSG9zdFVJSGFuZGxlcjsKLSAgICBDT01PYmplY3QgaU9sZUNvbW1hbmRUYXJnZXQ7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IE9MRUNNRElEX1NIT1dTQ1JJUFRFUlJPUiA9IDQwOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJPVVRfQkxBTksgPSAiYWJvdXQ6YmxhbmsiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIFdlYkJyb3dzZXJJRUNvbnRyb2xTaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIHByb2dJZCkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlLCBwcm9nSWQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNPTUludGVyZmFjZXMoKSB7Ci0gICAgICAgIHN1cGVyLmNyZWF0ZUNPTUludGVyZmFjZXMoKTsKLSAgICAgICAgaURvY0hvc3RVSUhhbmRsZXIgPSBuZXcgQ09NT2JqZWN0KG5ldyBpbnRbXXsyLCAwLCAwLCA0LCAxLCA1LCAwLCAwLCAxLCAxLCAxLCAzLCAzLCAyLCAyLCAxLCAzLCAyfSl7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDAoaW50W10gYXJncykge3JldHVybiBRdWVyeUludGVyZmFjZShhcmdzWzBdLCBhcmdzWzFdKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDEoaW50W10gYXJncykge3JldHVybiBBZGRSZWYoKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDIoaW50W10gYXJncykge3JldHVybiBSZWxlYXNlKCk7fQotICAgICAgICAgICAgcHVibGljIGludCBtZXRob2QzKGludFtdIGFyZ3MpIHtyZXR1cm4gU2hvd0NvbnRleHRNZW51KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO30KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbWV0aG9kNChpbnRbXSBhcmdzKSB7cmV0dXJuIEdldEhvc3RJbmZvKGFyZ3NbMF0pO30KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbWV0aG9kNShpbnRbXSBhcmdzKSB7cmV0dXJuIFNob3dVSShhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDYoaW50W10gYXJncykge3JldHVybiBIaWRlVUkoKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDcoaW50W10gYXJncykge3JldHVybiBVcGRhdGVVSSgpO30KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbWV0aG9kOChpbnRbXSBhcmdzKSB7cmV0dXJuIEVuYWJsZU1vZGVsZXNzKGFyZ3NbMF0pO30KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbWV0aG9kOShpbnRbXSBhcmdzKSB7cmV0dXJuIE9uRG9jV2luZG93QWN0aXZhdGUoYXJnc1swXSk7fQotICAgICAgICAgICAgcHVibGljIGludCBtZXRob2QxMChpbnRbXSBhcmdzKSB7cmV0dXJuIE9uRnJhbWVXaW5kb3dBY3RpdmF0ZShhcmdzWzBdKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDExKGludFtdIGFyZ3MpIHtyZXR1cm4gUmVzaXplQm9yZGVyKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO30KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgbWV0aG9kMTIoaW50W10gYXJncykge3JldHVybiBUcmFuc2xhdGVBY2NlbGVyYXRvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDEzKGludFtdIGFyZ3MpIHtyZXR1cm4gR2V0T3B0aW9uS2V5UGF0aChhcmdzWzBdLCBhcmdzWzFdKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDE0KGludFtdIGFyZ3MpIHtyZXR1cm4gR2V0RHJvcFRhcmdldChhcmdzWzBdLCBhcmdzWzFdKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDE1KGludFtdIGFyZ3MpIHtyZXR1cm4gR2V0RXh0ZXJuYWwoYXJnc1swXSk7fQotICAgICAgICAgICAgcHVibGljIGludCBtZXRob2QxNihpbnRbXSBhcmdzKSB7cmV0dXJuIFRyYW5zbGF0ZVVybChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTt9ICAgICAgIAotICAgICAgICAgICAgcHVibGljIGludCBtZXRob2QxNyhpbnRbXSBhcmdzKSB7cmV0dXJuIEZpbHRlckRhdGFPYmplY3QoYXJnc1swXSwgYXJnc1sxXSk7fQotICAgICAgICB9OwotICAgICAgICBpT2xlQ29tbWFuZFRhcmdldCA9IG5ldyBDT01PYmplY3QobmV3IGludFtdezIsIDAsIDAsIDQsIDV9KSB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDAoaW50W10gYXJncykge3JldHVybiBRdWVyeUludGVyZmFjZShhcmdzWzBdLCBhcmdzWzFdKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDEoaW50W10gYXJncykge3JldHVybiBBZGRSZWYoKTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDIoaW50W10gYXJncykge3JldHVybiBSZWxlYXNlKCk7fSAgICAgIAotICAgICAgICAgICAgcHVibGljIGludCBtZXRob2QzKGludFtdIGFyZ3MpIHtyZXR1cm4gUXVlcnlTdGF0dXMoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7fSAgICAgICAgCi0gICAgICAgICAgICBwdWJsaWMgaW50IG1ldGhvZDQoaW50W10gYXJncykge3JldHVybiBFeGVjKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0pO30KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlQ09NSW50ZXJmYWNlcygpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZUNPTUludGVyZmFjZXMoKTsKLSAgICAgICAgaWYgKGlEb2NIb3N0VUlIYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlEb2NIb3N0VUlIYW5kbGVyLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIGlEb2NIb3N0VUlIYW5kbGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaU9sZUNvbW1hbmRUYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgaU9sZUNvbW1hbmRUYXJnZXQuZGlzcG9zZSgpOwotICAgICAgICAgICAgaU9sZUNvbW1hbmRUYXJnZXQgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBRdWVyeUludGVyZmFjZShpbnQgcmlpZCwgaW50IHBwdk9iamVjdCkgewotICAgICAgICBpbnQgcmVzdWx0ID0gc3VwZXIuUXVlcnlJbnRlcmZhY2UocmlpZCwgcHB2T2JqZWN0KTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBDT00uU19PSykgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgaWYgKHJpaWQgPT0gMCB8fCBwcHZPYmplY3QgPT0gMCkgcmV0dXJuIENPTS5FX0lOVkFMSURBUkc7Ci0gICAgICAgIEdVSUQgZ3VpZCA9IG5ldyBHVUlEKCk7Ci0gICAgICAgIENPTS5Nb3ZlTWVtb3J5KGd1aWQsIHJpaWQsIEdVSUQuc2l6ZW9mKTsKLSAgICAgICAgaWYgKENPTS5Jc0VxdWFsR1VJRChndWlkLCBDT00uSUlESURvY0hvc3RVSUhhbmRsZXIpKSB7Ci0gICAgICAgICAgICBDT00uTW92ZU1lbW9yeShwcHZPYmplY3QsIG5ldyBpbnRbXSB7aURvY0hvc3RVSUhhbmRsZXIuZ2V0QWRkcmVzcygpfSwgNCk7Ci0gICAgICAgICAgICBBZGRSZWYoKTsKLSAgICAgICAgICAgIHJldHVybiBDT00uU19PSzsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ09NLklzRXF1YWxHVUlEKGd1aWQsIENPTS5JSURJT2xlQ29tbWFuZFRhcmdldCkpIHsKLSAgICAgICAgICAgIENPTS5Nb3ZlTWVtb3J5KHBwdk9iamVjdCwgbmV3IGludFtdIHtpT2xlQ29tbWFuZFRhcmdldC5nZXRBZGRyZXNzKCl9LCA0KTsKLSAgICAgICAgICAgIEFkZFJlZigpOwotICAgICAgICAgICAgcmV0dXJuIENPTS5TX09LOwotICAgICAgICB9Ci0gICAgICAgIENPTS5Nb3ZlTWVtb3J5KHBwdk9iamVjdCwgbmV3IGludFtdIHswfSwgNCk7Ci0gICAgICAgIHJldHVybiBDT00uRV9OT0lOVEVSRkFDRTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IEFkZFJlZigpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLkFkZFJlZigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgUmVsZWFzZSgpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLlJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICAvKiBJRG9jSG9zdFVJSGFuZGxlciAqLwotCi0gICAgaW50IEVuYWJsZU1vZGVsZXNzKGludCBFbmFibGVNb2RlbGVzcykgewotICAgICAgICByZXR1cm4gQ09NLkVfTk9USU1QTDsKLSAgICB9Ci0KLSAgICBpbnQgRmlsdGVyRGF0YU9iamVjdChpbnQgcERPLCBpbnQgcHBET1JldCkgewotICAgICAgICByZXR1cm4gQ09NLkVfTk9USU1QTDsKLSAgICB9Ci0KLSAgICBpbnQgR2V0RHJvcFRhcmdldChpbnQgcERyb3BUYXJnZXQsIGludCBwcERyb3BUYXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIENPTS5FX05PVElNUEw7Ci0gICAgfQotCi0gICAgaW50IEdldEV4dGVybmFsKGludCBwcERpc3BhdGNoKSB7Ci0gICAgICAgIE9TLk1vdmVNZW1vcnkocHBEaXNwYXRjaCwgbmV3IGludFtdIHswfSwgNCk7Ci0gICAgICAgIHJldHVybiBDT00uU19GQUxTRTsKLSAgICB9Ci0KLSAgICBpbnQgR2V0SG9zdEluZm8oaW50IHBJbmZvKSB7Ci0gICAgICAgIGludCBzdHlsZSA9IGdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFN0eWxlKCk7Ci0gICAgICAgIGludCBpbmZvID0gMHgwMDA0MDAwMDsKLS8vICAgICAgICBpZiAoKHN0eWxlICYgU1dULkJPUkRFUikgPT0gMCkgaW5mbyB8PSAweDAwMjAwMDAwOwotICAgICAgICBPUy5Nb3ZlTWVtb3J5KHBJbmZvICsgNCwgbmV3IGludFtdIHtpbmZvfSwgNCk7Ci0gICAgICAgIHJldHVybiBDT00uU19PSzsKLSAgICB9Ci0KLSAgICBpbnQgR2V0T3B0aW9uS2V5UGF0aChpbnQgcGNoS2V5LCBpbnQgZHcpIHsKLSAgICAgICAgcmV0dXJuIENPTS5FX05PVElNUEw7Ci0gICAgfQotCi0gICAgaW50IEhpZGVVSSgpIHsKLSAgICAgICAgcmV0dXJuIENPTS5FX05PVElNUEw7Ci0gICAgfQotCi0gICAgaW50IE9uRG9jV2luZG93QWN0aXZhdGUoaW50IGZBY3RpdmF0ZSkgewotICAgICAgICByZXR1cm4gQ09NLkVfTk9USU1QTDsKLSAgICB9Ci0KLSAgICBpbnQgT25GcmFtZVdpbmRvd0FjdGl2YXRlKGludCBmQWN0aXZhdGUpIHsKLSAgICAgICAgcmV0dXJuIENPTS5FX05PVElNUEw7Ci0gICAgfQotCi0gICAgaW50IFJlc2l6ZUJvcmRlcihpbnQgcHJjQm9yZGVyLCBpbnQgcFVJV2luZG93LCBpbnQgZkZyYW1lV2luZG93KSB7Ci0gICAgICAgIHJldHVybiBDT00uRV9OT1RJTVBMOwotICAgIH0KLQotICAgIGludCBTaG93Q29udGV4dE1lbnUoaW50IGR3SUQsIGludCBwcHQsIGludCBwY21kdFJlc2VydmVkLCBpbnQgcGRpc3BSZXNlcnZlZCkgewotICAgICAgICAvKiBTaG93IGRlZmF1bHQgSUUgcG9wdXAgbWVudSAqLwotICAgICAgICByZXR1cm4gQ09NLlNfRkFMU0U7Ci0gICAgfQotCi0gICAgaW50IFNob3dVSShpbnQgZHdJRCwgaW50IHBBY3RpdmVPYmplY3QsIGludCBwQ29tbWFuZFRhcmdldCwgaW50IHBGcmFtZSwgaW50IHBEb2MpIHsKLSAgICAgICAgcmV0dXJuIENPTS5FX05PVElNUEw7Ci0gICAgfQotCi0gICAgaW50IFRyYW5zbGF0ZUFjY2VsZXJhdG9yKGludCBscE1zZywgaW50IHBndWlkQ21kR3JvdXAsIGludCBuQ21kSUQpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogSGFuZGxlIG1lbnUgYWNjZWxlcmF0b3IKLSAgICAgICAgICovCi0gICAgICAgIE1lbnUgbWVudWJhciA9IGdldFNoZWxsKCkuZ2V0TWVudUJhcigpOwotICAgICAgICBpZiAobWVudWJhciAhPSBudWxsICYmICFtZW51YmFyLmlzRGlzcG9zZWQoKSAmJiBtZW51YmFyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBTaGVsbCBzaGVsbCA9IG1lbnViYXIuZ2V0U2hlbGwoKTsKLSAgICAgICAgICAgIGludCBod25kID0gc2hlbGwuaGFuZGxlOwotICAgICAgICAgICAgaW50IGhBY2NlbCA9IE9TLlNlbmRNZXNzYWdlKGh3bmQsIE9TLldNX0FQUCsxLCAwLCAwKTsKLSAgICAgICAgICAgIGlmIChoQWNjZWwgIT0gMCkgewotICAgICAgICAgICAgICAgIE1TRyBtc2cgPSBuZXcgTVNHKCk7Ci0gICAgICAgICAgICAgICAgT1MuTW92ZU1lbW9yeShtc2csIGxwTXNnLCBNU0cuc2l6ZW9mKTsKLSAgICAgICAgICAgICAgICBpZiAoT1MuVHJhbnNsYXRlQWNjZWxlcmF0b3IoaHduZCwgaEFjY2VsLCBtc2cpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTS5TX09LOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAgKiBCbG9jayBDdHJsK04gKE5ldyB3aW5kb3cpCi0gICAgICAgICAqLwotICAgICAgICBNU0cgbXNnID0gbmV3IE1TRygpOwotICAgICAgICBPUy5Nb3ZlTWVtb3J5KG1zZywgbHBNc2csIE1TRy5zaXplb2YpOwotICAgICAgICBpZiAobXNnLm1lc3NhZ2UgPT0gT1MuV01fS0VZRE9XTiAmJiBtc2cud1BhcmFtID09IE9TLlZLX04gJiYgT1MuR2V0S2V5U3RhdGUgKE9TLlZLX0NPTlRST0wpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIENPTS5TX09LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDT00uU19GQUxTRTsKLSAgICB9Ci0KLSAgICBpbnQgVHJhbnNsYXRlVXJsKGludCBkd1RyYW5zbGF0ZSwgaW50IHBjaFVSTEluLCBpbnQgcHBjaFVSTE91dCkgewotICAgICAgICByZXR1cm4gQ09NLkVfTk9USU1QTDsKLSAgICB9Ci0KLSAgICBpbnQgVXBkYXRlVUkoKSB7Ci0gICAgICAgIHJldHVybiBDT00uRV9OT1RJTVBMOwotICAgIH0KLQotICAgIC8qIElPbGVDb21tYW5kVGFyZ2V0ICovCi0gICAgaW50IFF1ZXJ5U3RhdHVzKGludCBwZ3VpZENtZEdyb3VwLCBpbnQgY0NtZHMsIGludCBwcmdDbWRzLCBpbnQgcENtZFRleHQpIHsKLSAgICAgICAgcmV0dXJuIENPTS5FX05PVFNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBpbnQgRXhlYyhpbnQgcGd1aWRDbWRHcm91cCwgaW50IG5DbWRJRCwgaW50IG5DbWRFeGVjT3B0LCBpbnQgcHZhSW4sIGludCBwdmFPdXQpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogRGlzYWJsZSBzY3JpcHQgZXJyb3IgZGlhbG9nLgotICAgICAgICAgKi8KLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInBndWlkQ21kR3JvdXA9IitwZ3VpZENtZEdyb3VwKyIsIG5DbWRJRD0iK25DbWRJRCsiLCBuQ21kRXhlY09wdD0iK25DbWRFeGVjT3B0KyIsIHB2YUluPSIrcHZhSW4rIiwgcHZhT3V0PSIrcHZhT3V0KTsKLSAgICAgICAgaWYgKHBndWlkQ21kR3JvdXAgIT0gMCAmJiBuQ21kSUQgPT0gT0xFQ01ESURfU0hPV1NDUklQVEVSUk9SKSB7Ci0gICAgICAgICAgICBib29sZWFuIGJEaXNhYmxlID0gKChXZWJCcm93c2VySUVDb21wb3NpdGUpKGdldFBhcmVudCgpLmdldFBhcmVudCgpKSkuYkRpc2FibGVTY3JpcHREZWJ1Z2dlcjsKLSAgICAgICAgICAgIGlmKCBiRGlzYWJsZSApIHsKLSAgICAgICAgICAgICAgICBHVUlEIGd1aWQgPSBuZXcgR1VJRCgpOwotICAgICAgICAgICAgICAgIENPTS5Nb3ZlTWVtb3J5KGd1aWQsIHBndWlkQ21kR3JvdXAsIEdVSUQuc2l6ZW9mKTsKLSAgICAgICAgICAgICAgICBpZiAoQ09NLklzRXF1YWxHVUlEKGd1aWQsIENPTS5DR0lEX0RvY0hvc3RDb21tYW5kSGFuZGxlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTS5TX09LOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ09NLkVfTk9UU1VQUE9SVEVEOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvV2ViQnJvd3NlcklFSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9XZWJCcm93c2VySUVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzN2RlNDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9XZWJCcm93c2VySUVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLkRvbUJ5Q29tOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmh0bWwuSFRNTFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20uaHRtbC5JSFRNTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLkJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5Ccm93c2VyRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLkRvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuSU5ld1dpb25kb3cyRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLklXaW5kb3dDbG9zZWRFdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuTmF2aWdhdGVFcnJvclBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5OZXdXaW5kb3cyUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLlByb2dyZXNzQ2hhbmdlUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLlN0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuVGl0bGVDaGFuZ2VQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuV2luZG93Q2xvc2luZ1BhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLndpbjMyLlJlZ2lzdHJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLklNb2RlbFNlcnZpY2VIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5JTW9kZWxTZXJ2aWNlU2Nyb2xsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLkltYWdlUG9zaXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuTW9kZWxTZXJ2aWNlU2l6ZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5JV2ViQnJvd3NlckFDVEY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5JV2ViQnJvd3NlclN0eWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5icm93c2VyLldlYkJyb3dzZXJFdmVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS51dGlsLlNjcm9sbEJhclNpemVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5sb2dnaW5nLkRlYnVnUHJpbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJJRUltcGwgaW1wbGVtZW50cyBJV2ViQnJvd3NlckFDVEYsIEJyb3dzZXJFdmVudExpc3RlbmVyIHsKLQotCXByaXZhdGUgV2ViQnJvd3NlclRvb2xiYXIgdG9vbGJhcjsKLQotCXByaXZhdGUgV2ViQnJvd3NlcklFQ29tcG9zaXRlIGJyb3dzZXJDb21wb3NpdGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gX2luTmF2aWdhdGlvbiA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIF9pblJlbG9hZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIF9pblN0b3AgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBfaW5KYXZhc2NyaXB0ID0gZmFsc2U7Ci0KLQkvLyBUT0RPIGJhY2ssZm9ydyxzdG9wLHJlcGxhY2UsZXRjLgotCXByaXZhdGUgYm9vbGVhbiBfdXJsRXhpc3Q7Ci0KLQlwcml2YXRlIGludCBfbmF2aWdhdGVFcnJvckNvZGU7Ci0KLQlwcml2YXRlIElNb2RlbFNlcnZpY2VIb2xkZXIgX2hvbGRlciA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gb25sb2FkUG9wdXBCbG9jayA9IHRydWU7Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gYWxsb3dOZXdXaW5kb3cgPSBmYWxzZTsKLQotCXByaXZhdGUgSU1vZGVsU2VydmljZVNjcm9sbE1hbmFnZXIgc2Nyb2xsTWFuYWdlcjsKLQotCXByaXZhdGUgRG9tQnlDb20gZG9tQnlDb207Ci0KLQlwcml2YXRlIElOZXdXaW9uZG93MkV2ZW50TGlzdGVuZXIgbmV3V2luZG93MkV2ZW50TGlzdGVuZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBJV2luZG93Q2xvc2VkRXZlbnRMaXN0ZW5lciB3aW5kb3dDbG9zZWRFdmVudExpc3RlbmVyID0gbnVsbDsKLQotCXB1YmxpYyBXZWJCcm93c2VySUVJbXBsKElNb2RlbFNlcnZpY2VIb2xkZXIgaG9sZGVyLCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHN0YXJ0VVJMKSB7Ci0JCXRoaXMuX2hvbGRlciA9IGhvbGRlcjsKLQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlwYXJlbnQuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCXRvb2xiYXIgPSBuZXcgV2ViQnJvd3NlclRvb2xiYXIodGhpcywgcGFyZW50LCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXJDb21wb3NpdGUgPSBuZXcgV2ViQnJvd3NlcklFQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJYnJvd3NlckNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnJvd3NlckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlpZiAobnVsbCA9PSBzdGFydFVSTCkgewotCQkJc3RhcnRVUkwgPSAiYWJvdXQ6YmxhbmsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdG9vbGJhci5zZXRBZGRyZXNzVGV4dFN0cmluZyhzdGFydFVSTCk7Ci0KLQkJYnJvd3NlckNvbXBvc2l0ZS5zZXREaXNhYmxlU2NyaXB0RGVidWdnZXIodHJ1ZSk7Ci0KLQkJYnJvd3NlckNvbXBvc2l0ZS5hZGRCcm93c2VyRXZlbnRMaXN0ZW5lcih0aGlzKTsKLQotCQlzY3JvbGxNYW5hZ2VyID0gbmV3IFdlYkJyb3dzZXJJRVNjcm9sbE1hbmFnZXIodGhpcyk7Ci0KLQkJZG9tQnlDb20gPSBuZXcgRG9tQnlDb20oZ2V0QnJvd3NlckFkZHJlc3MoKSk7Ci0KLQkJbmF2aWdhdGUoc3RhcnRVUkwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvY3VzQWRkcmVzc1RleHQoYm9vbGVhbiBzZWxlY3RBbGwpIHsKLQkJdG9vbGJhci5zZXRGb2N1c1RvQWRkcmVzc1RleHQoc2VsZWN0QWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaG93QWRkcmVzc1RleHQoYm9vbGVhbiBmbGFnKSB7Ci0JCXRvb2xiYXIuc2hvd0FkZHJlc3NUZXh0KGZsYWcpOwotCX0KLQotCS8qCi0JICogYnJvd3NlIGNvbW1hbmRzCi0JICovCi0KLQlwdWJsaWMgdm9pZCBuYXZpZ2F0ZShTdHJpbmcgdXJsKSB7Ci0KLQkJdG9vbGJhci5zZXRBZGRyZXNzVGV4dFN0cmluZyh1cmwpOwotCi0JCXRoaXMuX3VybEV4aXN0ID0gdHJ1ZTsKLQkJdGhpcy5fbmF2aWdhdGVFcnJvckNvZGUgPSAyMDA7Ci0KLQkJYnJvd3NlckNvbXBvc2l0ZS5uYXZpZ2F0ZSh1cmwpOwotCi0JCS8vIFRPRE8gZmlsZTovLyBjYXNlIChSZWFkeVN0YXRlID0gMSkKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZToiK2dldFJlYWR5U3RhdGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZ29CYWNrd2FyZCgpIHsKLQkJLy8gVE9ETyByZW5hbWU/Ci0JCWJyb3dzZXJDb21wb3NpdGUuZ29CYWNrKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZ29Gb3J3YXJkKCkgewotCQlicm93c2VyQ29tcG9zaXRlLmdvRm9yd2FyZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5hdmlnYXRlU3RvcCgpIHsKLQkJaWYgKF9pbk5hdmlnYXRpb24gfHwgX2luUmVsb2FkKSB7Ci0JCQlfaW5TdG9wID0gdHJ1ZTsKLQkJCV9pbk5hdmlnYXRpb24gPSBmYWxzZTsKLQkJCV9pblJlbG9hZCA9IGZhbHNlOwotCQkJX2luSmF2YXNjcmlwdCA9IGZhbHNlOwotCQl9Ci0JCWJyb3dzZXJDb21wb3NpdGUuc3RvcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5hdmlnYXRlUmVmcmVzaCgpIHsKLQkJaWYgKCFfaW5SZWxvYWQpIHsKLQkJCV9pblJlbG9hZCA9IHRydWU7Ci0JCQlfaW5KYXZhc2NyaXB0ID0gZmFsc2U7Ci0JCQlXZWJCcm93c2VyRXZlbnRVdGlsLnJlZnJlc2hTdGFydChXZWJCcm93c2VySUVJbXBsLnRoaXMpOwotCQl9Ci0JCWJyb3dzZXJDb21wb3NpdGUucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpc1dob2xlCi0JICogQHJldHVybiAoYnJvd3NlclNpemVYLCBicm93c2VyU2l6ZVksIHBhZ2VTaXplWCwgcGFnZVNpemVZKQotCSAqLwotCXB1YmxpYyBNb2RlbFNlcnZpY2VTaXplSW5mbyBnZXRCcm93c2VyU2l6ZShib29sZWFuIGlzV2hvbGUpIHsKLQkJaW50W10gc2l6ZSA9IG5ldyBpbnRbXSB7IDEsIDEsIDEsIDEgfTsKLQkJaW50IHdpZHRoID0gYnJvd3NlckNvbXBvc2l0ZS5nZXRXaWR0aCgpIC0gNDsKLQkJaW50IGhlaWdodCA9IGJyb3dzZXJDb21wb3NpdGUuZ2V0SGVpZ2h0KCkgLSA0OwotCQlpbnQgc2Nyb2xsYmFyV2lkdGggPSBTY3JvbGxCYXJTaXplVXRpbC5nZXRWZXJ0aWNhbEJhcldpZHRoKCk7Ci0JCXNpemVbMF0gPSB3aWR0aCAtIHNjcm9sbGJhcldpZHRoOwotCQlzaXplWzFdID0gaGVpZ2h0OwotCQlzaXplWzJdID0gd2lkdGggLSBzY3JvbGxiYXJXaWR0aDsKLQkJc2l6ZVszXSA9IGhlaWdodDsKLQkJaWYgKGlzV2hvbGUpIHsKLQkJCWludFtdIHRtcFNpemUgPSBicm93c2VyQ29tcG9zaXRlLmdldFdob2xlU2l6ZSgpOwotCQkJaWYgKHRtcFNpemUubGVuZ3RoID09IDIgJiYgdG1wU2l6ZVswXSA+IC0xICYmIHRtcFNpemVbMV0gPiAtMSkgewotCQkJCXNpemVbMl0gPSB0bXBTaXplWzBdOwotCQkJCXNpemVbM10gPSB0bXBTaXplWzFdOwotCQkJCWlmICh0bXBTaXplWzBdID4gc2l6ZVswXSkgewotCQkJCQlzaXplWzFdIC09IHNjcm9sbGJhcldpZHRoOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAobmV3IE1vZGVsU2VydmljZVNpemVJbmZvKHNpemVbMF0sIHNpemVbMV0sIHNpemVbMl0sIHNpemVbM10pKTsKLQl9Ci0KLQkvKgotCSAqIG5hdmlnYXRpb24gcmVzdWx0Ci0JICovCi0KLQlwdWJsaWMgaW50IGdldFJlYWR5U3RhdGUoKSB7Ci0JCXJldHVybiBicm93c2VyQ29tcG9zaXRlLmdldFJlYWR5U3RhdGUoKTsKLQl9Ci0KLQkvLyBUT0RPIGFkZCB0byBJV2ViQnJvd3NlciBJbnRlcmZhY2UKLQkvLyBCcm93c2VyIHByb3BlcnRpZXMKLQkvLyAiV2lkdGgiCi0JLy8gIkhlaWdodCIKLQkvLyAiTGVmdCIKLQkvLyAiVG9wIgotCS8vICJCcm93c2VyVHlwZSIKLQkvLyAiU2lsZW50IgotCS8vICJzZXRTaWxlbnQiCi0KLQkvLyBUT0RPIHJlbW92ZT8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWR5KCkgewotCQlyZXR1cm4gKGdldFJlYWR5U3RhdGUoKSA9PSBSRUFEWVNUQVRFX0NPTVBMRVRFKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLQkJcmV0dXJuIGJyb3dzZXJDb21wb3NpdGUuZ2V0TG9jYXRpb25VUkwoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIGJyb3dzZXJDb21wb3NpdGUuZ2V0TG9jYXRpb25OYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVcmxFeGlzdHMoKSB7Ci0JCS8vIFRPRE8KLQkJcmV0dXJuIHRoaXMuX3VybEV4aXN0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmF2aWdhdGVFcnJvckNvZGUoKSB7Ci0JCS8vIFRPRE8KLQkJcmV0dXJuIHRoaXMuX25hdmlnYXRlRXJyb3JDb2RlOwotCX0KLQotCS8qCi0JICogU2Nyb2xsCi0JICovCi0KLQlwdWJsaWMgSU1vZGVsU2VydmljZVNjcm9sbE1hbmFnZXIgZ2V0U2Nyb2xsTWFuYWdlcigpIHsKLQkJcmV0dXJuIHNjcm9sbE1hbmFnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2Nyb2xsWShpbnQgeSkgewotCQlicm93c2VyQ29tcG9zaXRlLnNjcm9sbCgwLCB5LCBXZWJCcm93c2VySUVDb21wb3NpdGUuU0NST0xMX0JZKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzY3JvbGxUbyhpbnQgeCwgaW50IHkpIHsKLQkJYnJvd3NlckNvbXBvc2l0ZS5zY3JvbGwoeCwgeSwgV2ViQnJvd3NlcklFQ29tcG9zaXRlLlNDUk9MTF9UTyk7Ci0JfQotCi0JLyoKLQkgKiBicm93c2VyIHNldHRpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIbGlua1N0b3AoYm9vbGVhbiBiU3RvcCkgewotCQkvLyBUT0RPIGxvdyBwcmlvcml0eQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdlYkJyb3dzZXJTaWxlbnQoYm9vbGVhbiBiU2lsZW50KSB7Ci0JCWJyb3dzZXJDb21wb3NpdGUuc2V0U2lsZW50KGJTaWxlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpc2FibGVTY3JpcHREZWJ1Z2dlcihib29sZWFuIGJEaXNhYmxlKSB7Ci0JCWJyb3dzZXJDb21wb3NpdGUuc2V0RGlzYWJsZVNjcmlwdERlYnVnZ2VyKGJEaXNhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5SW1hZ2UoYm9vbGVhbiBkaXNwbGF5KSB7Ci0JCS8vIFRPRE8KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2FibGVTY3JpcHREZWJ1Z2dlcigpIHsKLQkJcmV0dXJuIGJyb3dzZXJDb21wb3NpdGUuZ2V0RGlzYWJsZVNjcmlwdERlYnVnZ2VyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9udFNpemUoaW50IGZvbnRTaXplKSB7Ci0JCWJyb3dzZXJDb21wb3NpdGUuc2V0Rm9udFNpemUoZm9udFNpemUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Rm9udFNpemUoKSB7Ci0JCXJldHVybiBicm93c2VyQ29tcG9zaXRlLmdldEZvbnRTaXplKCk7Ci0JfQotCi0JLyoKLQkgKiBoaWdobGlnaHQKLQkgKi8KLQotCXB1YmxpYyB2b2lkIGhpZ2hsaWdodEVsZW1lbnRCeUlkKFN0cmluZyBpZFZhbCkgewotCQkvLyBUT0RPIGxvdyBwcmlvcml0eQotCX0KLQotCXB1YmxpYyB2b2lkIGhpZ2h0bGlnaHRFbGVtZW50QnlBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQkvLyBUT0RPIGxvdyBwcmlvcml0eQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFySGlnaGxpZ2h0KCkgewotCQkvLyBUT0RPIGxvdyBwcmlvcml0eQotCX0KLQotCVJHQiBnZXRBbmNob3JDb2xvcigpIHsKLQkJU3RyaW5nIGNvbG9yID0gUmVnaXN0cnlVdGlsCi0JCQkJLmdldElFUmVnaXN0cnlTdHJpbmcoUmVnaXN0cnlVdGlsLklFX0FOQ0hPUl9DT0xPUik7Ci0JCXJldHVybiBnZXRSR0IoY29sb3IpOwotCX0KLQotCVJHQiBnZXRWaXNpdGVkQW5jaG9yQ29sb3IoKSB7Ci0JCVN0cmluZyBjb2xvciA9IFJlZ2lzdHJ5VXRpbAotCQkJCS5nZXRJRVJlZ2lzdHJ5U3RyaW5nKFJlZ2lzdHJ5VXRpbC5JRV9BTkNIT1JfQ09MT1JfVklTSVRFRCk7Ci0JCXJldHVybiBnZXRSR0IoY29sb3IpOwotCX0KLQotCXByaXZhdGUgUkdCIGdldFJHQihTdHJpbmcgY29sb3IpIHsKLQkJaWYgKG51bGwgIT0gY29sb3IpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nW10gc3RyQXJyYXkgPSBjb2xvci5zcGxpdCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBSR0IoSW50ZWdlci5wYXJzZUludChzdHJBcnJheVswXSksIEludGVnZXIKLQkJCQkJCS5wYXJzZUludChzdHJBcnJheVsxXSksIEludGVnZXIucGFyc2VJbnQoc3RyQXJyYXlbMl0pKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRCcm93c2VyQWRkcmVzcygpIHsKLQkJcmV0dXJuIGJyb3dzZXJDb21wb3NpdGUuZ2V0QnJvd3NlckFkZHJlc3MoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydE1JTUVUeXBlcygpIHsKLQkJcmV0dXJuIE1JTUVUWVBFU19IVE1MOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0RXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIEVYVFNfSFRNTDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKFN0cmluZyB1cmwpIHsKLQkJbmF2aWdhdGUodXJsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKEZpbGUgdGFyZ2V0KSB7Ci0JCWlmIChudWxsICE9IHRhcmdldCkgewotCQkJLy8gVE9ETyB0ZXN0Ci0JCQluYXZpZ2F0ZSh0YXJnZXQuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQl0cnkgewotCQkJRmlsZSB0bXBGID0gQnJvd3NlcklFX1BsdWdpbi5nZXREZWZhdWx0KCkuY3JlYXRlVGVtcEZpbGUoImFjdGYiLAotCQkJCQkiaHRtbCIpOwotCQkJc2F2ZU9yaWdpbmFsRG9jdW1lbnQodG1wRi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlJSFRNTFBhcnNlciBwYXJzZXIgPSBIVE1MUGFyc2VyRmFjdG9yeS5jcmVhdGVIVE1MUGFyc2VyKCk7Ci0JCQlwYXJzZXIucGFyc2UobmV3IEZpbGVJbnB1dFN0cmVhbSh0bXBGKSk7Ci0JCQlyZXR1cm4gcGFyc2VyLmdldERvY3VtZW50KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBEb2N1bWVudCBnZXRMaXZlRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBkb21CeUNvbS5nZXREb2N1bWVudCgpOwotCX0KLQotCXB1YmxpYyBDb21wb3NpdGUgZ2V0VGFyZ2V0Q29tcG9zaXRlKCkgewotCQlyZXR1cm4gYnJvd3NlckNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBzYXZlRG9jdW1lbnRBc0hUTUxGaWxlKFN0cmluZyBmaWxlKSB7Ci0JCWlmIChudWxsICE9IGZpbGUpIHsKLQkJCS8vIFRPRE8gcmVwbGFjZSB3aXRoIERvbUJ5Q09NIChuZWVkIHdyaXRlIGFzIFhNTCBzdXBwb3J0KQotCQkJYm9vbGVhbiBzYXZlTGl2ZURPTSA9IChicm93c2VyQ29tcG9zaXRlLnNhdmVMaXZlRG9tKGZpbGUpKTsKLQkJCWlmICghc2F2ZUxpdmVET00pIHsKLQkJCQlyZXR1cm4gbmV3IEZpbGUoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEZpbGUgc2F2ZU9yaWdpbmFsRG9jdW1lbnQoU3RyaW5nIGZpbGUpIHsKLQkJaWYgKG51bGwgIT0gZmlsZSkgewotCQkJYm9vbGVhbiBzYXZlT3JpZ0h0bWxTb3VyY2UgPSAoYnJvd3NlckNvbXBvc2l0ZS5zYXZlKGZpbGUpKTsKLQkJCWlmICghc2F2ZU9yaWdIdG1sU291cmNlKSB7Ci0JCQkJcmV0dXJuIG5ldyBGaWxlKGZpbGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGp1bXBUb05vZGUoTm9kZSB0YXJnZXQpIHsKLQkJLy8gVE9ETyBpbXBsIGZvciBSdW50aW1lIERvbQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudE1JTUVUeXBlKCkgewotCQkvLyBUT0RPIGdldCBpbmZvIGZyb20gYnJvd3NlcgotCQlyZXR1cm4gTUlNRVRZUEVTX0hUTUxbMF07Ci0JfQotCi0JLyoKLQkgKiBCcm93c2VyRXZlbnRMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbnMKLQkgKi8KLQotCXB1YmxpYyB2b2lkIGJlZm9yZU5hdmlnYXRlMihCZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzIHBhcmFtKSB7Ci0JCS8vIF9pbk5hdmlnYXRpb24gPSB0cnVlOwotCQlTdHJpbmcgdGFyZ2V0ID0gcGFyYW0uZ2V0VXJsKCk7Ci0JCURlYnVnUHJpbnRVdGlsLmRlYnVnUHJpbnRsbigiQk46ICIgKyB0YXJnZXQgKyAiICIKLQkJCQkrIHBhcmFtLmdldFRhcmdldEZyYW1lTmFtZSgpKTsKLQkJaWYgKCFfaW5SZWxvYWQpIHsKLQkJCWlmICghdGFyZ2V0LnN0YXJ0c1dpdGgoImphdmFzY3JpcHQiKSkgeyAvLyBUT0RPIC8vJE5PTi1OTFMtMSQKLQkJCQlfaW5KYXZhc2NyaXB0ID0gZmFsc2U7Ci0JCQkJX2luTmF2aWdhdGlvbiA9IHRydWU7Ci0JCQkJX2luUmVsb2FkID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCV9pbkphdmFzY3JpcHQgPSB0cnVlOwotCQkJCV9pbk5hdmlnYXRpb24gPSBmYWxzZTsKLQkJCQlfaW5SZWxvYWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlXZWJCcm93c2VyRXZlbnRVdGlsLmJlZm9yZU5hdmlnYXRlKHRoaXMsIHRhcmdldCwgcGFyYW0KLQkJCQkuZ2V0VGFyZ2V0RnJhbWVOYW1lKCksIF9pbk5hdmlnYXRpb24pOwotCi0JfQotCi0JcHVibGljIHZvaWQgZG9jdW1lbnRDb21wbGV0ZShEb2N1bWVudENvbXBsZXRlUGFyYW1ldGVycyBwYXJhbSkgewotCQlpZiAocGFyYW0uaXNUb3BXaW5kb3coKSkgewotCQkJV2ViQnJvd3NlckV2ZW50VXRpbC5yb290RG9jdW1lbnRDb21wbGV0ZSh0aGlzKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibXlEb2NDb21wbGV0ZSIpOwotCQkJX2luTmF2aWdhdGlvbiA9IGZhbHNlOwotCQkJX2luSmF2YXNjcmlwdCA9IGZhbHNlOwotCQkJX2luUmVsb2FkID0gZmFsc2U7Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudCBDb21wbGV0ZToiK3BhcmFtLmdldFVybCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5hdmlnYXRlQ29tcGxldGUyKE5hdmlnYXRlQ29tcGxldGUyUGFyYW1ldGVycyBwYXJhbSkgewotCQlXZWJCcm93c2VyRXZlbnRVdGlsLm5hdmlnYXRlQ29tcGxldGUodGhpcywgcGFyYW0uZ2V0VXJsKCkpOwotCQl0b29sYmFyCi0JCQkJLnNldEFkZHJlc3NUZXh0U3RyaW5nKGJyb3dzZXJDb21wb3NpdGUuZ2V0TG9jYXRpb25VUkwoKS8qIHBhcmFtLmdldFVybCgpICovKTsKLQkJRGVidWdQcmludFV0aWwuZGVidWdQcmludGxuKCJOYXZpZ2F0ZUNvbXBsZXRlMiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5hdmlnYXRlRXJyb3IoTmF2aWdhdGVFcnJvclBhcmFtZXRlcnMgcGFyYW0pIHsKLQkJRGVidWdQcmludFV0aWwuZGVidWdQcmludGxuKCJOYXZpZ2F0ZSBFcnJvci4gVVJMOiIgKyBwYXJhbS5nZXRVcmwoKQotCQkJCSsgIiBTdGF0dXMgQ29kZToiICsgcGFyYW0uZ2V0U3RhdHVzQ29kZSgpKTsKLQotCQlfbmF2aWdhdGVFcnJvckNvZGUgPSBwYXJhbS5nZXRTdGF0dXNDb2RlKCk7Ci0JCV91cmxFeGlzdCA9IGZhbHNlOwotCQlfaW5OYXZpZ2F0aW9uID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3V2luZG93MihOZXdXaW5kb3cyUGFyYW1ldGVycyBwYXJhbSkgewotCQlpZiAoX2luTmF2aWdhdGlvbiAmJiBvbmxvYWRQb3B1cEJsb2NrLyogIWJyb3dzZXIyLlJFQURZU1RBVEVfQ09NUExFVEUgKi8pIHsKLQkJCS8vIFRPRE8KLQkJCXBhcmFtLnNldENhbmNlbCh0cnVlKTsKLQkJfSBlbHNlIGlmIChuZXdXaW5kb3cyRXZlbnRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQluZXdXaW5kb3cyRXZlbnRMaXN0ZW5lci5uZXdXaW5kb3cyKHBhcmFtKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByb2dyZXNzQ2hhbmdlKFByb2dyZXNzQ2hhbmdlUGFyYW1ldGVycyBwYXJhbSkgewotCQlpbnQgcHJvZyA9IHBhcmFtLmdldFByb2dyZXNzKCk7Ci0JCWludCBwcm9nTWF4ID0gcGFyYW0uZ2V0UHJvZ3Jlc3NNYXgoKTsKLQkJV2ViQnJvd3NlckV2ZW50VXRpbC5wcm9ncmVzc0NoYW5nZSh0aGlzLCBwcm9nLCBwcm9nTWF4KTsKLQkJRGVidWdQcmludFV0aWwuZGVidWdQcmludGxuKCJTdG9wOiAiICsgX2luU3RvcCArICIgUmVsb2FkOiAiCi0JCQkJKyBfaW5SZWxvYWQgKyAiIGluSmF2YVNjcmlwdDogIiArIF9pbkphdmFzY3JpcHQKLQkJCQkrICIgbmF2aWdhdGlvbjogIiArIF9pbk5hdmlnYXRpb24pOwotCQlpZiAoX2luU3RvcCkgewotCQkJaWYgKHByb2cgPT0gMCAmJiBwcm9nTWF4ID09IDApIHsKLQkJCQlfaW5TdG9wID0gZmFsc2U7Ci0JCQkJRGVidWdQcmludFV0aWwuZGVidWdQcmludGxuKCJzdG9wIGZpbiIpOwotCQkJCVdlYkJyb3dzZXJFdmVudFV0aWwubmF2aWdhdGVTdG9wKHRoaXMpOwotCQkJfQotCQl9IGVsc2UgaWYgKF9pblJlbG9hZCkgewotCQkJaWYgKHByb2cgPT0gMCAmJiBwcm9nTWF4ID09IDApIHsKLQkJCQlfaW5SZWxvYWQgPSBmYWxzZTsKLQkJCQlEZWJ1Z1ByaW50VXRpbC5kZWJ1Z1ByaW50bG4oInJlbG9hZCBmaW4iKTsKLQkJCQlXZWJCcm93c2VyRXZlbnRVdGlsLnJlZnJlc2hDb21wbGV0ZSh0aGlzKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChfaW5KYXZhc2NyaXB0KSB7Ci0JCQlpZiAocHJvZyA9PSAtMSAmJiBwcm9nTWF4ID09IC0xKSB7Ci0JCQkJX2luSmF2YXNjcmlwdCA9IGZhbHNlOwotCQkJCURlYnVnUHJpbnRVdGlsLmRlYnVnUHJpbnRsbigiamF2YXNjcmlwdCBmaW4iKTsKLQkJCX0KLQkJfSBlbHNlIGlmICghX2luTmF2aWdhdGlvbiAmJiAhKHByb2cgPT0gMCAmJiBwcm9nTWF4ID09IDApKSB7Ci0JCQkvLyAwLzAgaXMgY29tcGxldGUKLQkJCV9pblJlbG9hZCA9IHRydWU7Ci0JCQlEZWJ1Z1ByaW50VXRpbC5kZWJ1Z1ByaW50bG4oInJlbG9hZCIpOwotCQkJV2ViQnJvd3NlckV2ZW50VXRpbC5yZWZyZXNoU3RhcnQodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGF0dXNUZXh0Q2hhbmdlKFN0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzIHBhcmFtKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihwYXJhbS5nZXRUZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRpdGxlQ2hhbmdlKFRpdGxlQ2hhbmdlUGFyYW1ldGVycyBwYXJhbSkgewotCQl0cnkgewotCQkJU3RyaW5nIHRpdGxlID0gcGFyYW0uZ2V0VGV4dCgpOwotCQkJV2ViQnJvd3NlckV2ZW50VXRpbC50aXRsZUNoYW5nZSh0aGlzLCB0aXRsZSk7Ci0JCQlEZWJ1Z1ByaW50VXRpbC5kZWJ1Z1ByaW50bG4oIlRpdGxlQ2hhbmdlIik7Ci0JCQlpZiAoIShfaW5OYXZpZ2F0aW9uIHx8IF9pblN0b3ApKSB7Ci0JCQkJaWYgKCFfaW5SZWxvYWQpIHsKLQkJCQkJX2luUmVsb2FkID0gdHJ1ZTsKLQkJCQkJX2luSmF2YXNjcmlwdCA9IGZhbHNlOwotCQkJCQlEZWJ1Z1ByaW50VXRpbC5kZWJ1Z1ByaW50bG4oInJlbG9hZCIpOwotCQkJCQlXZWJCcm93c2VyRXZlbnRVdGlsLnJlZnJlc2hTdGFydCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlfaG9sZGVyLnNldEVkaXRvclRpdGxlKHRpdGxlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzIHBhcmFtKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2luZG93Q2xvc2VkKCkgewotCQlpZiAod2luZG93Q2xvc2VkRXZlbnRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQl3aW5kb3dDbG9zZWRFdmVudExpc3RlbmVyLndpbmRvd0Nsb3NlZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gV2ViQnJvd3NlcklFSW1wbC5jbGFzcy5nZXROYW1lKCkgKyAiOiIgKyB0aGlzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBnZXRMb2NhdGlvbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdXaW5kb3cyRXZlbnRMaXN0ZW5lcigKLQkJCUlOZXdXaW9uZG93MkV2ZW50TGlzdGVuZXIgbmV3V2luZG93MkV2ZW50TGlzdG5lcikgewotCQl0aGlzLm5ld1dpbmRvdzJFdmVudExpc3RlbmVyID0gbmV3V2luZG93MkV2ZW50TGlzdG5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXaW5kb3dDbG9zZWRFdmVudExpc3RlbmVyKAotCQkJSVdpbmRvd0Nsb3NlZEV2ZW50TGlzdGVuZXIgd2luZG93Q2xvc2luZ0V2ZW50TGlzdGVuZXIpIHsKLQkJdGhpcy53aW5kb3dDbG9zZWRFdmVudExpc3RlbmVyID0gd2luZG93Q2xvc2luZ0V2ZW50TGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIEltYWdlUG9zaXRpb25JbmZvW10gZ2V0QWxsSW1hZ2VQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGJyb3dzZXJDb21wb3NpdGUuZ2V0QWxsSW1hZ2VQb3NpdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5JTW9kZWxTZXJ2aWNlI2dldE1vZGVsU2VydmljZUhvbGRlcigpCi0JICovCi0JcHVibGljIElNb2RlbFNlcnZpY2VIb2xkZXIgZ2V0TW9kZWxTZXJ2aWNlSG9sZGVyKCkgewotCQlyZXR1cm4gX2hvbGRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSVdlYkJyb3dzZXJBQ1RGI2dldFN0eWxlSW5mbygpCi0JICovCi0JcHVibGljIElXZWJCcm93c2VyU3R5bGVJbmZvIGdldFN0eWxlSW5mbygpIHsKLQkJLy8gVE9ETyBvYnRhaW4gY3VycmVudCBzdHlsZSBpbmZvIGZyb20gbGl2ZSBET00gWzIzMzYxNV0KLQkJLy8gbmVlZCB0byB3YWl0IElQWmlsbGEgWzIzMjNdCi0JCXJldHVybiBuZXcgV2ViQnJvd3NlclN0eWxlSW5mb0ltcGwodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL1dlYkJyb3dzZXJJRVNjcm9sbE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvV2ViQnJvd3NlcklFU2Nyb2xsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjNmZjFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvV2ViQnJvd3NlcklFU2Nyb2xsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuSU1vZGVsU2VydmljZVNjcm9sbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5Nb2RlbFNlcnZpY2VTaXplSW5mbzsKLQotCi0KLXB1YmxpYyBjbGFzcyBXZWJCcm93c2VySUVTY3JvbGxNYW5hZ2VyIGltcGxlbWVudHMgSU1vZGVsU2VydmljZVNjcm9sbE1hbmFnZXIgewotCi0gICAgV2ViQnJvd3NlcklFSW1wbCBicm93c2VySUU7Ci0KLSAgICBwdWJsaWMgV2ViQnJvd3NlcklFU2Nyb2xsTWFuYWdlcihXZWJCcm93c2VySUVJbXBsIGJyb3dzZXJJRSkgewotICAgICAgICB0aGlzLmJyb3dzZXJJRSA9IGJyb3dzZXJJRTsKLSAgICB9Ci0gICAgCi0gICAgLy9kbyBub3QgaGF2ZSB0byB3YWl0IHJlbmRlcmluZyAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhYnNvbHV0ZUNvb3JkaW5hdGVTY3JvbGwoaW50IHksIGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotICAgICAgICBicm93c2VySUUuc2Nyb2xsWSh5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhYnNvbHV0ZUNvb3JkaW5hdGVTY3JvbGwoaW50IHgsIGludCB5LCBib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgYnJvd3NlcklFLnNjcm9sbFRvKHgsIHkpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZGVjcmVtZW50U2Nyb2xsWChib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZGVjcmVtZW50U2Nyb2xsWShib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW5jcmVtZW50U2Nyb2xsWChib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW5jcmVtZW50U2Nyb2xsWShib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZGVjcmVtZW50TGFyZ2VTY3JvbGxYKGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBkZWNyZW1lbnRMYXJnZVNjcm9sbFkoYm9vbGVhbiB3YWl0UmVuZGVyaW5nKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGluY3JlbWVudExhcmdlU2Nyb2xsWChib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW5jcmVtZW50TGFyZ2VTY3JvbGxZKGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBkZWNyZW1lbnRQYWdlU2Nyb2xsKGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBpbmNyZW1lbnRQYWdlU2Nyb2xsKGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSAgICAgICAgICAgIAotICAgIAotICAgIHB1YmxpYyBpbnQganVtcFRvUGFnZShpbnQgcGFnZU51bWJlciwgYm9vbGVhbiB3YWl0UmVuZGVyaW5nKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRQYWdlTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMYXN0UGFnZU51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFNjcm9sbFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBQlNPTFVURV9DT09SRElOQVRFOwotICAgIH0KLQotICAgIHB1YmxpYyBNb2RlbFNlcnZpY2VTaXplSW5mbyBnZXRTaXplKGJvb2xlYW4gaXNXaG9sZSkgewotICAgICAgICByZXR1cm4gYnJvd3NlcklFLmdldEJyb3dzZXJTaXplKGlzV2hvbGUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9XZWJCcm93c2VyU3R5bGVJbmZvSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9XZWJCcm93c2VyU3R5bGVJbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmEwYzFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvV2ViQnJvd3NlclN0eWxlSW5mb0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLmRvbWJ5Y29tLklFbGVtZW50RXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5Nb2RlbFNlcnZpY2VTaXplSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5icm93c2VyLklDdXJyZW50U3R5bGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSVdlYkJyb3dzZXJTdHlsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmRvbS5UcmVlV2Fsa2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBXZWJCcm93c2VyU3R5bGVJbmZvSW1wbCBpbXBsZW1lbnRzIElXZWJCcm93c2VyU3R5bGVJbmZvIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0hFQUQgPSAiSEVBRCI7Ci0JcHJpdmF0ZSBmaW5hbCBXZWJCcm93c2VySUVJbXBsIGJyb3dzZXI7Ci0KLQlwdWJsaWMgV2ViQnJvd3NlclN0eWxlSW5mb0ltcGwoV2ViQnJvd3NlcklFSW1wbCBicm93c2VyKSB7Ci0JCXRoaXMuYnJvd3NlciA9IGJyb3dzZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5icm93c2VyLklXZWJCcm93c2VyU3R5bGVJbmZvI2dldEN1cnJlbnRTdHlsZXMoKQotCSAqLwotCXB1YmxpYyBIYXNoTWFwPFN0cmluZywgSUN1cnJlbnRTdHlsZXM+IGdldEN1cnJlbnRTdHlsZXMoKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBJQ3VycmVudFN0eWxlcz4gY3VycmVudFN0eWxlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSUN1cnJlbnRTdHlsZXM+KAotCQkJCTUxMik7Ci0JCURvY3VtZW50IGRvYyA9IGJyb3dzZXIuZ2V0TGl2ZURvY3VtZW50KCk7Ci0JCVRyZWVXYWxrZXJJbXBsIHRyZWVXYWxrZXIgPSBuZXcgVHJlZVdhbGtlckltcGwoZG9jLAotCQkJCU5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULCBuZXcgTm9kZUZpbHRlcigpIHsKLQotCQkJCQlwdWJsaWMgc2hvcnQgYWNjZXB0Tm9kZShOb2RlIGFyZzApIHsKLQkJCQkJCWlmIChUQUdfSEVBRC5lcXVhbHNJZ25vcmVDYXNlKGFyZzAuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJCQlyZXR1cm4gRklMVEVSX1JFSkVDVDsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBGSUxURVJfQUNDRVBUOwotCQkJCQl9Ci0JCQkJfSwgZmFsc2UpOwotCQlOb2RlIHRtcE4gPSB0cmVlV2Fsa2VyLm5leHROb2RlKCk7Ci0JCVVSTCBiYXNlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJhc2UgPSBuZXcgVVJMKGJyb3dzZXIuZ2V0VVJMKCkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQl3aGlsZSAodG1wTiAhPSBudWxsKSB7Ci0JCQlpZiAodG1wTiBpbnN0YW5jZW9mIElFbGVtZW50RXgpIHsKLQkJCQlJQ3VycmVudFN0eWxlcyBjdXJTdHlsZSA9IG5ldyBDdXJyZW50U3R5bGVzSW1wbCgKLQkJCQkJCShJRWxlbWVudEV4KSB0bXBOLCBiYXNlKTsKLQkJCQljdXJyZW50U3R5bGVzLnB1dChjdXJTdHlsZS5nZXRYUGF0aCgpLCBjdXJTdHlsZSk7Ci0JCQl9Ci0JCQl0bXBOID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGN1cnJlbnRTdHlsZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5icm93c2VyLklXZWJCcm93c2VyU3R5bGVJbmZvI2dldFVudmlzaXRlZExpbmtDb2xvcigpCi0JICovCi0JcHVibGljIFJHQiBnZXRVbnZpc2l0ZWRMaW5rQ29sb3IoKSB7Ci0JCXJldHVybiBicm93c2VyLmdldEFuY2hvckNvbG9yKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5icm93c2VyLklXZWJCcm93c2VyU3R5bGVJbmZvI2dldFZpc2l0ZWRMaW5rQ29sb3IoKQotCSAqLwotCXB1YmxpYyBSR0IgZ2V0VmlzaXRlZExpbmtDb2xvcigpIHsKLQkJcmV0dXJuIGJyb3dzZXIuZ2V0VmlzaXRlZEFuY2hvckNvbG9yKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5icm93c2VyLklXZWJCcm93c2VyU3R5bGVJbmZvI2dldFNpemVJbmZvKCkKLQkgKi8KLQlwdWJsaWMgTW9kZWxTZXJ2aWNlU2l6ZUluZm8gZ2V0U2l6ZUluZm8oYm9vbGVhbiBpc1dob2xlKSB7Ci0JCXJldHVybiBicm93c2VyLmdldEJyb3dzZXJTaXplKGlzV2hvbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvV2ViQnJvd3NlclRvb2xiYXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvV2ViQnJvd3NlclRvb2xiYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhN2M5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL1dlYkJyb3dzZXJUb29sYmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSVdlYkJyb3dzZXJBQ1RGOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuV2ViQnJvd3NlckV2ZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLnV0aWwuTW9kZWxTZXJ2aWNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJUb29sYmFyIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCS8vIFRPRE8gbW92ZSB0byBiYXNlIHBsdWdpbgotCi0JcHJpdmF0ZSBUZXh0IF9hZGRyZXNzVGV4dDsKLQotCXByaXZhdGUgYm9vbGVhbiBfaXNGb2N1c09uVGV4dDsKLQotCXByaXZhdGUgSVdlYkJyb3dzZXJBQ1RGIGJyb3dzZXI7Ci0KLQlwdWJsaWMgV2ViQnJvd3NlclRvb2xiYXIoSVdlYkJyb3dzZXJBQ1RGIGJyb3dzZXIsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0KLQkJdGhpcy5icm93c2VyID0gYnJvd3NlcjsKLQotCQlzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMTsKLQkJZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlncmlkTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCWluaXRMYXlvdXQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdExheW91dCgpIHsKLQkJTGFiZWwgYWRkcmVzc0xhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJYWRkcmVzc0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlhZGRyZXNzTGFiZWwKLQkJCQkuc2V0VGV4dCgiICIgKyBNb2RlbFNlcnZpY2VNZXNzYWdlcy5nZXRTdHJpbmcoIldlYkJyb3dzZXIuQWRkcmVzcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFkZHJlc3NMYWJlbC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgYXJnMCkgewotCQkJCWlmIChhcmcwLnN0YXRlTWFzayA9PSBTV1QuQUxUCi0JCQkJCQkmJiAoYXJnMC5jaGFyYWN0ZXIgPT0gJ2QnIHx8IGFyZzAuY2hhcmFjdGVyID09ICdEJykpIHsKLQkJCQkJX2FkZHJlc3NUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCV9hZGRyZXNzVGV4dC5zZWxlY3RBbGwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXRoaXMuX2FkZHJlc3NUZXh0ID0gbmV3IFRleHQodGhpcywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDEwMjQ7Ci0JCV9hZGRyZXNzVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdGhpcy5fYWRkcmVzc1RleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgYXJnMCkgewotCQkJCV9pc0ZvY3VzT25UZXh0ID0gZmFsc2U7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlXZWJCcm93c2VyRXZlbnRVdGlsLmZvY3VzTG9zdE9mQWRkcmVzc1RleHQoYnJvd3Nlcik7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGFyZzApIHsKLQkJCQlfYWRkcmVzc1RleHQuc2VsZWN0QWxsKCk7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlXZWJCcm93c2VyRXZlbnRVdGlsLmZvY3VzR2FpbmVkT2ZBZGRyZXNzVGV4dChicm93c2VyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXRoaXMuX2FkZHJlc3NUZXh0LmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBhcmcwKSB7Ci0JCQkJaWYgKCFfaXNGb2N1c09uVGV4dCkgewotCQkJCQlfYWRkcmVzc1RleHQuc2VsZWN0QWxsKCk7Ci0JCQkJCV9pc0ZvY3VzT25UZXh0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCQkJX2FkZHJlc3NUZXh0LnNlbGVjdEFsbCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBUT0RPIHVzZSBhY3Rpb24KLQotCQl0aGlzLl9hZGRyZXNzVGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkNSKSB7Ci0JCQkJCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkJCWJyb3dzZXIub3BlbihfYWRkcmVzc1RleHQuZ2V0VGV4dCgpKTsKLQkJCQkJCS8vIFRPRE86IFJlbWFpbmluZyB0aGUgZm9jdXMgb24gdGhlIGFkZHJlc3MgZmllbGQgY2F1c2VzCi0JCQkJCQkvLyBuYXZpZ2F0aW9uIHByb2JsZW0gb24gYWlCcm93c2VyCi0JCQkJCQkvLyBBcyBhIG1ha2VzaGlmdCwgd2UgbW92ZSB0aGUgZm9jdXMgdG8gdGhlIHRvb2xiYXIKLQkJCQkJCS8vIHBhcmVudCBidXQgd2Ugc2hvdWxkIHJlY29uc2lkZXIKLQkJCQkJCS8vIHRoaXMgdHJlYXRtZW50LgotCQkJCQkJV2ViQnJvd3NlclRvb2xiYXIudGhpcy5mb3JjZUZvY3VzKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJQnV0dG9uIHNlYXJjaEJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcywgU1dULk5VTEwpOwotCQlzZWFyY2hCdXR0b24uc2V0TGF5b3V0RGF0YShnZXRCdXR0b25zR3JpZERhdGEoKSk7Ci0JCXNlYXJjaEJ1dHRvbi5zZXRUZXh0KE1vZGVsU2VydmljZU1lc3NhZ2VzLmdldFN0cmluZygiV2ViQnJvd3Nlci5HbyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZWFyY2hCdXR0b24uc2V0VG9vbFRpcFRleHQoTW9kZWxTZXJ2aWNlTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJXZWJCcm93c2VyLkdvX3RwIikpOyAvLyROT04tTkxTLTEkCi0JCS8vIFRPRE8KLQkJc2VhcmNoQnV0dG9uLnNldEltYWdlKEJyb3dzZXJJRV9QbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKLQkJCQkib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aSIsICJpY29ucy9icm93c2VyL2dvLnBuZyIpCi0JCQkJLmNyZWF0ZUltYWdlKCkpOwotCQlzZWFyY2hCdXR0b24uYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIub3BlbihfYWRkcmVzc1RleHQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkvLyBfY29tcG9zaXRlUGFyZW50LmdldFNoZWxsKCkuc2V0RGVmYXVsdEJ1dHRvbihzZWFyY2hCdXR0b24pOwotCX0KLQotCXByaXZhdGUgR3JpZERhdGEgZ2V0QnV0dG9uc0dyaWREYXRhKCkgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMzI7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDMyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVI7Ci0KLQkJcmV0dXJuIGdyaWREYXRhOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkcmVzc1RleHRTdHJpbmcoKSB7Ci0JCXJldHVybiBfYWRkcmVzc1RleHQuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFkZHJlc3NUZXh0U3RyaW5nKFN0cmluZyB0YXJnZXRTKSB7Ci0JCV9hZGRyZXNzVGV4dC5zZXRUZXh0KHRhcmdldFMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvY3VzVG9BZGRyZXNzVGV4dChib29sZWFuIHNlbGVjdEFsbCkgewotCQlpZiAoIWlzVmlzaWJsZSgpKQotCQkJc2V0VmlzaWJsZSh0cnVlKTsKLQkJX2FkZHJlc3NUZXh0LnNldEZvY3VzKCk7Ci0JCWlmIChzZWxlY3RBbGwpIHsKLQkJCV9hZGRyZXNzVGV4dC5zZWxlY3RBbGwoKTsKLQkJfSBlbHNlIHsKLQkJCV9hZGRyZXNzVGV4dC5zZXRTZWxlY3Rpb24oMCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaG93QWRkcmVzc1RleHQoYm9vbGVhbiBmbGFnKSB7Ci0JCXRoaXMuc2V0VmlzaWJsZShmbGFnKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL0JlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL0JlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwZjI2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9CZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50czsKLQotCi0KLQotcHVibGljIGludGVyZmFjZSBCZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzIHsKLQotICAgIHB1YmxpYyBpbnQgZ2V0QnJvd3NlckFkZHJlc3MoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCk7Ci0KLSAgICBwdWJsaWMgaW50IGdldEZsYWdzKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldEZyYW1lTmFtZSgpOwotCi0gICAgcHVibGljIE9iamVjdCBnZXRQb3N0RGF0YSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJzKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRDYW5jZWwoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbChib29sZWFuIGNhbmNlbCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL0Jyb3dzZXJFdmVudEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL0Jyb3dzZXJFdmVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmOTRiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9Ccm93c2VyRXZlbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50czsKLQotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCcm93c2VyRXZlbnRBZGFwdGVyIGltcGxlbWVudHMgQnJvd3NlckV2ZW50TGlzdGVuZXIgewotCi0gICAgcHVibGljIHZvaWQgYmVmb3JlTmF2aWdhdGUyKEJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnMgcGFyYW0pIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBuYXZpZ2F0ZUNvbXBsZXRlMihOYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnMgcGFyYW0pIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBuYXZpZ2F0ZUVycm9yKE5hdmlnYXRlRXJyb3JQYXJhbWV0ZXJzIHBhcmFtKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9jdW1lbnRDb21wbGV0ZShEb2N1bWVudENvbXBsZXRlUGFyYW1ldGVycyBwYXJhbSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5ld1dpbmRvdzIoTmV3V2luZG93MlBhcmFtZXRlcnMgcGFyYW0pIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9ncmVzc0NoYW5nZShQcm9ncmVzc0NoYW5nZVBhcmFtZXRlcnMgcGFyYW0pIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGF0dXNUZXh0Q2hhbmdlKFN0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzIHBhcmFtKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGl0bGVDaGFuZ2UoVGl0bGVDaGFuZ2VQYXJhbWV0ZXJzIHBhcmFtKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dDbG9zaW5nUGFyYW1ldGVycyBwYXJhbSkgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvQnJvd3NlckV2ZW50TGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL0Jyb3dzZXJFdmVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMTY0NTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvQnJvd3NlckV2ZW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzOwotCi0KLQotcHVibGljIGludGVyZmFjZSBCcm93c2VyRXZlbnRMaXN0ZW5lciB7Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWZvcmVOYXZpZ2F0ZTIoQmVmb3JlTmF2aWdhdGUyUGFyYW1ldGVycyBwYXJhbSk7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbmF2aWdhdGVDb21wbGV0ZTIoTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzIHBhcmFtKTsKLQotICAgIHB1YmxpYyB2b2lkIG5hdmlnYXRlRXJyb3IoTmF2aWdhdGVFcnJvclBhcmFtZXRlcnMgcGFyYW0pOwotCi0gICAgcHVibGljIHZvaWQgZG9jdW1lbnRDb21wbGV0ZShEb2N1bWVudENvbXBsZXRlUGFyYW1ldGVycyBwYXJhbSk7Ci0KLSAgICBwdWJsaWMgdm9pZCBuZXdXaW5kb3cyKE5ld1dpbmRvdzJQYXJhbWV0ZXJzIHBhcmFtKTsKLQotICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93Q2xvc2luZ1BhcmFtZXRlcnMgcGFyYW0pOwotCi0gICAgcHVibGljIHZvaWQgc3RhdHVzVGV4dENoYW5nZShTdGF0dXNUZXh0Q2hhbmdlUGFyYW1ldGVycyBwYXJhbSk7Ci0KLSAgICBwdWJsaWMgdm9pZCB0aXRsZUNoYW5nZShUaXRsZUNoYW5nZVBhcmFtZXRlcnMgcGFyYW0pOwotCi0gICAgcHVibGljIHZvaWQgcHJvZ3Jlc3NDaGFuZ2UoUHJvZ3Jlc3NDaGFuZ2VQYXJhbWV0ZXJzIHBhcmFtKTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL0RvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNGRhMGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzOwotCi0KLQotcHVibGljIGludGVyZmFjZSBEb2N1bWVudENvbXBsZXRlUGFyYW1ldGVycyB7Ci0KLSAgICBwdWJsaWMgaW50IGdldFdpbmRvd0FkZHJlc3MoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RvcFdpbmRvdygpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9JTmV3V2lvbmRvdzJFdmVudExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9JTmV3V2lvbmRvdzJFdmVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNmNhYzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvSU5ld1dpb25kb3cyRXZlbnRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotCi0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIElOZXdXaW9uZG93MkV2ZW50TGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQotICAgIC8vVE9ETyBwYXJhbQotICAgIHB1YmxpYyB2b2lkIG5ld1dpbmRvdzIoTmV3V2luZG93MlBhcmFtZXRlcnMgcGFyYW0pOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9JV2luZG93Q2xvc2VkRXZlbnRMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvSVdpbmRvd0Nsb3NlZEV2ZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5MmYwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9JV2luZG93Q2xvc2VkRXZlbnRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotCi0KLQotcHVibGljIGludGVyZmFjZSBJV2luZG93Q2xvc2VkRXZlbnRMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotICAgIAotICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZCgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9OYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL05hdmlnYXRlQ29tcGxldGUyUGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjk1MWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL05hdmlnYXRlQ29tcGxldGUyUGFyYW1ldGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHM7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIE5hdmlnYXRlQ29tcGxldGUyUGFyYW1ldGVycyB7Ci0KLSAgICBwdWJsaWMgaW50IGdldEJyb3dzZXJBZGRyZXNzKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9OYXZpZ2F0ZUVycm9yUGFyYW1ldGVycy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvTmF2aWdhdGVFcnJvclBhcmFtZXRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyMWJlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9OYXZpZ2F0ZUVycm9yUGFyYW1ldGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHM7Ci0KLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTmF2aWdhdGVFcnJvclBhcmFtZXRlcnMgewotCi0gICAgcHVibGljIGludCBnZXRCcm93c2VyQWRkcmVzcygpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRVcmwoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RnJhbWVOYW1lKCk7Ci0KLSAgICBwdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGdldENhbmNlbCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FuY2VsKGJvb2xlYW4gY2FuY2VsKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvTmV3V2luZG93MlBhcmFtZXRlcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL05ld1dpbmRvdzJQYXJhbWV0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzMyNTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvTmV3V2luZG93MlBhcmFtZXRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzOwotCi0KLQotcHVibGljIGludGVyZmFjZSBOZXdXaW5kb3cyUGFyYW1ldGVycyB7Ci0KLSAgICBwdWJsaWMgaW50IGdldEJyb3dzZXJBZGRyZXNzKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCcm93c2VyQWRkcmVzcyhpbnQgYWRkcmVzcyk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRDYW5jZWwoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbChib29sZWFuIGNhbmNlbCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL1Byb2dyZXNzQ2hhbmdlUGFyYW1ldGVycy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvUHJvZ3Jlc3NDaGFuZ2VQYXJhbWV0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Nzk0MWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvUHJvZ3Jlc3NDaGFuZ2VQYXJhbWV0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50czsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvZ3Jlc3NDaGFuZ2VQYXJhbWV0ZXJzIHsKLQotICAgIHB1YmxpYyBpbnQgZ2V0UHJvZ3Jlc3MoKTsKLQotICAgIHB1YmxpYyBpbnQgZ2V0UHJvZ3Jlc3NNYXgoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvU3RhdHVzVGV4dENoYW5nZVBhcmFtZXRlcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL1N0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZDhiMTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvU3RhdHVzVGV4dENoYW5nZVBhcmFtZXRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzOwotCi0KLQotcHVibGljIGludGVyZmFjZSBTdGF0dXNUZXh0Q2hhbmdlUGFyYW1ldGVycyB7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvVGl0bGVDaGFuZ2VQYXJhbWV0ZXJzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9UaXRsZUNoYW5nZVBhcmFtZXRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwYWVmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9UaXRsZUNoYW5nZVBhcmFtZXRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzOwotCi0KLQotcHVibGljIGludGVyZmFjZSBUaXRsZUNoYW5nZVBhcmFtZXRlcnMgewotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL1dpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9XaW5kb3dDbG9zaW5nUGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTI5YWFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL1dpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50czsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgV2luZG93Q2xvc2luZ1BhcmFtZXRlcnMgewotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SXNDaGlsZFdpbmRvdygpOwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuY2VsKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWwoYm9vbGVhbiBjYW5jZWwpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9pbXBsL0Fic3RyYWN0RXZlbnRQYXJhbWV0ZXJzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9pbXBsL0Fic3RyYWN0RXZlbnRQYXJhbWV0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYWIzOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvaW1wbC9BYnN0cmFjdEV2ZW50UGFyYW1ldGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkNPTTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUF1dG9tYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVDb250cm9sU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuVmFyaWFudDsKLQotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV2ZW50UGFyYW1ldGVycyB7Ci0KLSAgICBwcm90ZWN0ZWQgT2xlRXZlbnQgZXZlbnQ7Ci0gICAgCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0RXZlbnRQYXJhbWV0ZXJzKE9sZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHRoaXMuZXZlbnQgPSBldmVudDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFZhcmlhbnQgZ2V0VmFyaWFudChpbnQgaW5kZXgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBldmVudC5hcmd1bWVudHNbaW5kZXhdOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nKGludCBpbmRleCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmFyZ3VtZW50c1tpbmRleF0uZ2V0U3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGludCBnZXRJbnRlZ2VyKGludCBpbmRleCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmFyZ3VtZW50c1tpbmRleF0uZ2V0SW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0Qm9vbGVhbihpbnQgaW5kZXgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBldmVudC5hcmd1bWVudHNbaW5kZXhdLmdldEJvb2xlYW4oKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Qm9vbGVhbkJ5UmVmKGludCBpbmRleCwgYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXZlbnQuYXJndW1lbnRzW2luZGV4XS5zZXRCeVJlZih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgaW50IGdldEludGVnZXJCeVJlZihpbnQgaW5kZXgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCBieVJlZiA9IGV2ZW50LmFyZ3VtZW50c1tpbmRleF0uZ2V0QnlSZWYoKTsKLSAgICAgICAgICAgIGlmKCAwICE9IGJ5UmVmICkgewotICAgICAgICAgICAgICAgIGludFtdIHBWYWx1ZSA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICAgICAgQ09NLk1vdmVNZW1vcnkocFZhbHVlLCBieVJlZiwgNCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBWYWx1ZVswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlZ2VyQnlSZWYoaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV2ZW50LmFyZ3VtZW50c1tpbmRleF0uc2V0QnlSZWYodmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGludCBnZXREaXNwYXRjaEFkZHJlc3MoaW50IGluZGV4KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZXZlbnQuYXJndW1lbnRzW2luZGV4XS5nZXREaXNwYXRjaCgpLmdldEFkZHJlc3MoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgaW50IGdldENvbnRyb2xTaXRlQWRkcmVzcygpIHsKLSAgICAgICAgaWYoIGV2ZW50LndpZGdldCBpbnN0YW5jZW9mIE9sZUNvbnRyb2xTaXRlICkgewotICAgICAgICAgICAgVmFyaWFudCB2YXJXZWJTaXRlID0gbmV3IFZhcmlhbnQobmV3IE9sZUF1dG9tYXRpb24oKE9sZUNvbnRyb2xTaXRlKShldmVudC53aWRnZXQpKSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiB2YXJXZWJTaXRlLmdldERpc3BhdGNoKCkuZ2V0QWRkcmVzcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdmFyV2ViU2l0ZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvaW1wbC9CZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvaW1wbC9CZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTNkNWQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL2ltcGwvQmVmb3JlTmF2aWdhdGUyUGFyYW1ldGVyc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLkJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBCZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzSW1wbCBleHRlbmRzIEFic3RyYWN0RXZlbnRQYXJhbWV0ZXJzIGltcGxlbWVudHMgQmVmb3JlTmF2aWdhdGUyUGFyYW1ldGVycyB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IAotICAgICAgICBJTkRFWF9Ccm93c2VyID0gMCwgICAgICAgICAgLy8gW2luXQotICAgICAgICBJTkRFWF91cmwgPSAxLCAgICAgICAgICAgICAgLy8gW2luXQotICAgICAgICBJTkRFWF9mbGFncyA9IDIsICAgICAgICAgICAgLy8gW2luXQotICAgICAgICBJTkRFWF90YXJnZXRGcmFtZU5hbWUgPSAzLCAgLy8gW2luXQotICAgICAgICBJTkRFWF9wb3N0RGF0YSA9IDQsICAgICAgICAgLy8gW2luXQotICAgICAgICBJTkRFWF9oZWFkZXJzID0gNSwgICAgICAgICAgLy8gW2luXQotICAgICAgICBJTkRFWF9jYW5jZWwgPSA2OyAgICAgICAgICAgLy8gW2luLG91dF0KLQotICAgIHB1YmxpYyBCZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzSW1wbChPbGVFdmVudCBldmVudCkgewotICAgICAgICBzdXBlcihldmVudCk7Ci0gICAgICAgIGlmKCBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpICkgewotICAgICAgICAgICAgaW50ICAgICBkaXNwQnJvd3NlciA9ICAgICBnZXRCcm93c2VyQWRkcmVzcygpOwotICAgICAgICAgICAgU3RyaW5nICB1cmwgPSAgICAgICAgICAgICBnZXRVcmwoKTsKLSAgICAgICAgICAgIGludCAgICAgZmxhZ3MgPSAgICAgICAgICAgZ2V0RmxhZ3MoKTsKLSAgICAgICAgICAgIFN0cmluZyAgdGFyZ2V0RnJhbWVOYW1lID0gZ2V0VGFyZ2V0RnJhbWVOYW1lKCk7Ci0gICAgICAgICAgICBPYmplY3QgIHBvc3REYXRhID0gICAgICAgIGdldFBvc3REYXRhKCk7Ci0gICAgICAgICAgICBTdHJpbmcgIGhlYWRlcnMgPSAgICAgICAgIGdldEhlYWRlcnMoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gY2FuY2VsID0gICAgICAgICAgZ2V0Q2FuY2VsKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJlZm9yZU5hdmlnYXRlMigiK2Rpc3BCcm93c2VyKyIsXCIiK3VybCsiXCIsIitmbGFncysiLFwiIit0YXJnZXRGcmFtZU5hbWUrIlwiLCIrcG9zdERhdGErIixcIiIraGVhZGVycysiXCIsIitjYW5jZWwrIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLkJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnMjZ2V0QnJvd3NlckFkZHJlc3MoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QnJvd3NlckFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBnZXREaXNwYXRjaEFkZHJlc3MoSU5ERVhfQnJvd3Nlcik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5CZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzI2dldFVybCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoSU5ERVhfdXJsKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLkJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnMjZ2V0RmxhZ3MoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RmxhZ3MoKSB7Ci0gICAgICAgIHJldHVybiBnZXRJbnRlZ2VyKElOREVYX2ZsYWdzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLkJlZm9yZU5hdmlnYXRlMlBhcmFtZXRlcnMjZ2V0VGFyZ2V0RnJhbWVOYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldEZyYW1lTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZyhJTkRFWF90YXJnZXRGcmFtZU5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuQmVmb3JlTmF2aWdhdGUyUGFyYW1ldGVycyNnZXRQb3N0RGF0YSgpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQb3N0RGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhcmlhbnQoSU5ERVhfcG9zdERhdGEpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuQmVmb3JlTmF2aWdhdGUyUGFyYW1ldGVycyNnZXRIZWFkZXJzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoSU5ERVhfaGVhZGVycyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5CZWZvcmVOYXZpZ2F0ZTJQYXJhbWV0ZXJzI2dldENhbmNlbCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuY2VsKCkgewotICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhbihJTkRFWF9jYW5jZWwpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuQmVmb3JlTmF2aWdhdGUyUGFyYW1ldGVycyNzZXRDYW5jZWwoYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWwoYm9vbGVhbiBjYW5jZWwpIHsKLSAgICAgICAgc2V0Qm9vbGVhbkJ5UmVmKElOREVYX2NhbmNlbCwgY2FuY2VsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL2ltcGwvRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9pbXBsL0RvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjUyNWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL2ltcGwvRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5Eb2N1bWVudENvbXBsZXRlUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVFdmVudDsKLQotCi0KLQotcHVibGljIGNsYXNzIERvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzSW1wbCBleHRlbmRzIEFic3RyYWN0RXZlbnRQYXJhbWV0ZXJzIGltcGxlbWVudHMgRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50Ci0gICAgICAgIElOREVYX1dpbmRvdyA9IDAsICAgLy8gW2luXQotICAgICAgICBJTkRFWF91cmwgPSAxOyAgICAgIC8vIFtpbl0KLSAgICAgICAgCi0gICAgcHVibGljIERvY3VtZW50Q29tcGxldGVQYXJhbWV0ZXJzSW1wbChPbGVFdmVudCBldmVudCkgewotICAgICAgICBzdXBlcihldmVudCk7Ci0gICAgICAgIGlmKCBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpICkgewotICAgICAgICAgICAgaW50ICAgICBkaXNwV2luZG93ID0gZ2V0V2luZG93QWRkcmVzcygpOwotICAgICAgICAgICAgU3RyaW5nICB1cmwgPSAgICAgICAgZ2V0VXJsKCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzVG9wID0gICAgICBpc1RvcFdpbmRvdygpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudENvbXBsZXRlKCIrZGlzcFdpbmRvdysiLFwiIit1cmwrIlwiKSB0b3A9Iitpc1RvcCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5Eb2N1bWVudENvbXBsZXRlUGFyYW1ldGVycyNnZXRXaW5kb3dBZGRyZXNzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFdpbmRvd0FkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBnZXREaXNwYXRjaEFkZHJlc3MoSU5ERVhfV2luZG93KTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5Eb2N1bWVudENvbXBsZXRlUGFyYW1ldGVycyNnZXRVcmwoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKElOREVYX3VybCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuRG9jdW1lbnRDb21wbGV0ZVBhcmFtZXRlcnMjaXNUb3BXaW5kb3coKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVG9wV2luZG93KCkgewotICAgICAgICByZXR1cm4gZ2V0V2luZG93QWRkcmVzcygpID09IGdldENvbnRyb2xTaXRlQWRkcmVzcygpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL2ltcGwvTmF2aWdhdGVDb21wbGV0ZTJQYXJhbWV0ZXJzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvaW1wbC9OYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNGY1YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvaW1wbC9OYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5OYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRXZlbnQ7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnNJbXBsIGV4dGVuZHMgQWJzdHJhY3RFdmVudFBhcmFtZXRlcnMgaW1wbGVtZW50cyBOYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnMgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGludCAKLSAgICAgICAgSU5ERVhfQnJvd3NlciA9IDAsICAgICAgICAgIC8vIFtpbl0KLSAgICAgICAgSU5ERVhfdXJsID0gMTsgICAgICAgICAgICAgIC8vIFtpbl0KLQotICAgIHB1YmxpYyBOYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnNJbXBsKE9sZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHN1cGVyKGV2ZW50KTsKLSAgICAgICAgaWYoIFBsYXRmb3JtLmluRGVidWdNb2RlKCkgKSB7Ci0gICAgICAgICAgICBpbnQgICAgIGRpc3BCcm93c2VyID0gICAgIGdldEJyb3dzZXJBZGRyZXNzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgIHVybCA9ICAgICAgICAgICAgIGdldFVybCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOYXZpZ2F0ZUNvbXBsZXRlMigiK2Rpc3BCcm93c2VyKyIsXCIiK3VybCsiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5OYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnMjZ2V0QnJvd3NlckFkZHJlc3MoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QnJvd3NlckFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBnZXREaXNwYXRjaEFkZHJlc3MoSU5ERVhfQnJvd3Nlcik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5OYXZpZ2F0ZUNvbXBsZXRlMlBhcmFtZXRlcnMjZ2V0VXJsKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZyhJTkRFWF91cmwpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvaW1wbC9OYXZpZ2F0ZUVycm9yUGFyYW1ldGVyc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL2ltcGwvTmF2aWdhdGVFcnJvclBhcmFtZXRlcnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZTNjZGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvaW1wbC9OYXZpZ2F0ZUVycm9yUGFyYW1ldGVyc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLk5hdmlnYXRlRXJyb3JQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50OwotCi0KLQotCi1wdWJsaWMgY2xhc3MgTmF2aWdhdGVFcnJvclBhcmFtZXRlcnNJbXBsIGV4dGVuZHMgQWJzdHJhY3RFdmVudFBhcmFtZXRlcnMgaW1wbGVtZW50cyBOYXZpZ2F0ZUVycm9yUGFyYW1ldGVycyB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IAotICAgICAgICBJTkRFWF9Ccm93c2VyID0gMCwgICAgICAgICAgLy8gW2luXQotICAgICAgICBJTkRFWF91cmwgPSAxLCAgICAgICAgICAgICAgLy8gW2luXQotICAgICAgICBJTkRFWF90YXJnZXRGcmFtZU5hbWUgPSAyLCAgLy8gW2luXQotICAgICAgICBJTkRFWF9zdGF0dXNDb2RlID0gMywgICAgICAgLy8gW2luXQotICAgICAgICBJTkRFWF9jYW5jZWwgPSA0OyAgICAgICAgICAgLy8gW2luLG91dF0KLQotICAgIHB1YmxpYyBOYXZpZ2F0ZUVycm9yUGFyYW1ldGVyc0ltcGwoT2xlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc3VwZXIoZXZlbnQpOwotICAgICAgICBpZiggUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSApIHsKLSAgICAgICAgICAgIGludCAgICAgZGlzcEJyb3dzZXIgPSAgICAgZ2V0QnJvd3NlckFkZHJlc3MoKTsKLSAgICAgICAgICAgIFN0cmluZyAgdXJsID0gICAgICAgICAgICAgZ2V0VXJsKCk7Ci0gICAgICAgICAgICBTdHJpbmcgIHRhcmdldEZyYW1lTmFtZSA9IGdldFRhcmdldEZyYW1lTmFtZSgpOwotICAgICAgICAgICAgaW50ICAgICBzdGF0dXNDb2RlID0gICAgICBnZXRTdGF0dXNDb2RlKCk7Ci0gICAgICAgICAgICBib29sZWFuIGNhbmNlbCA9ICAgICAgICAgIGdldENhbmNlbCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOYXZpZ2F0ZUVycm9yKCIrZGlzcEJyb3dzZXIrIixcIiIrdXJsKyJcIiwiK3RhcmdldEZyYW1lTmFtZSsiXCIsIitzdGF0dXNDb2RlKyJcIiwiK2NhbmNlbCsiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuTmF2aWdhdGVFcnJvclBhcmFtZXRlcnMjZ2V0QnJvd3NlckFkZHJlc3MoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0QnJvd3NlckFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBnZXREaXNwYXRjaEFkZHJlc3MoSU5ERVhfQnJvd3Nlcik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5OYXZpZ2F0ZUVycm9yUGFyYW1ldGVycyNnZXRVcmwoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKElOREVYX3VybCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5OYXZpZ2F0ZUVycm9yUGFyYW1ldGVycyNnZXRUYXJnZXRGcmFtZU5hbWUoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RnJhbWVOYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKElOREVYX3RhcmdldEZyYW1lTmFtZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5OYXZpZ2F0ZUVycm9yUGFyYW1ldGVycyNnZXRTdGF0dXNDb2RlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRJbnRlZ2VyKElOREVYX3N0YXR1c0NvZGUpOwotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5OYXZpZ2F0ZUVycm9yUGFyYW1ldGVycyNnZXRDYW5jZWwoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldENhbmNlbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEJvb2xlYW4oSU5ERVhfY2FuY2VsKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLk5hdmlnYXRlRXJyb3JQYXJhbWV0ZXJzI3NldENhbmNlbChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbChib29sZWFuIGNhbmNlbCkgewotICAgICAgICBzZXRCb29sZWFuQnlSZWYoSU5ERVhfY2FuY2VsLCBjYW5jZWwpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvaW1wbC9OZXdXaW5kb3cyUGFyYW1ldGVyc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL2ltcGwvTmV3V2luZG93MlBhcmFtZXRlcnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWMzZjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvaW1wbC9OZXdXaW5kb3cyUGFyYW1ldGVyc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLk5ld1dpbmRvdzJQYXJhbWV0ZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50OwotCi0KLQotCi1wdWJsaWMgY2xhc3MgTmV3V2luZG93MlBhcmFtZXRlcnNJbXBsIGV4dGVuZHMgQWJzdHJhY3RFdmVudFBhcmFtZXRlcnMgaW1wbGVtZW50cyBOZXdXaW5kb3cyUGFyYW1ldGVycyB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50Ci0gICAgICAgIElOREVYX0Jyb3dzZXIgPSAwLCAgLy8gW2luLG91dF0KLSAgICAgICAgSU5ERVhfY2FuY2VsID0gMTsgICAvLyBbaW4sb3V0XQotCi0gICAgcHVibGljIE5ld1dpbmRvdzJQYXJhbWV0ZXJzSW1wbChPbGVFdmVudCBldmVudCkgewotICAgICAgICBzdXBlcihldmVudCk7Ci0gICAgICAgIGlmKCBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpICkgewotICAgICAgICAgICAgaW50ICAgICBkaXNwQnJvd3NlciA9IGdldEJyb3dzZXJBZGRyZXNzKCk7Ci0gICAgICAgICAgICBib29sZWFuIGNhbmNlbCA9ICAgICAgZ2V0Q2FuY2VsKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5ld1dpbmRvdzIoIitkaXNwQnJvd3NlcisiLCIrY2FuY2VsKyIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5OZXdXaW5kb3cyUGFyYW1ldGVycyNnZXRCcm93c2VyQWRkcmVzcygpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRCcm93c2VyQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIGdldEludGVnZXJCeVJlZihJTkRFWF9Ccm93c2VyKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5OZXdXaW5kb3cyUGFyYW1ldGVycyNzZXRCcm93c2VyQWRkcmVzcyhpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QnJvd3NlckFkZHJlc3MoaW50IGFkZHJlc3MpIHsKLSAgICAgICAgc2V0SW50ZWdlckJ5UmVmKElOREVYX0Jyb3dzZXIsIGFkZHJlc3MpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLk5ld1dpbmRvdzJQYXJhbWV0ZXJzI2dldENhbmNlbCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuY2VsKCkgewotICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhbihJTkRFWF9jYW5jZWwpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLk5ld1dpbmRvdzJQYXJhbWV0ZXJzI3NldENhbmNlbChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbChib29sZWFuIGNhbmNlbCkgewotICAgICAgICBzZXRCb29sZWFuQnlSZWYoSU5ERVhfY2FuY2VsLCBjYW5jZWwpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL2ltcGwvUHJvZ3Jlc3NDaGFuZ2VQYXJhbWV0ZXJzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvaW1wbC9Qcm9ncmVzc0NoYW5nZVBhcmFtZXRlcnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZGUyOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvaW1wbC9Qcm9ncmVzc0NoYW5nZVBhcmFtZXRlcnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5Qcm9ncmVzc0NoYW5nZVBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRXZlbnQ7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBQcm9ncmVzc0NoYW5nZVBhcmFtZXRlcnNJbXBsIGV4dGVuZHMgQWJzdHJhY3RFdmVudFBhcmFtZXRlcnMgaW1wbGVtZW50cyBQcm9ncmVzc0NoYW5nZVBhcmFtZXRlcnMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50Ci0gICAgICAgIElOREVYX25Qcm9ncmVzcyA9IDAsICAgIC8vIFtpbl0KLSAgICAgICAgSU5ERVhfblByb2dyZXNzTWF4ID0gMTsgLy8gW2luXQotICAgIAotICAgIHB1YmxpYyBQcm9ncmVzc0NoYW5nZVBhcmFtZXRlcnNJbXBsKE9sZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHN1cGVyKGV2ZW50KTsKLSAgICAgICAgaWYoIFBsYXRmb3JtLmluRGVidWdNb2RlKCkgKSB7Ci0gICAgICAgICAgICBpbnQgblByb2dyZXNzID0gICAgZ2V0UHJvZ3Jlc3MoKTsKLSAgICAgICAgICAgIGludCBuUHJvZ3Jlc3NNYXggPSBnZXRQcm9ncmVzc01heCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcm9ncmVzc0NoYW5nZSgiK25Qcm9ncmVzcysiLCIrblByb2dyZXNzTWF4KyIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5Qcm9ncmVzc0NoYW5nZVBhcmFtZXRlcnMjZ2V0UHJvZ3Jlc3MoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UHJvZ3Jlc3MoKSB7Ci0gICAgICAgIHJldHVybiBnZXRJbnRlZ2VyKElOREVYX25Qcm9ncmVzcyk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuUHJvZ3Jlc3NDaGFuZ2VQYXJhbWV0ZXJzI2dldFByb2dyZXNzTWF4KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFByb2dyZXNzTWF4KCkgewotICAgICAgICByZXR1cm4gZ2V0SW50ZWdlcihJTkRFWF9uUHJvZ3Jlc3NNYXgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL2ltcGwvU3RhdHVzVGV4dENoYW5nZVBhcmFtZXRlcnNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9pbXBsL1N0YXR1c1RleHRDaGFuZ2VQYXJhbWV0ZXJzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWI2ZDc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvZXZlbnRzL2ltcGwvU3RhdHVzVGV4dENoYW5nZVBhcmFtZXRlcnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLmllLmV2ZW50cy5TdGF0dXNUZXh0Q2hhbmdlUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9sZUV2ZW50OwotCi0KLQotCi1wdWJsaWMgY2xhc3MgU3RhdHVzVGV4dENoYW5nZVBhcmFtZXRlcnNJbXBsIGV4dGVuZHMgQWJzdHJhY3RFdmVudFBhcmFtZXRlcnMgaW1wbGVtZW50cyBTdGF0dXNUZXh0Q2hhbmdlUGFyYW1ldGVycyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQKLSAgICAgICAgSU5ERVhfdGV4dCA9IDA7IC8vIFtpbl0KLSAgICAKLSAgICBwdWJsaWMgU3RhdHVzVGV4dENoYW5nZVBhcmFtZXRlcnNJbXBsKE9sZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHN1cGVyKGV2ZW50KTsKLS8vICAgICAgICBpZiggUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSApIHsKLS8vICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBnZXRUZXh0KCk7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdHVzVGV4dENoYW5nZShcIiIrdGV4dCsiXCIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotLy8gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllLmV2ZW50cy5TdGF0dXNUZXh0Q2hhbmdlUGFyYW1ldGVycyNnZXRUZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoSU5ERVhfdGV4dCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvaW1wbC9UaXRsZUNoYW5nZVBhcmFtZXRlcnNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9pbXBsL1RpdGxlQ2hhbmdlUGFyYW1ldGVyc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU5MjEwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9pbXBsL1RpdGxlQ2hhbmdlUGFyYW1ldGVyc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLlRpdGxlQ2hhbmdlUGFyYW1ldGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi5PbGVFdmVudDsKLQotCi0KLQotcHVibGljIGNsYXNzIFRpdGxlQ2hhbmdlUGFyYW1ldGVyc0ltcGwgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50UGFyYW1ldGVycyBpbXBsZW1lbnRzIFRpdGxlQ2hhbmdlUGFyYW1ldGVycyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQKLSAgICBJTkRFWF90ZXh0ID0gMDsgLy8gW2luXQotCi0gICAgcHVibGljIFRpdGxlQ2hhbmdlUGFyYW1ldGVyc0ltcGwoT2xlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc3VwZXIoZXZlbnQpOwotICAgICAgICBpZiggUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSApIHsKLSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gZ2V0VGV4dCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaXRsZUNoYW5nZShcIiIrdGV4dCsiXCIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuVGl0bGVDaGFuZ2VQYXJhbWV0ZXJzI2dldFRleHQoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZyhJTkRFWF90ZXh0KTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9pbXBsL1dpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS9ldmVudHMvaW1wbC9XaW5kb3dDbG9zaW5nUGFyYW1ldGVyc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0NzkwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL2V2ZW50cy9pbXBsL1dpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuV2luZG93Q2xvc2luZ1BhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT2xlRXZlbnQ7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBXaW5kb3dDbG9zaW5nUGFyYW1ldGVyc0ltcGwgZXh0ZW5kcyBBYnN0cmFjdEV2ZW50UGFyYW1ldGVycyBpbXBsZW1lbnRzIFdpbmRvd0Nsb3NpbmdQYXJhbWV0ZXJzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGludAotICAgICAgICBJTkRFWF9pc0NoaWxkV2luZG93ID0gMCwgICAgLy8gW2luXQotICAgICAgICBJTkRFWF9jYW5jZWwgPSAxOyAgICAgICAgICAgLy8gW2luLG91dF0KLSAgICAKLSAgICBwdWJsaWMgV2luZG93Q2xvc2luZ1BhcmFtZXRlcnNJbXBsKE9sZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHN1cGVyKGV2ZW50KTsKLSAgICAgICAgaWYoIFBsYXRmb3JtLmluRGVidWdNb2RlKCkgKSB7Ci0gICAgICAgICAgICBib29sZWFuIGlzQ2hpbGRXaW5kb3cgPSBnZXRJc0NoaWxkV2luZG93KCk7Ci0gICAgICAgICAgICBib29sZWFuIGNhbmNlbCA9ICAgICAgICBnZXRDYW5jZWwoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2luZG93Q2xvc2luZygiK2lzQ2hpbGRXaW5kb3crIiwiK2NhbmNlbCsiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuV2luZG93Q2xvc2luZ1BhcmFtZXRlcnMjZ2V0SXNDaGlsZFdpbmRvdygpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SXNDaGlsZFdpbmRvdygpIHsKLSAgICAgICAgcmV0dXJuIGdldEJvb2xlYW4oSU5ERVhfaXNDaGlsZFdpbmRvdyk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuV2luZG93Q2xvc2luZ1BhcmFtZXRlcnMjZ2V0Q2FuY2VsKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRDYW5jZWwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCb29sZWFuKElOREVYX2NhbmNlbCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS5ldmVudHMuV2luZG93Q2xvc2luZ1BhcmFtZXRlcnMjc2V0Q2FuY2VsKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2FuY2VsKGJvb2xlYW4gY2FuY2VsKSB7Ci0gICAgICAgIHNldEJvb2xlYW5CeVJlZihJTkRFWF9jYW5jZWwsIGNhbmNlbCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS93aW4zMi9JUGVyc2lzdEZpbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvaWUvd2luMzIvSVBlcnNpc3RGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZWVmYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS93aW4zMi9JUGVyc2lzdEZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkNPTTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLklQZXJzaXN0OwotCi0KLQotcHVibGljIGNsYXNzIElQZXJzaXN0RmlsZSBleHRlbmRzIElQZXJzaXN0IHsKLSAgICBwcml2YXRlIGludCBhZGRyZXNzOwotICAgIHB1YmxpYyBJUGVyc2lzdEZpbGUoaW50IGFkZHJlc3MpIHsKLSAgICAgICAgc3VwZXIoYWRkcmVzcyk7Ci0gICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgfQotICAgIHB1YmxpYyBpbnQgSXNEaXJ0eSgpIHsKLSAgICAgICAgcmV0dXJuIENPTS5WdGJsQ2FsbCg0LCBhZGRyZXNzKTsKLSAgICB9Ci0gICAgcHVibGljIGludCBMb2FkKGludCBwc3pGaWxlbmFtZSwgaW50IGR3TW9kZSkgewotICAgICAgICByZXR1cm4gQ09NLlZ0YmxDYWxsKDUsIGFkZHJlc3MsIHBzekZpbGVuYW1lLCBkd01vZGUpOwotICAgIH0KLSAgICBwdWJsaWMgaW50IFNhdmUoaW50IHBzekZpbGVuYW1lLCBib29sZWFuIGZSZW1lbWJlcikgewotICAgICAgICByZXR1cm4gQ09NLlZ0YmxDYWxsKDYsIGFkZHJlc3MsIHBzekZpbGVuYW1lLCBmUmVtZW1iZXIpOwotICAgIH0KLSAgICBwdWJsaWMgaW50IFNhdmVDb21wbGV0ZWQoaW50IHBzekZpbGVuYW1lKSB7Ci0gICAgICAgIHJldHVybiBDT00uVnRibENhbGwoNywgYWRkcmVzcywgcHN6RmlsZW5hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgaW50IEdldEN1ckZpbGUoaW50IHBwc3pGaWxlbmFtZSl7Ci0gICAgICAgIHJldHVybiBDT00uVnRibENhbGwoOSwgYWRkcmVzcywgcHBzekZpbGVuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL3dpbjMyL1JlZ2lzdHJ5VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9pZS93aW4zMi9SZWdpc3RyeVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0NzUyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL2llL3dpbjMyL1JlZ2lzdHJ5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLlRDSEFSOwotCi1wdWJsaWMgY2xhc3MgUmVnaXN0cnlVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFR19OT05FID0gMCwgUkVHX1NaID0gMSwgUkVHX0VYUEFORF9TWiA9IDIsCi0JCQlSRUdfQklOQVJZID0gMywgUkVHX0RXT1JEID0gNCwgUkVHX0RXT1JEX0JJR19FTkRJQU4gPSA1LAotCQkJUkVHX0xJTksgPSA2LCBSRUdfTVVMVElfU1ogPSA3LCBSRUdfUkVTT1VSQ0VfTElTVCA9IDgsCi0JCQlSRUdfRlVMTF9SRVNPVVJDRV9ERVNDUklQVE9SID0gOSwKLQkJCVJFR19SRVNPVVJDRV9SRVFVSVJFTUVOVFNfTElTVCA9IDEwLCBSRUdfUVdPUkQgPSAxMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWV9SRUFEID0gMHgyMDAxOTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElFX1NFVFRJTkdTX0tFWSA9ICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxJbnRlcm5ldCBFeHBsb3JlclxcU2V0dGluZ3MiLCAvLyROT04tTkxTLTEkCi0JCQlJRV9BTkNIT1JfQ09MT1IgPSAiQW5jaG9yIENvbG9yIiwgLy8kTk9OLU5MUy0xJAotCQkJSUVfQU5DSE9SX0NPTE9SX1ZJU0lURUQgPSAiQW5jaG9yIENvbG9yIFZpc2l0ZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJRVJlZ2lzdHJ5SW50KFN0cmluZyB2YWx1ZVN0cmluZykgewotCQlyZXR1cm4gZ2V0UmVnaXN0cnlJbnQoT1MuSEtFWV9DVVJSRU5UX1VTRVIsCi0JCQkJUmVnaXN0cnlVdGlsLklFX1NFVFRJTkdTX0tFWSwgdmFsdWVTdHJpbmcpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElFUmVnaXN0cnlTdHJpbmcoU3RyaW5nIHZhbHVlU3RyaW5nKSB7Ci0JCXJldHVybiBnZXRSZWdpc3RyeVN0cmluZyhPUy5IS0VZX0NVUlJFTlRfVVNFUiwKLQkJCQlSZWdpc3RyeVV0aWwuSUVfU0VUVElOR1NfS0VZLCB2YWx1ZVN0cmluZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0UmVnaXN0cnlJbnQoaW50IGhLZXlQYXJlbnQsIFN0cmluZyBzdWJLZXlTdHJpbmcsCi0JCQlTdHJpbmcgdmFsdWVTdHJpbmcpIHsKLQkJaW50IGhLZXkgPSBvcGVuKGhLZXlQYXJlbnQsIHN1YktleVN0cmluZywgMCwgS0VZX1JFQUQpOwotCQlpZiAoMCAhPSBoS2V5KSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBnZXRJbnRlZ2VyVmFsdWUoaEtleSwgdmFsdWVTdHJpbmcpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQljbG9zZShoS2V5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWdpc3RyeVN0cmluZyhpbnQgaEtleVBhcmVudCwgU3RyaW5nIHN1YktleVN0cmluZywKLQkJCVN0cmluZyB2YWx1ZVN0cmluZykgewotCQlpbnQgaEtleSA9IG9wZW4oaEtleVBhcmVudCwgc3ViS2V5U3RyaW5nLCAwLCBLRVlfUkVBRCk7Ci0JCWlmICgwICE9IGhLZXkpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGdldFN0cmluZ1ZhbHVlKGhLZXksIHZhbHVlU3RyaW5nKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJY2xvc2UoaEtleSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG9wZW4oaW50IGhLZXlQYXJlbnQsIFN0cmluZyBzdWJLZXlTdHJpbmcsIGludCB1bE9wdGlvbnMsCi0JCQlpbnQgc2FtRGVzaXJlZCkgewotCQlUQ0hBUiBrZXlOYW1lID0gbmV3IFRDSEFSKDAsIHN1YktleVN0cmluZywgdHJ1ZSk7Ci0JCWludFtdIHBoS2V5ID0gbmV3IGludFsxXTsKLQkJaWYgKDAgPT0gT1MuUmVnT3BlbktleUV4KGhLZXlQYXJlbnQsIGtleU5hbWUsIHVsT3B0aW9ucywgc2FtRGVzaXJlZCwKLQkJCQlwaEtleSkpIHsKLQkJCXJldHVybiBwaEtleVswXTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY2xvc2UoaW50IGhLZXkpIHsKLQkJcmV0dXJuIE9TLlJlZ0Nsb3NlS2V5KGhLZXkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBnZXRJbnRlZ2VyVmFsdWUoaW50IGhLZXksIFN0cmluZyB2YWx1ZVN0cmluZykgewotCQlUQ0hBUiB2YWx1ZU5hbWUgPSBuZXcgVENIQVIoMCwgdmFsdWVTdHJpbmcsIHRydWUpOwotCQlpbnRbXSBwY2JEYXRhID0gbmV3IGludFtdIHsgNCB9OwotCQlpbnRbXSBwVHlwZSA9IG5ldyBpbnRbMV07Ci0JCWludFtdIHBEYXRhID0gbmV3IGludFsxXTsKLQkJaWYgKDAgPT0gT1MuUmVnUXVlcnlWYWx1ZUV4KGhLZXksIHZhbHVlTmFtZSwgMCwgcFR5cGUsIHBEYXRhLCBwY2JEYXRhKSkgewotCQkJaWYgKFJFR19EV09SRCA9PSBwVHlwZVswXSkgewotCQkJCXJldHVybiBwRGF0YVswXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoaW50IGhLZXksIFN0cmluZyB2YWx1ZVN0cmluZykgewotCQlUQ0hBUiB2YWx1ZU5hbWUgPSBuZXcgVENIQVIoMCwgdmFsdWVTdHJpbmcsIHRydWUpOwotCQlpbnRbXSBwY2JEYXRhID0gbmV3IGludFsxXTsKLQkJaW50W10gcFR5cGUgPSBuZXcgaW50WzFdOwotCQlpZiAoMCA9PSBPUy5SZWdRdWVyeVZhbHVlRXgoaEtleSwgdmFsdWVOYW1lLCAwLCBwVHlwZSwgKFRDSEFSKSBudWxsLAotCQkJCXBjYkRhdGEpKSB7Ci0JCQlpZiAoUkVHX1NaID09IHBUeXBlWzBdKSB7Ci0JCQkJVENIQVIgYnVmZiA9IG5ldyBUQ0hBUigwLCBwY2JEYXRhWzBdIC8gVENIQVIuc2l6ZW9mKTsKLQkJCQlpZiAoMCA9PSBPUy5SZWdRdWVyeVZhbHVlRXgoaEtleSwgdmFsdWVOYW1lLCAwLCBwVHlwZSwgYnVmZiwKLQkJCQkJCXBjYkRhdGEpKSB7Ci0JCQkJCXJldHVybiBidWZmLnRvU3RyaW5nKDAsIGJ1ZmYuc3RybGVuKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLmllL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvaWUvV2ViQnJvd3NlckVkaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9XZWJCcm93c2VyRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODkyY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMuaWUvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9pZS9XZWJCcm93c2VyRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5pZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5XZWJCcm93c2VySUVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuSU5ld1dpb25kb3cyRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMuaWUuZXZlbnRzLklXaW5kb3dDbG9zZWRFdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5pZS5ldmVudHMuTmV3V2luZG93MlBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5JTW9kZWxTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuSU1vZGVsU2VydmljZUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5EdW1teUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSVdlYkJyb3dzZXJBQ1RGOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuV2ViQnJvd3NlckV2ZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLnV0aWwuTW9kZWxTZXJ2aWNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51aS51dGlsLlBsYXRmb3JtVUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydDsKLQotLyoqCi0gKiBUaGUgRWRpdG9yIGltcGxlbWVudGF0aW9uIHRvIG9wZW4gV2ViIGNvbnRlbnQgYnkgdXNpbmcgSW50ZXJuZXQgRXhwbG9yZXIuIEl0Ci0gKiBhbHNvIHByb3ZpZGUgYWNjZXNzIHRvIEhUTUwgRE9NIHZpYSB7QGxpbmsgSU1vZGVsU2VydmljZX0uIFRoZSBtb2RlbCBzZXJ2aWNlCi0gKiBhbHNvIGltcGxlbWVudHMge0BsaW5rIElXZWJCcm93c2VyQUNURn0uCi0gKiAKLSAqIEBzZWUgSU1vZGVsU2VydmljZUhvbGRlcgotICogQHNlZSBJTW9kZWxTZXJ2aWNlCi0gKiBAc2VlIElXZWJCcm93c2VyQUNURgotICovCi1wdWJsaWMgY2xhc3MgV2ViQnJvd3NlckVkaXRvciBleHRlbmRzIEVkaXRvclBhcnQgaW1wbGVtZW50cyBJTW9kZWxTZXJ2aWNlSG9sZGVyIHsKLQotCS8qKgotCSAqIElEIG9mIHRoaXMgRWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBXZWJCcm93c2VyRWRpdG9yLmNsYXNzLmdldE5hbWUoKTsKLQotCVdlYkJyb3dzZXJJRUltcGwgd2ViQnJvd3NlcjsKLQotCUlFZGl0b3JJbnB1dCBpbnB1dDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgSW50ZXJuZXQgRXhwbG9yZXIgRWRpdG9yLgotCSAqLwotCXB1YmxpYyBXZWJCcm93c2VyRWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIHRhcmdldFVybCA9ICJhYm91dDpibGFuayI7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIER1bW15RWRpdG9ySW5wdXQpIHsKLQkJCXRhcmdldFVybCA9ICgoRHVtbXlFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFVybCgpOwotCQkJaWYgKCIiLmVxdWFscyh0YXJnZXRVcmwpKSB7Ci0JCQkJdGFyZ2V0VXJsID0gImFib3V0OmJsYW5rIjsKLQkJCX0KLQkJfWVsc2UgaWYoaW5wdXQgaW5zdGFuY2VvZiBJUGF0aEVkaXRvcklucHV0KXsKLQkJCXRhcmdldFVybCA9ICgoSVBhdGhFZGl0b3JJbnB1dClpbnB1dCkuZ2V0UGF0aCgpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0KLQkJd2ViQnJvd3NlciA9IG5ldyBXZWJCcm93c2VySUVJbXBsKHRoaXMsIHBhcmVudCwgdGFyZ2V0VXJsKTsKLQkJd2ViQnJvd3Nlci5zZXROZXdXaW5kb3cyRXZlbnRMaXN0ZW5lcihuZXcgSU5ld1dpb25kb3cyRXZlbnRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgbmV3V2luZG93MihOZXdXaW5kb3cyUGFyYW1ldGVycyBwYXJhbSkgewotCQkJCUlFZGl0b3JQYXJ0IG5ld0VkaXRvciA9IE1vZGVsU2VydmljZVV0aWxzLmxhdW5jaCgiYWJvdXQ6YmxhbmsiLAotCQkJCQkJSUQpOwotCQkJCWlmIChuZXdFZGl0b3IgaW5zdGFuY2VvZiBXZWJCcm93c2VyRWRpdG9yKSB7Ci0JCQkJCUlXZWJCcm93c2VyQUNURiBicm93c2VyID0gKElXZWJCcm93c2VyQUNURikgKChXZWJCcm93c2VyRWRpdG9yKSBuZXdFZGl0b3IpCi0JCQkJCQkJLmdldE1vZGVsU2VydmljZSgpOwotCQkJCQlwYXJhbS5zZXRCcm93c2VyQWRkcmVzcyhicm93c2VyLmdldEJyb3dzZXJBZGRyZXNzKCkpOwotCQkJCQlXZWJCcm93c2VyRXZlbnRVdGlsLm5ld1dpbmRvdyhicm93c2VyKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBUT0RPCi0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl3ZWJCcm93c2VyCi0JCQkJLnNldFdpbmRvd0Nsb3NlZEV2ZW50TGlzdGVuZXIobmV3IElXaW5kb3dDbG9zZWRFdmVudExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoKSB7Ci0JCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSVV0aWwuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCQkJCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZzID0gcGFnZQotCQkJCQkJCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCQkJCQlmb3IgKElFZGl0b3JSZWZlcmVuY2UgaSA6IGVkaXRvclJlZnMpIHsKLQkJCQkJCQkJaWYgKFdlYkJyb3dzZXJFZGl0b3IudGhpcyA9PSBpLmdldEVkaXRvcihmYWxzZSkpIHsKLQkJCQkJCQkJCVBsYXRmb3JtVUlVdGlsLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUVkaXRvcigKLQkJCQkJCQkJCQkJV2ViQnJvd3NlckVkaXRvci50aGlzLCBmYWxzZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVdlYkJyb3dzZXJFdmVudFV0aWwuYnJvd3NlckRpc3Bvc2VkKHdlYkJyb3dzZXIsIGdldFBhcnROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlXZWJCcm93c2VyRXZlbnRVdGlsLmdldEZvY3VzKHdlYkJyb3dzZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gVE9ETwotCX0KLQotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCQkvLyBUT0RPCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzZXRTaXRlKHNpdGUpOwotCQlzZXRJbnB1dChpbnB1dCk7Ci0JCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElNb2RlbFNlcnZpY2UgZ2V0TW9kZWxTZXJ2aWNlKCkgewotCQlyZXR1cm4gKHRoaXMud2ViQnJvd3Nlcik7Ci0JfQotCi0JcHVibGljIElFZGl0b3JQYXJ0IGdldEVkaXRvclBhcnQoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVkaXRvclRpdGxlKFN0cmluZyB0aXRsZSkgewotCQlzZXRQYXJ0TmFtZSh0aXRsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmYzNjQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU5M2QyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVjbGlwc2UgQUNURiBPREYgQnJvd3NlciBJbml0aWFsaXplciBQbHVnLWluIChJbmN1YmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci5raWNrZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vbyIsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci51dGlsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci5PT29FZGl0b3JJbml0UGx1Z2luCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODFkYmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmIzNzdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0JCQkgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vaW5pdGlhbGl6ZXIvT09vRWRpdG9ySW5pdFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2luaXRpYWxpemVyL09Pb0VkaXRvckluaXRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkNTM3Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vaW5pdGlhbGl6ZXIvT09vRWRpdG9ySW5pdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci51dGlsLk9Pb0VkaXRvckluaXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgT09vRWRpdG9ySW5pdFBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplciI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgT09vRWRpdG9ySW5pdFBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIE9Pb0VkaXRvckluaXRQbHVnaW4oKSB7CQkKLQkJT09vRWRpdG9ySW5pdFV0aWwuaXNPT29JbnN0YWxsZWQoZmFsc2UpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT09vRWRpdG9ySW5pdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2luaXRpYWxpemVyL2tpY2tlci9JT09vRWRpdG9ySW5pdGlhbGl6ZXJLaWNrZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9pbml0aWFsaXplci9raWNrZXIvSU9Pb0VkaXRvckluaXRpYWxpemVyS2lja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Yjk2MDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2luaXRpYWxpemVyL2tpY2tlci9JT09vRWRpdG9ySW5pdGlhbGl6ZXJLaWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci5raWNrZXI7Ci0KLS8qKgotICogRHVtbXkgaW50ZXJmYWNlIHRvIHN0YXJ0IE9Pb0VkaXRvckluaXRpYWxpemVyIFBsdWctaW4gYmVmb3JlIHRoZSBPT29FZGl0b3IKLSAqIFBsdWctaW4gKGJ5IHVzaW5nIExhenlTdGFydCkKLSAqLwotcHVibGljIGludGVyZmFjZSBJT09vRWRpdG9ySW5pdGlhbGl6ZXJLaWNrZXIgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vaW5pdGlhbGl6ZXIvdXRpbC9PT29FZGl0b3JJbml0VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2luaXRpYWxpemVyL3V0aWwvT09vRWRpdG9ySW5pdFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlMDVjYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vaW5pdGlhbGl6ZXIvdXRpbC9PT29FZGl0b3JJbml0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYXRzdXlhIElTSElIQVJBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLlRDSEFSOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgT3Blbk9mZmljZS5vcmcgKE9PbykgRWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgT09vRWRpdG9ySW5pdFV0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBJU19JTklUSUFMSVpFRCA9IGZhbHNlOwotCi0JLyoqCi0JICogY2hlY2sgZXhpc3RlbmNlIG9mIE9Pby4KLQkgKiAKLQkgKiBAcGFyYW0gc2hvd0hlbHAKLQkgKiAgICAgICAgICAgIGlmIHRydWUgYW5kIE9PbyBkb2VzIG5vdCBleGlzdCwgSGVscCBwYWdlIHdpbGwgYmUgc2hvd24KLQkgKiBAcmV0dXJuIHRydWUgaWYgT09vIGV4aXN0cwotCSAqLwotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc09Pb0luc3RhbGxlZChib29sZWFuIHNob3dIZWxwKSB7Ci0KLQkJaWYgKElTX0lOSVRJQUxJWkVEKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBwYXRoID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhdGggPSBnZXRPcGVuT2ZmaWNlUGF0aCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCWlmIChzaG93SGVscCkgewotCQkJCVBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkJLmRpc3BsYXlIZWxwUmVzb3VyY2UoCi0JCQkJCQkJCSIvb3JnLmVjbGlwc2UuYWN0Zi5leGFtcGxlcy5hZGVzaWduZXIuZG9jL2RvY3Mvb2RmL2luc3RhbGwuaHRtbCIpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSVNfSU5JVElBTElaRUQgPSB0cnVlOwotCQlTeXN0ZW0uc2V0UHJvcGVydHkoIk9Pb19QUk9HUkFNX1BBVEgiLCBwYXRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgT3Blbk9mZmljZS5vcmcgKGxhdGVyIHRoYW4gMi4wKSBwYXRoCi0JICogCi0JICogQHJldHVybiB0aGUgaW5zdGFsbCBwYXRoIG9mIE9wZW5PZmZpY2Uub3JnCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE9wZW5PZmZpY2VQYXRoKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0KLQkJZmluYWwgU3RyaW5nIGVudHJ5ID0gIlNPRlRXQVJFXFxPcGVuT2ZmaWNlLm9yZ1xcVU5PXFxJbnN0YWxsUGF0aCI7Ci0KLQkJZmluYWwgaW50W10gaEtleSA9IG5ldyBpbnRbMV07Ci0JCXRyeSB7Ci0JCQlpbnQgcmMgPSBPUy5SZWdPcGVuS2V5RXgoT1MuSEtFWV9MT0NBTF9NQUNISU5FLCBuZXcgVENIQVIoCi0JCQkJCU9TLkNQX0lOU1RBTExFRCwgZW50cnksIHRydWUpLCAwLCAweEYwMDNGLCBoS2V5KTsKLQkJCWlmICgwICE9IHJjKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJGYWlsZWQgdG8gY2FsbCBSZWdPcGVuS2V5RXguIik7Ci0JCQl9Ci0KLQkJCVRDSEFSIGJ1ZiA9IG5ldyBUQ0hBUihPUy5DUF9JTlNUQUxMRUQsIDI1Nik7Ci0JCQlmaW5hbCBpbnRbXSBsZW4gPSBuZXcgaW50W10geyAyNTYgfTsKLQkJCXJjID0gT1MuUmVnUXVlcnlWYWx1ZUV4KGhLZXlbMF0sIChUQ0hBUikgbnVsbCwgMCwgbnVsbCwgYnVmLCBsZW4pOwotCQkJaWYgKDAgIT0gcmMpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIkZhaWxlZCB0byBjYWxsIFJlZ1F1ZXJ5VmFsdWVFeC4iKTsKLQkJCX0KLQotCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygwLCBidWYuc3RybGVuKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGhLZXlbMF0gIT0gMCkgewotCQkJCU9TLlJlZ0Nsb3NlS2V5KGhLZXlbMF0pOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2IxYmUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iT09PX0hPTUUvcHJvZ3JhbS9jbGFzc2VzL2p1aC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJPT09fSE9NRS9wcm9ncmFtL2NsYXNzZXMvanVydC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJPT09fSE9NRS9wcm9ncmFtL2NsYXNzZXMvcmlkbC5qYXIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJPT09fSE9NRS9wcm9ncmFtL2NsYXNzZXMvdW5vaWwuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzZjcyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmYzdmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBFY2xpcHNlIEFDVEYgT0RGIEJyb3dzZXIgUGx1Zy1pbiAoSW5jdWJhdGlvbikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb287c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMub29vLk9Pb0VkaXRvclBsdWdpbgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5hY3RmLmNvcmUsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWksCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplcjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5hY3RmLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLUNsYXNzUGF0aDogcnVudGltZXMvYWNjZXNzaWJpbGl0eV9icm93c2VyX29kZi5qYXIsCi0gZXh0ZXJuYWw6JE9Pb19QUk9HUkFNX1BBVEgkXGNsYXNzZXNcanVoLmphciwKLSBleHRlcm5hbDokT09vX1BST0dSQU1fUEFUSCRcY2xhc3Nlc1xqdXJ0LmphciwKLSBleHRlcm5hbDokT09vX1BST0dSQU1fUEFUSCRcY2xhc3Nlc1xyaWRsLmphciwKLSBleHRlcm5hbDokT09vX1BST0dSQU1fUEFUSCRcY2xhc3Nlc1x1bm9pbC5qYXIsCi0gZXh0ZXJuYWw6QzpcUHJvZ3JhbSBGaWxlc1xPcGVuT2ZmaWNlLm9yZyAyLjNccHJvZ3JhbVxjbGFzc2VzXGp1aC5qYXIsCi0gZXh0ZXJuYWw6QzpcUHJvZ3JhbSBGaWxlc1xPcGVuT2ZmaWNlLm9yZyAyLjNccHJvZ3JhbVxjbGFzc2VzXGp1cnQuamFyLAotIGV4dGVybmFsOkM6XFByb2dyYW0gRmlsZXNcT3Blbk9mZmljZS5vcmcgMi4zXHByb2dyYW1cY2xhc3Nlc1xyaWRsLmphciwKLSBleHRlcm5hbDpDOlxQcm9ncmFtIEZpbGVzXE9wZW5PZmZpY2Uub3JnIDIuM1xwcm9ncmFtXGNsYXNzZXNcdW5vaWwuamFyLAotIGV4dGVybmFsOkM6XFByb2dyYW0gRmlsZXNcT3Blbk9mZmljZS5vcmcgMi40XHByb2dyYW1cY2xhc3Nlc1xqdWguamFyLAotIGV4dGVybmFsOkM6XFByb2dyYW0gRmlsZXNcT3Blbk9mZmljZS5vcmcgMi40XHByb2dyYW1cY2xhc3Nlc1xqdXJ0LmphciwKLSBleHRlcm5hbDpDOlxQcm9ncmFtIEZpbGVzXE9wZW5PZmZpY2Uub3JnIDIuNFxwcm9ncmFtXGNsYXNzZXNccmlkbC5qYXIsCi0gZXh0ZXJuYWw6QzpcUHJvZ3JhbSBGaWxlc1xPcGVuT2ZmaWNlLm9yZyAyLjRccHJvZ3JhbVxjbGFzc2VzXHVub2lsLmphciAKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODFkYmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGQwNGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0JCQkgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luX2phLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcnVudGltZXMvYWNjZXNzaWJpbGl0eV9icm93c2VyX29kZi5qYXIKLWphcnMuY29tcGlsZS5vcmRlciA9IHJ1bnRpbWVzL2FjY2Vzc2liaWxpdHlfYnJvd3Nlcl9vZGYuamFyCi1zb3VyY2UucnVudGltZXMvYWNjZXNzaWJpbGl0eV9icm93c2VyX29kZi5qYXIgPSBzcmMvCi1vdXRwdXQucnVudGltZXMvYWNjZXNzaWJpbGl0eV9icm93c2VyX29kZi5qYXIgPSBiaW4vCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vaWNvbnMvZXhjbGF3aGl0ZTE2LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9pY29ucy9leGNsYXdoaXRlMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGI0ZmQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9pY29ucy9leGNsYXdoaXRlMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmYzZDIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9kZi5lZGl0b3IudGl0bGU9T3BlbkRvY3VtZW50Ci0KLU9ERkVkaXRvckFjdGlvbi5PcGVuPU9wZW4gT0RGIEZpbGUKLQotT0RGRWRpdG9yLmNvbnZlcnRIVE1MPUNvbnZlcnRpbmcgT0RGIHRvIEhUTUwuLi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTY4YTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5PT29FZGl0b3IiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMub29vLk9Pb0VkaXRvckNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgICBleHRlbnNpb25zPSJvZHQsIG9kcCwgb2RzIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZXhjbGF3aGl0ZTE2LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLk9Pb0VkaXRvciIKLSAgICAgICAgICAgIG5hbWU9IiVvZGYuZWRpdG9yLnRpdGxlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3BsdWdpbl9qYS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3BsdWdpbl9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGI4ZTcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9wbHVnaW5famEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9kZi5lZGl0b3IudGl0bGU9T3BlbkRvY3VtZW50Ci0KLU9ERkVkaXRvckFjdGlvbi5PcGVuPU9ERiBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwOTJcdTk1OGJcdTMwNGYKLQotT0RGRWRpdG9yLmNvbnZlcnRIVE1MPU9ERiBcdTMwOTIgSFRNTCBcdTMwNmJcdTU5MDlcdTYzZGJcdTRlMmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vcmVhZG1lLnR4dCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTY5YmIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotRGV2ZWxvcG1lbnQgaW5zdHJ1Y3Rpb24gZm9yIHRoaXMgcGx1Z2luLgotCi1PcGVuT2ZmaWNlLm9yZyAodmVyLiAyLjEuMCBvciBhYm92ZSkgaXMgcHJlLXJlcSBmb3IgdGhpcyBwbHVnaW4uCi1QbGVhc2UgYWRkIG5ldyBDbGFzc3BhdGggVmFyaWFibGVzICJPT09fSE9NRSIgYnkgdXNpbmcgCi1XaW5kb3c+UHJlZmVyZW5jZXMtPkphdmEtPkJ1aWxkIFBhdGgtPkNsYXNzcGF0aCBWYXJpYWJsZXMuCi1Vc3VhbGx5LCBPcGVuT2ZmaWNlLm9yZyB3aWxsIGJlIGluc3RhbGxlZCBpbnRvIAotImM6XFByb2dyYW0gRmlsZXNcT3Blbk9mZmljZS5vcmcgPHZlcnNpb24+Ii4KLQotPGV4YW1wbGU+Ci0KLU5hbWU6IE9PT19IT01FCi1QYXRoOiBjOlxQcm9ncmFtIEZpbGVzXE9wZW5PZmZpY2Uub3JnIDIuMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvb29vL09Pb0NvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvb29vL09Pb0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTkwY2VjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL29vby9PT29Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIE5vcmltYXNhIEhBWUFTSElEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMub29vOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5iYXNlLk9ERkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLmNvbnZlcnRlci5PREZDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuY29udmVydGVyLk9ERkNvbnZlcnRlckNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLm9vby51dGlsLk9ERkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMub29vLnV0aWwuT09vTmF2aWdhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLklNb2RlbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5JTW9kZWxTZXJ2aWNlSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuSU1vZGVsU2VydmljZVNjcm9sbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5JbWFnZVBvc2l0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vLmluaXRpYWxpemVyLnV0aWwuT09vRWRpdG9ySW5pdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgT09vQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSU1vZGVsU2VydmljZSB7Ci0JcHJpdmF0ZSBPT29XaW5kb3dDb21wb3NpdGUgX29Pb1dpbmRvd0NvbXBvc2l0ZSA9IG51bGw7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBfY29tcDsKLQotCXByaXZhdGUgT09vRWRpdG9yU2Nyb2xsTWFuYWdlciBzY3JvbGxNYW5hZ2VyOwotCi0JT09vRWRpdG9yVG9vbGJhciBfdG9vbGJhcjsKLQotCXByaXZhdGUgU3RyaW5nIGxhc3RVUkwgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGUgPSAiIjsKLQkKLQlwcml2YXRlIElNb2RlbFNlcnZpY2VIb2xkZXIgaG9sZGVyOwotCi0JcHVibGljIE9Pb0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIElNb2RlbFNlcnZpY2VIb2xkZXIgaG9sZGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlpZiAoT09vRWRpdG9ySW5pdFV0aWwuaXNPT29JbnN0YWxsZWQodHJ1ZSkpIHsKLQkJCWluaXQoKTsKLQkJfQotCQl0aGlzLmhvbGRlciA9IGhvbGRlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJdGhpcy5fdG9vbGJhciA9IG5ldyBPT29FZGl0b3JUb29sYmFyKHRoaXMsIHRoaXMsIFNXVC5OT05FLCB0cnVlKTsKLQkJdGhpcy5fY29tcCA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULkVNQkVEREVEKTsKLQkJdGhpcy5fY29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdHJ5IHsKLQkJCXRoaXMuX2NvbXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQkJdGhpcy5fb09vV2luZG93Q29tcG9zaXRlID0gbmV3IE9Pb1dpbmRvd0NvbXBvc2l0ZSh0aGlzLl9jb21wLAotCQkJCQlTV1QuRU1CRURERUQpOwotCQkJdGhpcy5fb09vV2luZG93Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLAotCQkJCQlTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQkJc2Nyb2xsTWFuYWdlciA9IG5ldyBPT29FZGl0b3JTY3JvbGxNYW5hZ2VyKHRoaXMuX29Pb1dpbmRvd0NvbXBvc2l0ZSk7Ci0JCX0gY2F0Y2ggKE9ERkV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQkvLyB0aGlzLl9vT29CZWFuUGFuZWwuY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydE1JTUVUeXBlcygpIHsKLQkJcmV0dXJuIE1JTUVUWVBFU19PREY7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gRVhUU19PREY7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbihTdHJpbmcgdXJsKSB7Ci0JCWlmIChudWxsICE9IHVybCAmJiBudWxsICE9IHRoaXMuX29Pb1dpbmRvd0NvbXBvc2l0ZSkgewotCQkJLy8gbW92ZSB0aGlzIHVybCBmb3JtYXQgdG8gT09vV2luZG93Q29tcG9zaXRlOjpsb2FkCi0JCQkvKgotCQkJICogaWYgKDAgIT0gdXJsLmluZGV4T2YoInByaXZhdGU6IikgJiYgMCAhPSB1cmwuaW5kZXhPZigiZmlsZTovLy8iKSkgewotCQkJICogdHJ5IHsgRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUodXJsKTsgU3RyaW5nQnVmZmVyIHNiID0gbmV3Ci0JCQkgKiBTdHJpbmdCdWZmZXIoImZpbGU6Ly8vIik7Ci0JCQkgKiBzYi5hcHBlbmQoc3JjRmlsZS5nZXRDYW5vbmljYWxQYXRoKCkucmVwbGFjZSgnXFwnLCAnLycpKTsgdXJsID0KLQkJCSAqIHNiLnRvU3RyaW5nKCk7IGlmICghc3JjRmlsZS5jYW5SZWFkKCkpIHsgcmV0dXJuOyB9IH0gY2F0Y2gKLQkJCSAqIChJT0V4Y2VwdGlvbiBpb2UpIHsgaW9lLnByaW50U3RhY2tUcmFjZSgpOyByZXR1cm47IH0gfQotCQkJICovCi0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmwpOwotCQkJaWYgKChudWxsICE9IGZpbGUpICYmIChmaWxlLmV4aXN0cygpKSkgewotCQkJCXRoaXMuX29Pb1dpbmRvd0NvbXBvc2l0ZS5vcGVuKHVybCk7Ci0JCQkJdGhpcy5fdG9vbGJhci5nZXRBZGRyZXNzVGV4dCgpLnNldFRleHQodXJsKTsKLQotCQkJCS8vIE9ERkJyb3dzZXJFZGl0b3Igb2RmQnJvd3NlckVkaXRvciA9Ci0JCQkJLy8gT0RGQnJvd3NlckVkaXRvck1hbmFnZXIuZ2V0T0RGRWRpdG9yUGFydCh1cmwpOwotCQkJCS8vIG9kZkJyb3dzZXJFZGl0b3IuY2hhbmdlVGl0bGUodXJsKTsKLQotCQkJCXRpdGxlQ2hhbmdlKGZpbGUuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oRmlsZSB0YXJnZXQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCWlmIChudWxsICE9IF9vT29XaW5kb3dDb21wb3NpdGUpIHsKLQkJCXJldHVybiB0aGlzLl9vT29XaW5kb3dDb21wb3NpdGUuZ2V0VXJsKCk7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLQotCXB1YmxpYyBMaXN0PEVsZW1lbnQ+IGdldEVsZW1MaXN0KE5vZGUgcm9vdCkgewotCQlMaXN0PEVsZW1lbnQ+IGVsZW1MaXN0ID0gbmV3IEFycmF5TGlzdDxFbGVtZW50PigpOwotCi0JCU5vZGVMaXN0IG5sID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBub2RlID0gbmwuaXRlbShpKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCWVsZW1MaXN0LmFkZCgoRWxlbWVudCkgbm9kZSk7Ci0JCQl9Ci0JCQlpZiAobm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQllbGVtTGlzdC5hZGRBbGwoZ2V0RWxlbUxpc3Qobm9kZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtTGlzdDsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCVN0cmluZyBjdXJyZW50VVJMID0gZ2V0VVJMKCk7Ci0JCWlmIChjdXJyZW50VVJMID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT09vTmF2aWdhdGlvbiBvb29OYXZpZ2F0aW9uID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRPb29OYXZpZ2F0aW9uKCk7Ci0JCU9ERkRvY3VtZW50IG9kZkRvYyA9IG9vb05hdmlnYXRpb24uZ2V0Q29udGVudFhNTCgpOwotCQlpZiAoKG9kZkRvYyAhPSBudWxsKSAmJiAoY3VycmVudFVSTC5lcXVhbHMobGFzdFVSTCkpKQotCQkJcmV0dXJuIG9kZkRvYzsKLQotCQkvLyBjcmVhdGUgT0RGIERvY3VtZW50IGJ5IE9ERiBBUEkKLQkJT0RGUGFyc2VyIG9kZlBhcnNlciA9IG5ldyBPREZQYXJzZXIoKTsKLQkJb2RmRG9jID0gb2RmUGFyc2VyLmdldERvY3VtZW50KGN1cnJlbnRVUkwpOwotCQkvLyBzZXQgSUQgdG8gZWFjaCBPREYgZWxlbWVudAotCQkvKgotCQkgKiBOb2RlSXRlcmF0b3Igbm9kZUl0ZXIgPSAoKERvY3VtZW50VHJhdmVyc2FsKQotCQkgKiBvZGZEb2MpLmNyZWF0ZU5vZGVJdGVyYXRvcihvZGZEb2MsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULCBudWxsLAotCQkgKiBmYWxzZSk7IGludCBjb250ZW50SUQgPSAwOyBOb2RlIG5vZGUgPSBub2RlSXRlci5uZXh0Tm9kZSgpOyB3aGlsZQotCQkgKiAobm9kZSAhPSBudWxsKSB7ICgoRWxlbWVudCkKLQkJICogbm9kZSkuc2V0QXR0cmlidXRlKE9ERkNvbnN0YW50cy5PREZfQ09OVEVOVF9JRCwgbmV3Ci0JCSAqIEludGVnZXIoY29udGVudElEKS50b1N0cmluZygpKTsgbm9kZSA9IG5vZGVJdGVyLm5leHROb2RlKCk7Ci0JCSAqIGNvbnRlbnRJRCsrOyB9Ci0JCSAqLwotCQlpbnQgY29udGVudElEID0gMDsKLQkJTGlzdDxFbGVtZW50PiBlbGVtTGlzdCA9IGdldEVsZW1MaXN0KG9kZkRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUVsZW1lbnQgZWxlbSA9IGVsZW1MaXN0LmdldChpKTsKLQkJCWVsZW0uc2V0QXR0cmlidXRlKE9ERkNvbnZlcnRlci5PVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRCwKLQkJCQkJbmV3IEludGVnZXIoY29udGVudElEKS50b1N0cmluZygpKTsKLQkJCWNvbnRlbnRJRCsrOwotCQl9Ci0KLQkJb29vTmF2aWdhdGlvbi5zZXRDb250ZW50WE1MKG9kZkRvYyk7Ci0JCWxhc3RVUkwgPSBjdXJyZW50VVJMOwotCQlyZXR1cm4gb2RmRG9jOwotCX0KLQotCXB1YmxpYyBEb2N1bWVudCBnZXRMaXZlRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb21wb3NpdGUgZ2V0VGFyZ2V0Q29tcG9zaXRlKCkgewotCQlyZXR1cm4gX2NvbXA7Ci0JfQotCi0JcHVibGljIEZpbGUgc2F2ZURvY3VtZW50QXNIVE1MRmlsZShTdHJpbmcgZmlsZSkgewotCQlpZiAobnVsbCA9PSBmaWxlKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gVE9ETwotCQkvLyBzZXRTdGF0dXNNZXNzYWdlKE9kZlBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiT0RGRWRpdG9yLmNvbnZlcnRIVE1MIikpOwotCi0JCS8vIFRPRE8gZmlsZSBjaGVjawotCQlPREZEb2N1bWVudCBvZGZEb2MgPSAoT0RGRG9jdW1lbnQpIGdldERvY3VtZW50KCk7Ci0JCU9ERkNvbnZlcnRlciBvZGZDb252ZXJ0ZXIgPSBPREZDb252ZXJ0ZXJDcmVhdG9yLmNyZWF0ZUhUTUxDb252ZXJ0ZXIoKTsKLQkJb2RmQ29udmVydGVyLnNldERvY3VtZW50KG9kZkRvYyk7Ci0JCW9kZkNvbnZlcnRlci5jb252ZXJ0RG9jdW1lbnQoZmlsZSwgZmFsc2UpOwotCQlyZXR1cm4gKG5ldyBGaWxlKGZpbGUpKTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsU2VydmljZVNjcm9sbE1hbmFnZXIgZ2V0U2Nyb2xsTWFuYWdlcigpIHsKLQkJcmV0dXJuIHNjcm9sbE1hbmFnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQganVtcFRvTm9kZShOb2RlIHRhcmdldCkgewotCQlpZiAobnVsbCAhPSB0YXJnZXQpIHsKLQkJCW5ldyBPT29OYXZpZ2F0aW9uVGhyZWFkKHRhcmdldCkuc3RhcnQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgT09vTmF2aWdhdGlvblRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0KLQkJcHJpdmF0ZSBOb2RlIF90YXJnZXROb2RlOwotCi0JCXB1YmxpYyBPT29OYXZpZ2F0aW9uVGhyZWFkKE5vZGUgdGFyZ2V0Tm9kZSkgewotCQkJdGhpcy5fdGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCV9vT29XaW5kb3dDb21wb3NpdGUuZ2V0T29vTmF2aWdhdGlvbigpLmp1bXBUb1Byb2JsZW1Qb3NpdGlvbigKLQkJCQkJCV90YXJnZXROb2RlKTsKLQkJCX0gY2F0Y2ggKE9ERkV4Y2VwdGlvbiBvZGZlKSB7Ci0JCQkJb2RmZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudE1JTUVUeXBlKCkgewotCQkvLyBUT0RPIHJldHVybiBhY3R1YWwgTUlNRSB0eXBlCi0JCXJldHVybiBNSU1FVFlQRVNfT0RGWzBdOwotCX0KLQotCXByaXZhdGUgdm9pZCB0aXRsZUNoYW5nZShTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQlob2xkZXIuc2V0RWRpdG9yVGl0bGUodGl0bGUpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIE9Pb0NvbXBvc2l0ZS5jbGFzcy5nZXROYW1lKCkgKyAiOiIgKyB0aGlzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBzYXZlT3JpZ2luYWxEb2N1bWVudChTdHJpbmcgZmlsZSkgewotCQkvLyBUT0RPIGltcGwKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlUG9zaXRpb25JbmZvW10gZ2V0QWxsSW1hZ2VQb3NpdGlvbigpIHsKLQkJLy8gVE9ETyBpbXBsCi0JCXJldHVybiBuZXcgSW1hZ2VQb3NpdGlvbkluZm9bMF07Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5JTW9kZWxTZXJ2aWNlI2dldE1vZGVsU2VydmljZUhvbGRlcigpCi0JICovCi0JcHVibGljIElNb2RlbFNlcnZpY2VIb2xkZXIgZ2V0TW9kZWxTZXJ2aWNlSG9sZGVyKCkgewotCQlyZXR1cm4gaG9sZGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvb29vL09Pb0VkaXRvckNvbnRyaWJ1dG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9vb28vT09vRWRpdG9yQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkMDE1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9vb28vT09vRWRpdG9yQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgTm9yaW1hc2EgSEFZQVNISURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMub29vOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5hY3Rpb25zLk9wZW5PREZBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi1wdWJsaWMgY2xhc3MgT09vRWRpdG9yQ29udHJpYnV0b3IgZXh0ZW5kcyBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciB7Ci0KLQlwdWJsaWMgT09vRWRpdG9yQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBPcGVuT0RGQWN0aW9uKCkpOwotCQkvLyB0b29sQmFyTWFuYWdlci5hZGQobmV3IEVkaXRPREZBY3Rpb24oKSk7Ci0JCS8vIHRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2F2ZU9ERkFjdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9vb28vT09vRWRpdG9yUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9vb28vT09vRWRpdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYWQ1ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvb29vL09Pb0VkaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLm9vbzsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5pbml0aWFsaXplci5raWNrZXIuSU9Pb0VkaXRvckluaXRpYWxpemVyS2lja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIE9Pb0VkaXRvclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gaW1wbGVtZW50cyBJT09vRWRpdG9ySW5pdGlhbGl6ZXJLaWNrZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28iOwotCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE9Pb0VkaXRvclBsdWdpbiBwbHVnaW47Ci0JCi0gICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBfcmVzb3VyY2VCdW5kbGU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IF9jb250ZXh0OwotICAgIAotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgT09vRWRpdG9yUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCQkKLQkJLy9PT29FZGl0b3JJbml0VXRpbCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBieSB1c2luZyBkdW1teSBpbnRlcmZhY2UrTGF6eVN0YXJ0CQkKLS8vCQlpZighT09vRWRpdG9ySW5pdFV0aWwuaXNJbml0aWFsaXplZCgpKXsKLS8vCQkJU3lzdGVtLmVyci5wcmludGxuKCJQbGVhc2UgY2FsbCBPT29FZGl0b3JJbml0VXRpbC5pbml0KCkgYmVmb3JlIHVzaW5nIE9Pb0VkaXRvci4iKTsKLS8vCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIF9jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotICAgICAgICBfY29udGV4dCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT09vRWRpdG9yUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIHBhdGgpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0gICAgICAgIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IE9Pb0VkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiAobnVsbCAhPSBidW5kbGUpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7Ci0gICAgICAgICAgICByZXR1cm4gIj8/PyIgKyBrZXkgKyAiPz8/IjsKLSAgICAgICAgfQotICAgIH0gICAgCi0gICAgCi0gICAgcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotICAgICAgICBpZiAobnVsbCA9PSBfcmVzb3VyY2VCdW5kbGUgJiYgbnVsbCAhPSBfY29udGV4dCkgewotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IF9jb250ZXh0LmdldEJ1bmRsZSgpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gYnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgX3Jlc291cmNlQnVuZGxlID0gUGxhdGZvcm0uZ2V0UmVzb3VyY2VCdW5kbGUoYnVuZGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfcmVzb3VyY2VCdW5kbGU7Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL29vby9PT29FZGl0b3JTY3JvbGxNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9vb28vT09vRWRpdG9yU2Nyb2xsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTlmZGRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL29vby9PT29FZGl0b3JTY3JvbGxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5vb287Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGQ29uc3RhbnRzLkNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLk9ERkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMub29vLnV0aWwuT0RGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuSU1vZGVsU2VydmljZVNjcm9sbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5Nb2RlbFNlcnZpY2VTaXplSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLnV0aWwuU2Nyb2xsQmFyU2l6ZVV0aWw7Ci0KLWltcG9ydCBjb20uc3VuLnN0YXIuYWNjZXNzaWJpbGl0eS5YQWNjZXNzaWJsZUFjdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIubGFuZy5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgT09vRWRpdG9yU2Nyb2xsTWFuYWdlciBpbXBsZW1lbnRzIElNb2RlbFNlcnZpY2VTY3JvbGxNYW5hZ2VyIHsKLQotCU9Pb1dpbmRvd0NvbXBvc2l0ZSBfb09vV2luZG93Q29tcG9zaXRlOwotCi0JcHVibGljIE9Pb0VkaXRvclNjcm9sbE1hbmFnZXIoT09vV2luZG93Q29tcG9zaXRlIG9Pb1dpbmRvd0NvbXBvc2l0ZSkgewotCQlfb09vV2luZG93Q29tcG9zaXRlID0gb09vV2luZG93Q29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFic29sdXRlQ29vcmRpbmF0ZVNjcm9sbChpbnQgeSwgYm9vbGVhbiB3YWl0UmVuZGVyaW5nKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgYWJzb2x1dGVDb29yZGluYXRlU2Nyb2xsKGludCB4LCBpbnQgeSwgYm9vbGVhbiB3YWl0UmVuZGVyaW5nKSB7Ci0JfQotCi0JcHVibGljIGludCBpbmNyZW1lbnRTY3JvbGxYKGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotCQlTdHJpbmcgc1VybCA9IF9vT29XaW5kb3dDb21wb3NpdGUuZ2V0VXJsKCk7Ci0JCWlmIChDb250ZW50VHlwZS5TUFJFQURTSEVFVC5lcXVhbHMoT0RGRmlsZVV0aWxzLmdldE9ERkZpbGVUeXBlKHNVcmwpKSkgewotCQkJcmV0dXJuIC0xOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGRvU2Nyb2xsQWN0aW9uKDAsCi0JCQkJCU9Pb1dpbmRvd0NvbXBvc2l0ZS5BQ1RJT05fU0NST0xMX0lOQ1JFTUVOVF9MSU5FKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZGVjcmVtZW50U2Nyb2xsWChib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLQkJU3RyaW5nIHNVcmwgPSBfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpOwotCQlpZiAoQ29udGVudFR5cGUuU1BSRUFEU0hFRVQuZXF1YWxzKE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShzVXJsKSkpIHsKLQkJCXJldHVybiAtMTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBkb1Njcm9sbEFjdGlvbigwLAotCQkJCQlPT29XaW5kb3dDb21wb3NpdGUuQUNUSU9OX1NDUk9MTF9ERUNSRU1FTlRfTElORSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGluY3JlbWVudFNjcm9sbFkoYm9vbGVhbiB3YWl0UmVuZGVyaW5nKSB7Ci0JCVN0cmluZyBzVXJsID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRVcmwoKTsKLQkJaWYgKENvbnRlbnRUeXBlLlNQUkVBRFNIRUVULmVxdWFscyhPREZGaWxlVXRpbHMuZ2V0T0RGRmlsZVR5cGUoc1VybCkpKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZG9TY3JvbGxBY3Rpb24oMSwKLQkJCQkJT09vV2luZG93Q29tcG9zaXRlLkFDVElPTl9TQ1JPTExfSU5DUkVNRU5UX0xJTkUpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBkZWNyZW1lbnRTY3JvbGxZKGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotCQlTdHJpbmcgc1VybCA9IF9vT29XaW5kb3dDb21wb3NpdGUuZ2V0VXJsKCk7Ci0JCWlmIChDb250ZW50VHlwZS5TUFJFQURTSEVFVC5lcXVhbHMoT0RGRmlsZVV0aWxzLmdldE9ERkZpbGVUeXBlKHNVcmwpKSkgewotCQkJcmV0dXJuIC0xOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGRvU2Nyb2xsQWN0aW9uKDEsCi0JCQkJCU9Pb1dpbmRvd0NvbXBvc2l0ZS5BQ1RJT05fU0NST0xMX0RFQ1JFTUVOVF9MSU5FKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgaW5jcmVtZW50TGFyZ2VTY3JvbGxYKGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotCQlTdHJpbmcgc1VybCA9IF9vT29XaW5kb3dDb21wb3NpdGUuZ2V0VXJsKCk7Ci0JCUNvbnRlbnRUeXBlIG9kZkZpbGVUeXBlID0gT0RGRmlsZVV0aWxzLmdldE9ERkZpbGVUeXBlKHNVcmwpOwotCQlpZiAoKENvbnRlbnRUeXBlLlNQUkVBRFNIRUVULmVxdWFscyhvZGZGaWxlVHlwZSkpCi0JCQkJfHwgKENvbnRlbnRUeXBlLlBSRVNFTlRBVElPTi5lcXVhbHMob2RmRmlsZVR5cGUpKSkgewotCQkJcmV0dXJuIC0xOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGRvU2Nyb2xsQWN0aW9uKDAsCi0JCQkJCU9Pb1dpbmRvd0NvbXBvc2l0ZS5BQ1RJT05fU0NST0xMX0lOQ1JFTUVOVF9CTE9DSyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGRlY3JlbWVudExhcmdlU2Nyb2xsWChib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLQkJU3RyaW5nIHNVcmwgPSBfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpOwotCQlDb250ZW50VHlwZSBvZGZGaWxlVHlwZSA9IE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShzVXJsKTsKLQkJaWYgKChDb250ZW50VHlwZS5TUFJFQURTSEVFVC5lcXVhbHMob2RmRmlsZVR5cGUpKQotCQkJCXx8IChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKG9kZkZpbGVUeXBlKSkpIHsKLQkJCXJldHVybiAtMTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBkb1Njcm9sbEFjdGlvbigwLAotCQkJCQlPT29XaW5kb3dDb21wb3NpdGUuQUNUSU9OX1NDUk9MTF9ERUNSRU1FTlRfQkxPQ0spOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBpbmNyZW1lbnRMYXJnZVNjcm9sbFkoYm9vbGVhbiB3YWl0UmVuZGVyaW5nKSB7Ci0JCVN0cmluZyBzVXJsID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRVcmwoKTsKLQkJQ29udGVudFR5cGUgb2RmRmlsZVR5cGUgPSBPREZGaWxlVXRpbHMuZ2V0T0RGRmlsZVR5cGUoc1VybCk7Ci0JCWlmIChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKG9kZkZpbGVUeXBlKSkgewotCQkJX29Pb1dpbmRvd0NvbXBvc2l0ZS5zZXREcmF3aW5nTW9kZSgpOwotCQkJcmV0dXJuIF9vT29XaW5kb3dDb21wb3NpdGUubW92ZVByZXNlbnRhdGlvblBhZ2UodHJ1ZSk7Ci0JCX0gZWxzZSBpZiAoQ29udGVudFR5cGUuU1BSRUFEU0hFRVQuZXF1YWxzKG9kZkZpbGVUeXBlKSkgewotCQkJcmV0dXJuIC0xOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGRvU2Nyb2xsQWN0aW9uKDEsCi0JCQkJCU9Pb1dpbmRvd0NvbXBvc2l0ZS5BQ1RJT05fU0NST0xMX0lOQ1JFTUVOVF9CTE9DSyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGRlY3JlbWVudExhcmdlU2Nyb2xsWShib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLQkJU3RyaW5nIHNVcmwgPSBfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpOwotCQlDb250ZW50VHlwZSBvZGZGaWxlVHlwZSA9IE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShzVXJsKTsKLQkJaWYgKENvbnRlbnRUeXBlLlBSRVNFTlRBVElPTi5lcXVhbHMob2RmRmlsZVR5cGUpKSB7Ci0JCQlfb09vV2luZG93Q29tcG9zaXRlLnNldERyYXdpbmdNb2RlKCk7Ci0JCQlyZXR1cm4gX29Pb1dpbmRvd0NvbXBvc2l0ZS5tb3ZlUHJlc2VudGF0aW9uUGFnZShmYWxzZSk7Ci0JCX0gZWxzZSBpZiAoQ29udGVudFR5cGUuU1BSRUFEU0hFRVQuZXF1YWxzKG9kZkZpbGVUeXBlKSkgewotCQkJcmV0dXJuIC0xOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGRvU2Nyb2xsQWN0aW9uKDEsCi0JCQkJCU9Pb1dpbmRvd0NvbXBvc2l0ZS5BQ1RJT05fU0NST0xMX0RFQ1JFTUVOVF9CTE9DSyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGRlY3JlbWVudFBhZ2VTY3JvbGwoYm9vbGVhbiB3YWl0UmVuZGVyaW5nKSB7Ci0JCVN0cmluZyBzVXJsID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRVcmwoKTsKLQkJQ29udGVudFR5cGUgb2RmRmlsZVR5cGUgPSBPREZGaWxlVXRpbHMuZ2V0T0RGRmlsZVR5cGUoc1VybCk7Ci0JCWlmIChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKG9kZkZpbGVUeXBlKSkgewotCQkJX29Pb1dpbmRvd0NvbXBvc2l0ZS5zZXREcmF3aW5nTW9kZSgpOwotCQkJaW50IHJlc3VsdCA9IF9vT29XaW5kb3dDb21wb3NpdGUubW92ZVByZXNlbnRhdGlvblBhZ2UoZmFsc2UpOwotCQkJaWYgKHdhaXRSZW5kZXJpbmcpCi0JCQkJd2FpdFJlbmRlcmluZygpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGludCBpbmNyZW1lbnRQYWdlU2Nyb2xsKGJvb2xlYW4gd2FpdFJlbmRlcmluZykgewotCQlTdHJpbmcgc1VybCA9IF9vT29XaW5kb3dDb21wb3NpdGUuZ2V0VXJsKCk7Ci0JCUNvbnRlbnRUeXBlIG9kZkZpbGVUeXBlID0gT0RGRmlsZVV0aWxzLmdldE9ERkZpbGVUeXBlKHNVcmwpOwotCQlpZiAoQ29udGVudFR5cGUuUFJFU0VOVEFUSU9OLmVxdWFscyhvZGZGaWxlVHlwZSkpIHsKLQkJCV9vT29XaW5kb3dDb21wb3NpdGUuc2V0RHJhd2luZ01vZGUoKTsKLQkJCWludCByZXN1bHQgPSBfb09vV2luZG93Q29tcG9zaXRlLm1vdmVQcmVzZW50YXRpb25QYWdlKHRydWUpOwotCQkJaWYgKHdhaXRSZW5kZXJpbmcpCi0JCQkJd2FpdFJlbmRlcmluZygpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGludCBqdW1wVG9QYWdlKGludCBwYWdlTnVtYmVyLCBib29sZWFuIHdhaXRSZW5kZXJpbmcpIHsKLQkJaWYgKENvbnRlbnRUeXBlLlBSRVNFTlRBVElPTi5lcXVhbHMoT0RGRmlsZVV0aWxzCi0JCQkJLmdldE9ERkZpbGVUeXBlKF9vT29XaW5kb3dDb21wb3NpdGUuZ2V0VXJsKCkpKSkgewotCQkJX29Pb1dpbmRvd0NvbXBvc2l0ZS5zZXREcmF3aW5nTW9kZSgpOwotCQkJaW50IHJlc3VsdCA9IF9vT29XaW5kb3dDb21wb3NpdGUuanVtcFRvUHJlc2VudGF0aW9uUGFnZShwYWdlTnVtYmVyKTsKLQkJCWlmICh3YWl0UmVuZGVyaW5nKQotCQkJCXdhaXRSZW5kZXJpbmcoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q3VycmVudFBhZ2VOdW1iZXIoKSB7Ci0JCWlmIChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKE9ERkZpbGVVdGlscwotCQkJCS5nZXRPREZGaWxlVHlwZShfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpKSkpIHsKLQkJCXJldHVybiBfb09vV2luZG93Q29tcG9zaXRlLmdldEN1cnJlbnRQYWdlTnVtYmVyKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGFzdFBhZ2VOdW1iZXIoKSB7Ci0JCWlmIChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKE9ERkZpbGVVdGlscwotCQkJCS5nZXRPREZGaWxlVHlwZShfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpKSkpIHsKLQkJCXJldHVybiBfb09vV2luZG93Q29tcG9zaXRlLmdldFByZXNlbnRhdGlvblBhZ2VDb3VudCgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNjcm9sbFR5cGUoKSB7Ci0JCVN0cmluZyBzVXJsID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRVcmwoKTsKLQkJaWYgKHNVcmwgPT0gbnVsbCkKLQkJCXJldHVybiBOT05FOwotCi0JCWlmIChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKE9ERkZpbGVVdGlscy5nZXRPREZGaWxlVHlwZShzVXJsKSkpIHsKLQkJCXJldHVybiBQQUdFOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIE5PTkU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBkb1Njcm9sbEFjdGlvbihpbnQgYXhpcywgaW50IGFjdGlvbikgewotCQlpbnRbXSBwcmV2Vmlld0RhdGEgPSBfb09vV2luZG93Q29tcG9zaXRlLmdldFZpZXdEYXRhKCk7Ci0JCWlmIChwcmV2Vmlld0RhdGEgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlYQWNjZXNzaWJsZUFjdGlvbltdIHNjcm9sbEFjdGlvbiA9IF9vT29XaW5kb3dDb21wb3NpdGUKLQkJCQkuZ2V0U2Nyb2xsQWN0aW9uKCk7Ci0JCWlmICgoc2Nyb2xsQWN0aW9uID09IG51bGwpIHx8IChzY3JvbGxBY3Rpb24ubGVuZ3RoIDw9IGF4aXMpCi0JCQkJfHwgKHNjcm9sbEFjdGlvbltheGlzXSA9PSBudWxsKSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXNjcm9sbEFjdGlvbltheGlzXS5kb0FjY2Vzc2libGVBY3Rpb24oYWN0aW9uKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWludFtdIHZpZXdEYXRhID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRWaWV3RGF0YSgpOwotCQlyZXR1cm4gTWF0aC5hYnModmlld0RhdGFbYXhpc10gLSBwcmV2Vmlld0RhdGFbYXhpc10pOwotCX0KLQotCXB1YmxpYyBNb2RlbFNlcnZpY2VTaXplSW5mbyBnZXRTaXplKGJvb2xlYW4gaXNXaG9sZSkgewotCQkvLyBpbml0aWFsaXplIHdpbmRvdyBzZXR0aW5nCi0JCWlmIChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKE9ERkZpbGVVdGlscwotCQkJCS5nZXRPREZGaWxlVHlwZShfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpKSkpIHsKLQkJCV9vT29XaW5kb3dDb21wb3NpdGUuc2V0RHJhd2luZ01vZGUoKTsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCS8vIHN0YXJ0IGNhbGN1bGF0ZSB3aW5kb3cgc2l6ZQotCQlpbnRbXSB3aW5TaXplOwotCQl0cnkgewotCQkJd2luU2l6ZSA9IF9vT29XaW5kb3dDb21wb3NpdGUuZ2V0T09vV2luU2l6ZSgpOwotCQl9IGNhdGNoIChPREZFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIChuZXcgTW9kZWxTZXJ2aWNlU2l6ZUluZm8oMCwgMCwgMCwgMCkpOwotCQl9Ci0JCWludCBiYXJXaWR0aCA9IFNjcm9sbEJhclNpemVVdGlsLmdldFZlcnRpY2FsQmFyV2lkdGgoKTsKLQkJaW50IGJhckhlaWdodCA9IFNjcm9sbEJhclNpemVVdGlsLmdldEhvcml6b250YWxCYXJIZWlnaHQoKTsKLQkJTW9kZWxTZXJ2aWNlU2l6ZUluZm8gdmlld1NpemUgPSBuZXcgTW9kZWxTZXJ2aWNlU2l6ZUluZm8od2luU2l6ZVswXQotCQkJCS0gYmFyV2lkdGgsIHdpblNpemVbMV0gLSBiYXJIZWlnaHQsIHdpblNpemVbMF0gLSBiYXJXaWR0aCwKLQkJCQl3aW5TaXplWzFdIC0gYmFySGVpZ2h0KTsKLQotCQlpZiAoaXNXaG9sZSkgewotCQkJaWYgKENvbnRlbnRUeXBlLlBSRVNFTlRBVElPTi5lcXVhbHMoT0RGRmlsZVV0aWxzCi0JCQkJCS5nZXRPREZGaWxlVHlwZShfb09vV2luZG93Q29tcG9zaXRlLmdldFVybCgpKSkpIHsKLQkJCQlpbnQgcGFnZUNvdW50ID0gX29Pb1dpbmRvd0NvbXBvc2l0ZS5nZXRQcmVzZW50YXRpb25QYWdlQ291bnQoKTsKLQkJCQlNb2RlbFNlcnZpY2VTaXplSW5mbyBzaXplID0gbmV3IE1vZGVsU2VydmljZVNpemVJbmZvKHdpblNpemVbMF0KLQkJCQkJCS0gYmFyV2lkdGgsIHdpblNpemVbMV0gLSBiYXJIZWlnaHQsIHdpblNpemVbMF0KLQkJCQkJCS0gYmFyV2lkdGgsIHdpblNpemVbMV0gKiBwYWdlQ291bnQgLSBiYXJIZWlnaHQpOwotCQkJCXJldHVybiBzaXplOwotCQkJfQotCi0JCQlfb09vV2luZG93Q29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWludCBvZmZzZXQgPSBpbmNyZW1lbnRMYXJnZVNjcm9sbFgoZmFsc2UpOwotCQkJCWlmICgob2Zmc2V0ID09IDApIHx8IChvZmZzZXQgPT0gLTEpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJaW50IG9mZnNldCA9IGluY3JlbWVudExhcmdlU2Nyb2xsWShmYWxzZSk7Ci0JCQkJaWYgKChvZmZzZXQgPT0gMCkgfHwgKG9mZnNldCA9PSAtMSkpCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpbnRbXSB2aWV3RGF0YSA9IF9vT29XaW5kb3dDb21wb3NpdGUuZ2V0Vmlld0RhdGEoKTsKLQkJCWlmICh2aWV3RGF0YSA9PSBudWxsKSB7Ci0JCQkJX29Pb1dpbmRvd0NvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCXJldHVybiB2aWV3U2l6ZTsKLQkJCX0KLQkJCU1vZGVsU2VydmljZVNpemVJbmZvIHNpemUgPSBuZXcgTW9kZWxTZXJ2aWNlU2l6ZUluZm8od2luU2l6ZVswXQotCQkJCQktIGJhcldpZHRoLCB3aW5TaXplWzFdIC0gYmFyV2lkdGgsIHZpZXdEYXRhWzJdIC0gYmFyV2lkdGgsCi0JCQkJCXZpZXdEYXRhWzNdIC0gYmFyV2lkdGgpOwotCi0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWludCBvZmZzZXQgPSBkZWNyZW1lbnRMYXJnZVNjcm9sbFgoZmFsc2UpOwotCQkJCWlmICgob2Zmc2V0ID09IDApIHx8IChvZmZzZXQgPT0gLTEpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJaW50IG9mZnNldCA9IGRlY3JlbWVudExhcmdlU2Nyb2xsWShmYWxzZSk7Ci0JCQkJaWYgKChvZmZzZXQgPT0gMCkgfHwgKG9mZnNldCA9PSAtMSkpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJX29Pb1dpbmRvd0NvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJX29Pb1dpbmRvd0NvbXBvc2l0ZS5yZWRyYXcoKTsKLQkJCXJldHVybiBzaXplOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHZpZXdTaXplOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdhaXRSZW5kZXJpbmcoKSB7Ci0JCVRocmVhZCB0bXAgPSBuZXcgVGhyZWFkKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCg3NTApOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRtcC5ydW4oKTsKLQkJdHJ5IHsKLQkJCXRtcC5qb2luKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL29vby9PT29FZGl0b3JUb29sYmFyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9vb28vT09vRWRpdG9yVG9vbGJhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmZkNjMyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL29vby9PT29FZGl0b3JUb29sYmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBOb3JpbWFzYSBIQVlBU0hJREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5vb287Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLklNb2RlbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS51dGlsLk1vZGVsU2VydmljZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBPT29FZGl0b3JUb29sYmFyIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCXByaXZhdGUgVGV4dCBfYWRkcmVzc1RleHQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gX2lzRm9jdXNPblRleHQ7Ci0KLQlwcml2YXRlIElNb2RlbFNlcnZpY2UgbW9kZWxTZXJ2aWNlOwotCi0JcHVibGljIE9Pb0VkaXRvclRvb2xiYXIoSU1vZGVsU2VydmljZSBtb2RlbFNlcnZpY2UsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgc3R5bGUsIGJvb2xlYW4gaXNFZGl0b3IpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0KLQkJdGhpcy5tb2RlbFNlcnZpY2UgPSBtb2RlbFNlcnZpY2U7Ci0KLQkJc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDE7Ci0JCWdyaWRMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXNldExheW91dChncmlkTGF5b3V0KTsKLQotCQlpbml0TGF5b3V0KGlzRWRpdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdExheW91dChib29sZWFuIGlzRWRpdG9yKSB7Ci0KLQkJTGFiZWwgYWRkcmVzc0xhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJYWRkcmVzc0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlhZGRyZXNzTGFiZWwKLQkJCQkuc2V0VGV4dCgiICIgKyBNb2RlbFNlcnZpY2VNZXNzYWdlcy5nZXRTdHJpbmcoIldlYkJyb3dzZXIuQWRkcmVzcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFkZHJlc3NMYWJlbC5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgYXJnMCkgewotCQkJCWlmIChhcmcwLnN0YXRlTWFzayA9PSBTV1QuQUxUCi0JCQkJCQkmJiAoYXJnMC5jaGFyYWN0ZXIgPT0gJ2QnIHx8IGFyZzAuY2hhcmFjdGVyID09ICdEJykpIHsKLQkJCQkJX2FkZHJlc3NUZXh0LnNldEZvY3VzKCk7Ci0JCQkJCV9hZGRyZXNzVGV4dC5zZWxlY3RBbGwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXRoaXMuX2FkZHJlc3NUZXh0ID0gbmV3IFRleHQodGhpcywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQ0VOVEVSLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDEwMjQ7Ci0JCV9hZGRyZXNzVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdGhpcy5fYWRkcmVzc1RleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgYXJnMCkgewotCQkJCV9pc0ZvY3VzT25UZXh0ID0gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgYXJnMCkgewotCQkJCV9hZGRyZXNzVGV4dC5zZWxlY3RBbGwoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdGhpcy5fYWRkcmVzc1RleHQuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGFyZzApIHsKLQkJCQlpZiAoIV9pc0ZvY3VzT25UZXh0KSB7Ci0JCQkJCV9hZGRyZXNzVGV4dC5zZWxlY3RBbGwoKTsKLQkJCQkJX2lzRm9jdXNPblRleHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCQlfYWRkcmVzc1RleHQuc2VsZWN0QWxsKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXRoaXMuX2FkZHJlc3NUZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLQkJCQkJLy8gQnJvd3NlckV2ZW50TGlzdGVuZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZmlyZU5hdmlnYXRlKF9hZGRyZXNzVGV4dC5nZXRUZXh0KCkpOwotCQkJCQltb2RlbFNlcnZpY2Uub3BlbihfYWRkcmVzc1RleHQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gc2VhcmNoIGJ1dHRvbgotCQlCdXR0b24gc2VhcmNoQnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuTlVMTCk7Ci0JCXNlYXJjaEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdldEJ1dHRvbnNHcmlkRGF0YSgpKTsKLQkJc2VhcmNoQnV0dG9uLnNldFRleHQoTW9kZWxTZXJ2aWNlTWVzc2FnZXMuZ2V0U3RyaW5nKCJXZWJCcm93c2VyLkdvIikpOyAvLyROT04tTkxTLTEkCi0JCXNlYXJjaEJ1dHRvbi5zZXRUb29sVGlwVGV4dChNb2RlbFNlcnZpY2VNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIldlYkJyb3dzZXIuR29fdHAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2VhcmNoQnV0dG9uLnNldEltYWdlKE9Pb0VkaXRvclBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKAotCQkJCSJvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpIiwgImljb25zL2Jyb3dzZXIvZ28ucG5nIikKLQkJCQkuY3JlYXRlSW1hZ2UoKSk7Ci0JCXNlYXJjaEJ1dHRvbi5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJCS8vIEJyb3dzZXJFdmVudExpc3RlbmVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmZpcmVOYXZpZ2F0ZShfYWRkcmVzc1RleHQuZ2V0VGV4dCgpKTsKLQkJCQltb2RlbFNlcnZpY2Uub3BlbihfYWRkcmVzc1RleHQuZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfSk7Ci0JCS8vIF9jb21wb3NpdGVQYXJlbnQuZ2V0U2hlbGwoKS5zZXREZWZhdWx0QnV0dG9uKHNlYXJjaEJ1dHRvbik7Ci0JfQotCi0JcHJpdmF0ZSBHcmlkRGF0YSBnZXRCdXR0b25zR3JpZERhdGEoKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAzMjsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzI7Ci0KLQkJcmV0dXJuIGdyaWREYXRhOwotCX0KLQotCXB1YmxpYyBUZXh0IGdldEFkZHJlc3NUZXh0KCkgewotCQlyZXR1cm4gdGhpcy5fYWRkcmVzc1RleHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvb29vL09Pb1dpbmRvd0NvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvb29vL09Pb1dpbmRvd0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTE3MjRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL29vby9PT29XaW5kb3dDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRhdHN1eWEgSVNISUhBUkEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMub29vOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuT0RGUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHMuQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm1hbmlmZXN0Lk1hbmlmZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi51dGlsLk9ERkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMub29vLnV0aWwuQm9vdHN0cmFwRm9yT09vQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5vb28udXRpbC5PREZFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLm9vby51dGlsLk9ERlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5vb28udXRpbC5PT29OYXZpZ2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5vb28udXRpbC5PT29VSUNvbnRyb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgY29tLnN1bi5zdGFyLmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZVJvbGU7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmFjY2Vzc2liaWxpdHkuWEFjY2Vzc2libGU7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmFjY2Vzc2liaWxpdHkuWEFjY2Vzc2libGVBY3Rpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmFjY2Vzc2liaWxpdHkuWEFjY2Vzc2libGVDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4uc3Rhci5hd3QuUG9zU2l6ZTsKLWltcG9ydCBjb20uc3VuLnN0YXIuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBjb20uc3VuLnN0YXIuYXd0LlhTeXN0ZW1DaGlsZEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmF3dC5YVG9vbGtpdDsKLWltcG9ydCBjb20uc3VuLnN0YXIuYXd0LlhXaW5kb3c7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmF3dC5YV2luZG93UGVlcjsKLWltcG9ydCBjb20uc3VuLnN0YXIuYmVhbnMuUHJvcGVydHlWYWx1ZTsKLWltcG9ydCBjb20uc3VuLnN0YXIuYmVhbnMuVW5rbm93blByb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5iZWFucy5YUHJvcGVydHlTZXQ7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmNvbXAuaGVscGVyLkJvb3RzdHJhcEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIuZHJhd2luZy5YRHJhd1BhZ2U7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmRyYXdpbmcuWERyYXdQYWdlczsKLWltcG9ydCBjb20uc3VuLnN0YXIuZHJhd2luZy5YRHJhd1BhZ2VzU3VwcGxpZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmRyYXdpbmcuWERyYXdWaWV3OwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5GcmFtZVNlYXJjaEZsYWc7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmZyYW1lLlhDb21wb25lbnRMb2FkZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmZyYW1lLlhDb250cm9sbGVyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YRGVza3RvcDsKLWltcG9ydCBjb20uc3VuLnN0YXIuZnJhbWUuWEZyYW1lOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YRnJhbWVzOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YRnJhbWVzU3VwcGxpZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuRGlzcG9zZWRFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIubGFuZy5TeXN0ZW1EZXBlbmRlbnQ7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuV3JhcHBlZFRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIubGFuZy5YQ29tcG9uZW50OwotaW1wb3J0IGNvbS5zdW4uc3Rhci5sYW5nLlhNdWx0aVNlcnZpY2VGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4uc3Rhci5zaGVldC5YU3ByZWFkc2hlZXRWaWV3OwotaW1wb3J0IGNvbS5zdW4uc3Rhci50ZXh0LlhUZXh0RG9jdW1lbnQ7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnVuby5FeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnVuby5Vbm9SdW50aW1lOwotaW1wb3J0IGNvbS5zdW4uc3Rhci51dGlsLkNsb3NlVmV0b0V4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIudXRpbC5YQ2xvc2VhYmxlOwotCi1wdWJsaWMgY2xhc3MgT09vV2luZG93Q29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fU0NST0xMX0RFQ1JFTUVOVF9MSU5FID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fU0NST0xMX0lOQ1JFTUVOVF9MSU5FID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fU0NST0xMX0RFQ1JFTUVOVF9CTE9DSyA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1NDUk9MTF9JTkNSRU1FTlRfQkxPQ0sgPSAzOwotCQotCXByaXZhdGUgWERlc2t0b3AgeERlc2t0b3AgPSBudWxsOwotICAgIHByaXZhdGUgWE11bHRpU2VydmljZUZhY3RvcnkgeE1TRiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBPT29XaW5kb3cgb29vV2luID0gbnVsbDsKLSAgICBwcml2YXRlIFhGcmFtZSB4RnJhbWUgPSBudWxsOwotICAgIHByaXZhdGUgWENvbXBvbmVudCB4Q29tcG9uZW50ID0gbnVsbDsKLSAgICBwcml2YXRlIFhBY2Nlc3NpYmxlQWN0aW9uW10gc2Nyb2xsQWN0aW9uID0gbnVsbDsKLQotICAgIHByaXZhdGUgU3RyaW5nIF91cmwgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgT09vTmF2aWdhdGlvbiBvb29OYXZpZ2F0aW9uID0gbnVsbDsKLSAgICAKLQlwdWJsaWMgT09vV2luZG93Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgdGhyb3dzIE9ERkV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlpbml0KCk7Ci0JCWFkZENvbnRyb2xMaXN0ZW5lcihuZXcgT09vV2luZG93Q29udHJvbExpc3RlbmVyKCkpOwotICAgICAgICBhZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAJZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIE9ERkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IE9ERlV0aWxzLmxvYWRPcGVuT2ZmaWNlTGlicygpOwotICAgICAgICAgICAgQm9vdHN0cmFwRm9yT09vQ29tcG9zaXRlLmJvb3RzdHJhcChjbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICB4TVNGID0gQm9vdHN0cmFwRm9yT09vQ29tcG9zaXRlLmdldFhNdWx0aVNlcnZpY2VGYWN0b3J5KCk7Ci0JCQl4RGVza3RvcCA9IEJvb3RzdHJhcEZvck9Pb0NvbXBvc2l0ZS5nZXRYRGVza3RvcCgpOwotICAgICAgICB9IGNhdGNoIChCb290c3RyYXBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE9ERkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSBjbGFzcyBPT29XaW5kb3dDb250cm9sTGlzdGVuZXIgaW1wbGVtZW50cyBDb250cm9sTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCWlmIChvb29XaW4hPW51bGwpIHsKLQkJCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCQlpZiAoc291cmNlIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0JCQkJCVBvaW50IHNpemUgPSAoKENvbXBvc2l0ZSlzb3VyY2UpLmdldFNpemUoKTsKLQkJCQkJb29vV2luLnNldFNpemUoc2l6ZS54LCBzaXplLnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIAlzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIHhNU0YgPSBudWxsOwotICAgICAgICBpZiAob29vV2luIT1udWxsKSBvb29XaW4uZGlzcG9zZSgpOwotICAgIAlpZiAoeEZyYW1lIT1udWxsKSBjbG9zZUZyYW1lKCk7Ci0gICAgICAgIHhGcmFtZSA9IG51bGw7Ci0gICAgICAgIHhDb21wb25lbnQgPSBudWxsOwotICAgIAlpZiAoKHhEZXNrdG9wIT1udWxsKSYmKE9ERlV0aWxzLmdldE9wZW5PZmZpY2VGcmFtZU51bSgpPT0wKSkgewotICAgIAkJZGlzcGF0aE1lc3NhZ2VUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotICAgIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAJCQkJdHJ5IHsKLSAgICAJCQkJCXhEZXNrdG9wLnRlcm1pbmF0ZSgpOwotICAgIAkJCQl9IGNhdGNoIChEaXNwb3NlZEV4Y2VwdGlvbiBkZSkgewotICAgIAkJCQl9Ci0gICAgCQkJfX0pOwotICAgIAl9Ci0gICAgCXhEZXNrdG9wID0gbnVsbDsKLSAgICAJaWYgKHNjcm9sbEFjdGlvbiE9bnVsbCkgewotICAgIAkJZm9yIChpbnQgaT0wOyBpPHNjcm9sbEFjdGlvbi5sZW5ndGg7IGkrKykgCi0gICAgCQkJc2Nyb2xsQWN0aW9uW2ldID0gbnVsbDsKLSAgICAJfQotICAgIAlzY3JvbGxBY3Rpb24gPSBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwYXRoTWVzc2FnZVRocmVhZChSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZChydW5uYWJsZSk7Ci0gICAgICAgIHRocmVhZC5zdGFydCgpOwotICAgICAgICBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLSAgICAgICAgd2hpbGUodGhyZWFkLmlzQWxpdmUoKSkgewotICAgICAgICAgICAgZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKTsKLSAgICAgICAgICAgIHRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY2xvc2VGcmFtZSgpIHsKLSAgICAJaWYoeEZyYW1lIT1udWxsKXsKLSAgICAgICAgCWRpc3BhdGhNZXNzYWdlVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgCQlwdWJsaWMgdm9pZCBydW4oKSB7ICAgIAkJCi0gICAgICAgIAkJCVhDbG9zZWFibGUgeENsb3NlYWJsZSA9IChYQ2xvc2VhYmxlKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhDbG9zZWFibGUuY2xhc3MsIHhGcmFtZSk7Ci0gICAgICAgIAkJCWlmICh4Q2xvc2VhYmxlIT1udWxsKXsKLSAgICAgICAgCQkJCXRyeSB7Ci0gICAgICAgIAkJCQkJeENsb3NlYWJsZS5jbG9zZSh0cnVlKTsKLSAgICAgICAgCQkJCX0gY2F0Y2ggKENsb3NlVmV0b0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgCQkJCX0KLSAgICAgICAgCQkJfWVsc2V7Ci0gICAgICAgIAkJCQlYQ29tcG9uZW50IHhDb21wb25lbnQgPSAoWENvbXBvbmVudCkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYQ29tcG9uZW50LmNsYXNzLCB4RnJhbWUpOwotICAgICAgICAJCQkJaWYgKHhDb21wb25lbnQhPW51bGwpewotICAgICAgICAJCQkJCXhDb21wb25lbnQuZGlzcG9zZSgpOwotICAgICAgICAJCQkJfQotICAgICAgICAJCQl9Ci0gICAgICAgIAkJfX0pOwotICAgICAgICAJeEZyYW1lID0gbnVsbDsKLSAgICAgICAgCXhDb21wb25lbnQgPSBudWxsOwotICAgIAl9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWQoU3RyaW5nIHNVcmwpIHsKLSAgICAgICAgaWYgKDAgIT0gc1VybC5pbmRleE9mKCJwcml2YXRlOiIpICYmIDAgIT0gc1VybC5pbmRleE9mKCJmaWxlOi8vLyIpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNVcmwpOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoImZpbGU6Ly8vIik7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHNyY0ZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpLnJlcGxhY2UoJ1xcJywgJy8nKSk7Ci0gICAgICAgICAgICAgICAgc1VybCA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzcmNGaWxlLmNhblJlYWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgaW9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAkKLSAgICAJWENvbXBvbmVudExvYWRlciB4Q29tcG9uZW50TG9hZGVyID0gKFhDb21wb25lbnRMb2FkZXIpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWENvbXBvbmVudExvYWRlci5jbGFzcywgeEZyYW1lKTsKLSAgICAJdHJ5ewotICAgIAkJUHJvcGVydHlWYWx1ZVtdIGxvYWRQcm9wID0gbmV3IFByb3BlcnR5VmFsdWVbMV07Ci0gICAgCQlsb2FkUHJvcFswXSA9IG5ldyBQcm9wZXJ0eVZhbHVlKCk7Ci0gICAgCQlsb2FkUHJvcFswXS5OYW1lID0gIlJlYWRPbmx5IjsKLSAgICAJCWxvYWRQcm9wWzBdLlZhbHVlID0gQm9vbGVhbi5UUlVFOyAgICAgICAgICAgIAotICAgIAkJeENvbXBvbmVudCA9IHhDb21wb25lbnRMb2FkZXIubG9hZENvbXBvbmVudEZyb21VUkwoc1VybCwgeEZyYW1lLmdldE5hbWUoKSwgRnJhbWVTZWFyY2hGbGFnLkFMTCwgbG9hZFByb3ApOwotICAgIAkJb29vTmF2aWdhdGlvbiA9IG5ldyBPT29OYXZpZ2F0aW9uKHhNU0YsIHhDb21wb25lbnQpOyAgICAJCQotICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpewotICAgIAkJeENvbXBvbmVudCA9IG51bGw7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSBYQWNjZXNzaWJsZSBmaW5kWEFjY2Vzc2libGVCeVJvbGUoWEFjY2Vzc2libGUgeEFjLCBzaG9ydCByb2xlKSB7Ci0JCVhBY2Nlc3NpYmxlQ29udGV4dCB4QWNDb250ZXh0ID0geEFjLmdldEFjY2Vzc2libGVDb250ZXh0KCk7Ci0JCWlmICh4QWMuZ2V0QWNjZXNzaWJsZUNvbnRleHQoKS5nZXRBY2Nlc3NpYmxlUm9sZSgpPT1yb2xlKSB7Ci0JCQlyZXR1cm4geEFjOwotCQl9Ci0JCWZvciAoaW50IGk9MDsgaTx4QWNDb250ZXh0LmdldEFjY2Vzc2libGVDaGlsZENvdW50KCk7IGkrKykgewotCQkJWEFjY2Vzc2libGUgeEFjQ2hpbGQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl4QWNDaGlsZCA9IHhBY0NvbnRleHQuZ2V0QWNjZXNzaWJsZUNoaWxkKGkpOwotCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCVhBY2Nlc3NpYmxlIGZvdW5kQWMgPSBmaW5kWEFjY2Vzc2libGVCeVJvbGUoeEFjQ2hpbGQsIHJvbGUpOwotCQkJaWYgKGZvdW5kQWMhPW51bGwpIHJldHVybiBmb3VuZEFjOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvLyBpbmRleCAwIDogWCBzY3JvbGwgYmFyCi0JLy8gaW5kZXggMSA6IFkgc2Nyb2xsIGJhciAKLQkvL2FjdGlvbiBmb3IgU0NST0xMIFBBTkUKLQkvLzAgLS0tIGRlY3JlbWVudExpbmUKLQkvLzEgLS0tIGluY3JlbWVudExpbmUKLQkvLzIgLS0tIGRlY3JlbWVudEJsb2NrCi0JLy8zIC0tLSBpbmNyZW1lbnRCbG9jawotCXByaXZhdGUgWEFjY2Vzc2libGVBY3Rpb25bXSBmaW5kU2Nyb2xsQWN0aW9uKCkgewotCQlYV2luZG93IHhXaW5kb3cgPSBvb29XaW4uZ2V0WFdpbmRvdygpOwotCQlYQWNjZXNzaWJsZSB4QWNXaW5kb3cgPSAoWEFjY2Vzc2libGUpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWEFjY2Vzc2libGUuY2xhc3MsIHhXaW5kb3cpOwotCQlYQWNjZXNzaWJsZSB4QWNTY3JvbGxQYW5lID0gZmluZFhBY2Nlc3NpYmxlQnlSb2xlKHhBY1dpbmRvdywgQWNjZXNzaWJsZVJvbGUuU0NST0xMX1BBTkUpOwotCQkKLQkJWEFjY2Vzc2libGVDb250ZXh0IHNjcm9sbFBhbmVDb250ZXh0ID0geEFjU2Nyb2xsUGFuZS5nZXRBY2Nlc3NpYmxlQ29udGV4dCgpOwotCQlYQWNjZXNzaWJsZVtdIHhBY1Njcm9sbEJhciA9IG5ldyBYQWNjZXNzaWJsZVsyXTsKLQkJWEFjY2Vzc2libGVBY3Rpb25bXSBzY3JvbGxBY3Rpb24gPSBuZXcgWEFjY2Vzc2libGVBY3Rpb25bMl07Ci0JCWZvciAoaW50IGk9MCwgaj0wOyBpPHNjcm9sbFBhbmVDb250ZXh0LmdldEFjY2Vzc2libGVDaGlsZENvdW50KCk7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlYQWNjZXNzaWJsZSBjaGlsZCA9IHNjcm9sbFBhbmVDb250ZXh0LmdldEFjY2Vzc2libGVDaGlsZChpKTsKLQkJCQlYQWNjZXNzaWJsZUNvbnRleHQgY2hpbGRDb250ZXh0ID0gY2hpbGQuZ2V0QWNjZXNzaWJsZUNvbnRleHQoKTsKLQkJCQlpZiAoY2hpbGRDb250ZXh0LmdldEFjY2Vzc2libGVSb2xlKCk9PUFjY2Vzc2libGVSb2xlLlNDUk9MTF9CQVIpIHsKLQkJCQkJeEFjU2Nyb2xsQmFyW2pdID0gY2hpbGQ7Ci0JCQkJCXNjcm9sbEFjdGlvbltqXSA9IChYQWNjZXNzaWJsZUFjdGlvbikgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYQWNjZXNzaWJsZUFjdGlvbi5jbGFzcywKLQkJCQkJCQl4QWNTY3JvbGxCYXJbal0uZ2V0QWNjZXNzaWJsZUNvbnRleHQoKSk7Ci0JCQkJCWorKzsKLQkJCQl9CQkJCQotCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2Nyb2xsQWN0aW9uOwotCX0KLQkKLSAgICBwcml2YXRlIGNsYXNzIE9Pb1dpbmRvdyB7Ci0gICAgCUNvbXBvc2l0ZSBwYXJlbnQgPSBudWxsOwotICAgIAlYV2luZG93IHhXaW5kb3cgPSBudWxsOwotICAgIAkKLSAgICAJcHVibGljIE9Pb1dpbmRvdyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJfQotCi0gICAgCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgCQl4V2luZG93ID0gbnVsbDsKLSAgICAJfQotICAgIAkKLSAgICAJcHVibGljIHZvaWQgY3JlYXRlKFhNdWx0aVNlcnZpY2VGYWN0b3J5IHhNU0YpIHsKLSAgICAgIAkgIGlmKHhXaW5kb3c9PW51bGwpewotICAgICAgCQkgIFhUb29sa2l0IHhUb29sa2l0ID0gbnVsbDsKLSAgICAgIAkJICB0cnkgewotICAgICAgCQkJICB4VG9vbGtpdCA9IChYVG9vbGtpdCkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYVG9vbGtpdC5jbGFzcywgeE1TRi5jcmVhdGVJbnN0YW5jZSgiY29tLnN1bi5zdGFyLmF3dC5Ub29sa2l0IikpOwotICAgICAgCQkgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAJCQkgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAJCSAgfSAgICAgIAkJICAKLSAgICAgIAkJICBpZih4VG9vbGtpdCE9bnVsbCkgewotICAgICAgCQkJICBYU3lzdGVtQ2hpbGRGYWN0b3J5IHhTeXN0ZW1DaGlsZEZhY3RvcnkgPSAoWFN5c3RlbUNoaWxkRmFjdG9yeSkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYU3lzdGVtQ2hpbGRGYWN0b3J5LmNsYXNzLCB4VG9vbGtpdCk7Ci0gICAgICAJCQkgIGlmKHhTeXN0ZW1DaGlsZEZhY3RvcnkhPW51bGwpewotICAgICAgCQkJCSAgYnl0ZVtdIHByb2NJRCA9IG5ldyBieXRlWzBdOwotICAgICAgCQkJCSAgWFdpbmRvd1BlZXIgeFdpbmRvd1BlZXIgPSB4U3lzdGVtQ2hpbGRGYWN0b3J5LmNyZWF0ZVN5c3RlbUNoaWxkKG5ldyBJbnRlZ2VyKHBhcmVudC5oYW5kbGUpLCBwcm9jSUQsIFN5c3RlbURlcGVuZGVudC5TWVNURU1fV0lOMzIpOwotICAgICAgCQkJCSAgaWYoeFdpbmRvd1BlZXIhPW51bGwpewotICAgICAgCQkJCQkgIHhXaW5kb3cgPSAoWFdpbmRvdykgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYV2luZG93LmNsYXNzLCB4V2luZG93UGVlcik7Ci0gICAgICAJCQkJICB9Ci0gICAgICAJCQkgIH0KLSAgICAgIAkJICB9Ci0gICAgICAJICB9Ci0gICAgCX0KLSAgICAJCi0gICAgCXB1YmxpYyBYV2luZG93IGdldFhXaW5kb3coKSB7cmV0dXJuIHhXaW5kb3c7fQotICAgIAkKLSAgICAJcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpewotICAgIAkJaWYoeFdpbmRvdyE9bnVsbCl7Ci0gICAgCQkJeFdpbmRvdy5zZXRQb3NTaXplKDAsIDAsIHdpZHRoLCBoZWlnaHQsIFBvc1NpemUuU0laRSk7Ci0gICAgCQl9Ci0gICAgCX0KLQotICAgIAlwdWJsaWMgdm9pZCBzZXRXaWR0aChpbnQgd2lkdGgpewotICAgIAkJaWYoeFdpbmRvdyE9bnVsbCl7Ci0gICAgCQkJeFdpbmRvdy5zZXRQb3NTaXplKDAsIDAsIHdpZHRoLCAwLCBQb3NTaXplLldJRFRIKTsKLSAgICAJCX0KLSAgICAJfQotCi0gICAgCXB1YmxpYyB2b2lkIHNldEhlaWdodChpbnQgaGVpZ2h0KXsKLSAgICAJCWlmKHhXaW5kb3chPW51bGwpewotICAgIAkJCXhXaW5kb3cuc2V0UG9zU2l6ZSgwLCAwLCAwLCBoZWlnaHQsIFBvc1NpemUuSEVJR0hUKTsKLSAgICAJCX0KLSAgICAJfQotICAgIAkKLSAgICAJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpewotICAgIAkJaWYoeFdpbmRvdyE9bnVsbCl7ICAgIAkJCi0gICAgCQkJeFdpbmRvdy5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgIAkJfQotICAgIAl9ICAgIAkKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzUGFzc3dvcmRQcm90ZWN0ZWQoU3RyaW5nIHVybCkgewotICAgIAlPREZQYXJzZXIgcGFyc2VyID0gbmV3IE9ERlBhcnNlcigpOwotICAgIAlEb2N1bWVudCBtYW5pZmVzdERvYyA9IHBhcnNlci5nZXREb2N1bWVudCh1cmwsIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHMuT0RGX01BTklGRVNUX0ZJTEVOQU1FKTsKLSAgICAJaWYgKG1hbmlmZXN0RG9jPT1udWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgCU5vZGVMaXN0IG5sID0gbWFuaWZlc3REb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhNYW5pZmVzdENvbnN0YW50cy5NQU5JRkVTVF9OQU1FU1BBQ0VfVVJJLCBNYW5pZmVzdENvbnN0YW50cy5FTEVNRU5UX0VOQ1JZUFRJT05fREFUQSk7Ci0gICAgCWlmICgobmwhPW51bGwpJiYobmwuZ2V0TGVuZ3RoKCkhPTApKSByZXR1cm4gdHJ1ZTsKLSAgICAJcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBvcGVuKFN0cmluZyBzVXJsKSB7Ci0gICAgICAgIGlmIChpc1Bhc3N3b3JkUHJvdGVjdGVkKHNVcmwpKSB7Ci0gICAgICAgIAlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5kaXNwbGF5SGVscFJlc291cmNlKCIvb3JnLmVjbGlwc2UuYWN0Zi5leGFtcGxlcy5hZGVzaWduZXIuZG9jL2RvY3Mvb2RmL2Vycm9yLmh0bWwiKTsKLSAgICAgICAgCXJldHVybjsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgIAkKLSAgICAgICAgLy8gcmVtb3ZlIHByZXZpb3VzIE9PbyB3aW5kb3cKLSAgICAgICAgaWYgKG9vb1dpbiE9bnVsbCkgewotICAgICAgICAJb29vV2luLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoeEZyYW1lIT1udWxsKSB7Ci0gICAgICAgIAljbG9zZUZyYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCW9vb1dpbiA9IG5ldyBPT29XaW5kb3codGhpcyk7Ci0gICAgICAgIHRoaXMuX3VybCA9IHNVcmw7Ci0gICAgICAgIAotICAgIAlkaXNwYXRoTWVzc2FnZVRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgCQlwdWJsaWMgdm9pZCBydW4oKSB7ICAgIAkJCi0gICAgCQkJdHJ5IHsKLSAgICAJCQkJb29vV2luLmNyZWF0ZSh4TVNGKTsKLQotICAgIAkJCQl4RnJhbWUgPSAoWEZyYW1lKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhGcmFtZS5jbGFzcywgeE1TRi5jcmVhdGVJbnN0YW5jZSgiY29tLnN1bi5zdGFyLmZyYW1lLkZyYW1lIikpOwotICAgIAkJCQlYRnJhbWVzU3VwcGxpZXIgeEZyYW1lc1N1cHBsaWVyID0gKFhGcmFtZXNTdXBwbGllcikgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYRnJhbWVzU3VwcGxpZXIuY2xhc3MsIHhNU0YuY3JlYXRlSW5zdGFuY2UoImNvbS5zdW4uc3Rhci5mcmFtZS5EZXNrdG9wIikpOwotICAgIAkJCQlYRnJhbWVzIHhGcmFtZXMgPSB4RnJhbWVzU3VwcGxpZXIuZ2V0RnJhbWVzKCk7Ci0gICAgCQkJCXhGcmFtZXMuYXBwZW5kKHhGcmFtZSk7Ci0gICAgCQkJCXhGcmFtZS5pbml0aWFsaXplKG9vb1dpbi5nZXRYV2luZG93KCkpOwotCi0gICAgCQkJCWxvYWQoX3VybCk7Ci0gICAgCQkJCQotICAgIAkJCQlzY3JvbGxBY3Rpb24gPSBmaW5kU2Nyb2xsQWN0aW9uKCk7Ci0gICAgCQkJCQotICAgIAkJCQl0cnkgewotICAgIAkJCQkJT09vVUlDb250cm9scy5oaWRlVUlFbGVtZW50cyh4RnJhbWUsIHhNU0YpOwotICAgIAkJCQl9IGNhdGNoIChPREZFeGNlcHRpb24gZSkgewotICAgIAkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAJCQkJfQotICAgIAkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgCQkJfSAgICAgICAgCi0gICAgICAgIAl9fSk7Ci0gICAgCQotICAgIAlQb2ludCBzaXplID0gdGhpcy5nZXRTaXplKCk7Ci0gICAgCW9vb1dpbi5zZXRWaXNpYmxlKHRydWUpOwotICAgIAlvb29XaW4uc2V0U2l6ZShzaXplLngsIHNpemUueSk7ICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRVcmwoKXsKLSAgICAgICAgcmV0dXJuIHRoaXMuX3VybDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9Pb05hdmlnYXRpb24gZ2V0T29vTmF2aWdhdGlvbigpIHsKLSAgICAJcmV0dXJuIHRoaXMub29vTmF2aWdhdGlvbjsKLSAgICB9Ci0gICAgCi0JcHVibGljIFhBY2Nlc3NpYmxlQWN0aW9uW10gZ2V0U2Nyb2xsQWN0aW9uKCkgewotCQlyZXR1cm4gc2Nyb2xsQWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgaW50W10gZ2V0Vmlld0RhdGEoKSB7Ci0gICAgICAgIENvbnRlbnRUeXBlIG9kZkZpbGVUeXBlID0gT0RGRmlsZVV0aWxzLmdldE9ERkZpbGVUeXBlKF91cmwpOwotCQlpZiAoQ29udGVudFR5cGUuV1JJVEUuZXF1YWxzKG9kZkZpbGVUeXBlKSkgewotCQkJWFRleHREb2N1bWVudCB4VGV4dERvY3VtZW50ID0gKFhUZXh0RG9jdW1lbnQpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWFRleHREb2N1bWVudC5jbGFzcywgeENvbXBvbmVudCk7Ci0JCQlpZiAoeFRleHREb2N1bWVudCE9bnVsbCkgewotCQkJCVN0cmluZyB2aWV3RGF0YSA9IChTdHJpbmcpIHhGcmFtZS5nZXRDb250cm9sbGVyKCkuZ2V0Vmlld0RhdGEoKTsKLQkJCQlTdHJpbmdbXSBwb2ludHNTdHIgPSB2aWV3RGF0YS5zcGxpdCgiOyIpOwotCQkJCWludFtdIHBvaW50cyA9IG5ldyBpbnRbNF07CQkKLQkJCQlwb2ludHNbMF0gPSBuZXcgSW50ZWdlcihwb2ludHNTdHJbM10pLmludFZhbHVlKCk7Ci0JCQkJcG9pbnRzWzFdID0gbmV3IEludGVnZXIocG9pbnRzU3RyWzRdKS5pbnRWYWx1ZSgpOwotCQkJCXBvaW50c1syXSA9IG5ldyBJbnRlZ2VyKHBvaW50c1N0cls1XSkuaW50VmFsdWUoKTsKLQkJCQlwb2ludHNbM10gPSBuZXcgSW50ZWdlcihwb2ludHNTdHJbNl0pLmludFZhbHVlKCk7Ci0JCQkJcmV0dXJuIHBvaW50czsKLQkJCX0KLQkJfSBlbHNlIGlmIChDb250ZW50VHlwZS5TUFJFQURTSEVFVC5lcXVhbHMob2RmRmlsZVR5cGUpKSB7Ci0JCQlYQ29udHJvbGxlciB4Q29udHJvbGxlciA9IHhGcmFtZS5nZXRDb250cm9sbGVyKCk7Ci0JCQlYU3ByZWFkc2hlZXRWaWV3IHhTcHJlYWRWaWV3ID0gKFhTcHJlYWRzaGVldFZpZXcpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWFNwcmVhZHNoZWV0Vmlldy5jbGFzcywgeENvbnRyb2xsZXIpOwotCQkJWFByb3BlcnR5U2V0IHhQcm9wU2V0ID0gKFhQcm9wZXJ0eVNldCkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYUHJvcGVydHlTZXQuY2xhc3MsIHhTcHJlYWRWaWV3KTsKLQkJCXRyeSB7Ci0JCQkJUmVjdGFuZ2xlIHZpc2libGVBcmVhID0gKFJlY3RhbmdsZSkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShSZWN0YW5nbGUuY2xhc3MsIHhQcm9wU2V0LmdldFByb3BlcnR5VmFsdWUoIlZpc2libGVBcmVhIikpOwotCQkJCWludFtdIHBvaW50cyA9IG5ldyBpbnRbNF07Ci0JCQkJcG9pbnRzWzBdID0gdmlzaWJsZUFyZWEuWDsKLQkJCQlwb2ludHNbMV0gPSB2aXNpYmxlQXJlYS5ZOwotCQkJCXBvaW50c1syXSA9IHZpc2libGVBcmVhLlggKyB2aXNpYmxlQXJlYS5XaWR0aDsKLQkJCQlwb2ludHNbM10gPSB2aXNpYmxlQXJlYS5ZICsgdmlzaWJsZUFyZWEuSGVpZ2h0OwotCQkJCXJldHVybiBwb2ludHM7Ci0JCQl9IGNhdGNoIChVbmtub3duUHJvcGVydHlFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKG9kZkZpbGVUeXBlKSkgewotCQkJWENvbnRyb2xsZXIgeENvbnRyb2xsZXIgPSB4RnJhbWUuZ2V0Q29udHJvbGxlcigpOwotCQkJWERyYXdWaWV3IHhEcmF3VmlldyA9IChYRHJhd1ZpZXcpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWERyYXdWaWV3LmNsYXNzLCB4Q29udHJvbGxlcik7Ci0JCQlYUHJvcGVydHlTZXQgeFByb3BTZXQgPSAoWFByb3BlcnR5U2V0KSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhQcm9wZXJ0eVNldC5jbGFzcywgeERyYXdWaWV3KTsKLQkJCXRyeSB7Ci0JCQkJUmVjdGFuZ2xlIHZpc2libGVBcmVhID0gKFJlY3RhbmdsZSkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShSZWN0YW5nbGUuY2xhc3MsIHhQcm9wU2V0LmdldFByb3BlcnR5VmFsdWUoIlZpc2libGVBcmVhIikpOwotCQkJCWludFtdIHBvaW50cyA9IG5ldyBpbnRbNF07Ci0JCQkJcG9pbnRzWzBdID0gdmlzaWJsZUFyZWEuWDsKLQkJCQlwb2ludHNbMV0gPSB2aXNpYmxlQXJlYS5ZOwotCQkJCXBvaW50c1syXSA9IHZpc2libGVBcmVhLlggKyB2aXNpYmxlQXJlYS5XaWR0aDsKLQkJCQlwb2ludHNbM10gPSB2aXNpYmxlQXJlYS5ZICsgdmlzaWJsZUFyZWEuSGVpZ2h0OwotCQkJCXJldHVybiBwb2ludHM7Ci0JCQl9IGNhdGNoIChVbmtub3duUHJvcGVydHlFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCQotCXB1YmxpYyBpbnRbXSBnZXRPT29XaW5TaXplKCkgdGhyb3dzIE9ERkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKHhGcmFtZT09bnVsbCl7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKCJub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICAgICAgfQotICAgICAgICAKLQkJWFdpbmRvdyBjb21wb25lbnRXaW5kb3cgPSB4RnJhbWUuZ2V0Q29tcG9uZW50V2luZG93KCk7Ci0JCVJlY3RhbmdsZSByZWN0ID0gY29tcG9uZW50V2luZG93LmdldFBvc1NpemUoKTsKLQkJaW50W10gc2l6ZSA9IG5ldyBpbnRbMl07Ci0JCXNpemVbMF0gPSByZWN0LldpZHRoOwotCQlzaXplWzFdID0gcmVjdC5IZWlnaHQ7Ci0JCXJldHVybiBzaXplOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFByZXNlbnRhdGlvblBhZ2VDb3VudCgpIHsKLQkJcmV0dXJuIE9ERlV0aWxzLmdldERyYXdQYWdlQ291bnQoeENvbXBvbmVudCk7Ci0JfQotCQotCXB1YmxpYyBpbnQganVtcFRvUHJlc2VudGF0aW9uUGFnZShpbnQgcGFnZU51bWJlcikgewotCQlYRHJhd1BhZ2VzU3VwcGxpZXIgeERyYXdQYWdlc1N1cHAgPSAoWERyYXdQYWdlc1N1cHBsaWVyKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEcmF3UGFnZXNTdXBwbGllci5jbGFzcywgeENvbXBvbmVudCk7Ci0JCVhEcmF3UGFnZXMgeERyYXdQYWdlcyA9IHhEcmF3UGFnZXNTdXBwLmdldERyYXdQYWdlcygpOwotCi0JCVhDb250cm9sbGVyIHhDb250cm9sbGVyID0geEZyYW1lLmdldENvbnRyb2xsZXIoKTsKLQkJWERyYXdWaWV3IHhEcmF3VmlldyA9IChYRHJhd1ZpZXcpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWERyYXdWaWV3LmNsYXNzLCB4Q29udHJvbGxlcik7Ci0JCXRyeSB7Ci0JCQlYRHJhd1BhZ2UgcGFnZSA9IChYRHJhd1BhZ2UpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWERyYXdQYWdlLmNsYXNzLCB4RHJhd1BhZ2VzLmdldEJ5SW5kZXgocGFnZU51bWJlci0xKSk7Ci0JCQl4RHJhd1ZpZXcuc2V0Q3VycmVudFBhZ2UocGFnZSk7CQotCQkJcmV0dXJuIDE7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoV3JhcHBlZFRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLSAgICB9CQotCQotCXB1YmxpYyBpbnQgZ2V0Q3VycmVudFBhZ2VOdW1iZXIoKXsKLQkJWENvbnRyb2xsZXIgeENvbnRyb2xsZXIgPSB4RnJhbWUuZ2V0Q29udHJvbGxlcigpOwotCQlYRHJhd1ZpZXcgeERyYXdWaWV3ID0gKFhEcmF3VmlldykgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYRHJhd1ZpZXcuY2xhc3MsIHhDb250cm9sbGVyKTsKLQkJWERyYXdQYWdlIGN1clBhZ2UgPSB4RHJhd1ZpZXcuZ2V0Q3VycmVudFBhZ2UoKTsKLQkJWFByb3BlcnR5U2V0IGN1clBhZ2VQcm9wID0gKFhQcm9wZXJ0eVNldCkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYUHJvcGVydHlTZXQuY2xhc3MsIGN1clBhZ2UpOwotCQl0cnkgewotCQkJcmV0dXJuICgoU2hvcnQpIGN1clBhZ2VQcm9wLmdldFByb3BlcnR5VmFsdWUoIk51bWJlciIpKS5pbnRWYWx1ZSgpOwotCQl9IGNhdGNoIChVbmtub3duUHJvcGVydHlFeGNlcHRpb24gZTEpIHsKLQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChXcmFwcGVkVGFyZ2V0RXhjZXB0aW9uIGUxKSB7Ci0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSAKLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlwdWJsaWMgaW50IG1vdmVQcmVzZW50YXRpb25QYWdlKGJvb2xlYW4gZm9yd2FyZCl7Ci0JCVhEcmF3UGFnZXNTdXBwbGllciB4RHJhd1BhZ2VzU3VwcCA9IChYRHJhd1BhZ2VzU3VwcGxpZXIpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWERyYXdQYWdlc1N1cHBsaWVyLmNsYXNzLCB4Q29tcG9uZW50KTsKLQkJWERyYXdQYWdlcyB4RHJhd1BhZ2VzID0geERyYXdQYWdlc1N1cHAuZ2V0RHJhd1BhZ2VzKCk7Ci0JCWludCBwYWdlQ291bnQgPSB4RHJhd1BhZ2VzLmdldENvdW50KCk7Ci0KLQkJaW50IGN1clBhZ2VOdW1iZXIgPSBnZXRDdXJyZW50UGFnZU51bWJlcigpOwotCQlpZiAoY3VyUGFnZU51bWJlcj09LTEpIHJldHVybiAtMTsKLQkJCi0JCWlmICgoZm9yd2FyZD09dHJ1ZSkmJihjdXJQYWdlTnVtYmVyPT1wYWdlQ291bnQpKSByZXR1cm4gMDsKLQkJaWYgKChmb3J3YXJkPT1mYWxzZSkmJihjdXJQYWdlTnVtYmVyPT0xKSkgcmV0dXJuIDA7CQkKLQkJCi0JCWludCBuZXdQYWdlSW5kZXg7Ci0JCWlmIChmb3J3YXJkKSBuZXdQYWdlSW5kZXggPSBjdXJQYWdlTnVtYmVyOwotCQllbHNlIG5ld1BhZ2VJbmRleCA9IGN1clBhZ2VOdW1iZXItMjsKLQkJCi0JCVhDb250cm9sbGVyIHhDb250cm9sbGVyID0geEZyYW1lLmdldENvbnRyb2xsZXIoKTsKLQkJWERyYXdWaWV3IHhEcmF3VmlldyA9IChYRHJhd1ZpZXcpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWERyYXdWaWV3LmNsYXNzLCB4Q29udHJvbGxlcik7Ci0JCXRyeSB7Ci0JCQlYRHJhd1BhZ2UgbmV3UGFnZSA9IChYRHJhd1BhZ2UpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWERyYXdQYWdlLmNsYXNzLCB4RHJhd1BhZ2VzLmdldEJ5SW5kZXgobmV3UGFnZUluZGV4KSk7Ci0JCQl4RHJhd1ZpZXcuc2V0Q3VycmVudFBhZ2UobmV3UGFnZSk7CQkJCi0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoV3JhcHBlZFRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIHJldHVybiBnZXRPT29XaW5TaXplKClbMV07Ci0gICAgICAgIH1jYXRjaChPREZFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0JCi0JcHVibGljIGJvb2xlYW4gc2V0RHJhd2luZ01vZGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gT09vVUlDb250cm9scy5zZXREcmF3aW5nTW9kZSh4TVNGLCB4RnJhbWUuZ2V0Q29udHJvbGxlcigpKTsKLQkJfSBjYXRjaCAoT0RGRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL29vby91dGlsL0Jvb3RzdHJhcEZvck9Pb0NvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvb29vL3V0aWwvQm9vdHN0cmFwRm9yT09vQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjODMwZTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvb29vL3V0aWwvQm9vdHN0cmFwRm9yT09vQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBOb3JpbWFzYSBIQVlBU0hJREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5vb28udXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7Ci0KLWltcG9ydCBjb20uc3VuLnN0YXIuYnJpZGdlLlVub1VybFJlc29sdmVyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5icmlkZ2UuWFVub1VybFJlc29sdmVyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5jb21wLmhlbHBlci5Cb290c3RyYXA7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmNvbXAuaGVscGVyLkJvb3RzdHJhcEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIuY29ubmVjdGlvbi5Ob0Nvbm5lY3RFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmZyYW1lLlhEZXNrdG9wOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5sYW5nLlhNdWx0aUNvbXBvbmVudEZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuWE11bHRpU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxpYi51bm8uaGVscGVyLlVub1VybDsKLWltcG9ydCBjb20uc3VuLnN0YXIubGliLnV0aWwuTmF0aXZlTGlicmFyeUxvYWRlcjsKLWltcG9ydCBjb20uc3VuLnN0YXIudW5vLlVub1J1bnRpbWU7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnVuby5YQ29tcG9uZW50Q29udGV4dDsKLQotCi0KLXB1YmxpYyBjbGFzcyBCb290c3RyYXBGb3JPT29Db21wb3NpdGUgZXh0ZW5kcyBCb290c3RyYXAgewotCXByaXZhdGUgc3RhdGljIFhDb21wb25lbnRDb250ZXh0IHhDb21wb25lbnRDb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBYTXVsdGlTZXJ2aWNlRmFjdG9yeSB4TVNGID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBYRGVza3RvcCB4RGVza3RvcCA9IG51bGw7Ci0JCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBQcm9jZXNzIGJvb3RzdHJhcChDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIEJvb3RzdHJhcEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBQcm9jZXNzIHByb2Nlc3MgID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB4Q29tcG9uZW50Q29udGV4dCA9IGNyZWF0ZUluaXRpYWxDb21wb25lbnRDb250ZXh0KG51bGwpOwotICAgICAgICAgICAgaWYgKG51bGwgPT0geENvbXBvbmVudENvbnRleHQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQm9vdHN0cmFwRXhjZXB0aW9uKCJubyBsb2NhbCBjb21wb25lbnQgY29udGV4dCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgc09mZmljZUV4ZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5zdGFydHNXaXRoKCJXaW5kb3dzIikgPyAic29mZmljZS5leGUiIDogInNvZmZpY2UiOwotICAgICAgICAgICAgRmlsZSBzT2ZmaWNlRmlsZSA9IE5hdGl2ZUxpYnJhcnlMb2FkZXIuZ2V0UmVzb3VyY2UoY2xhc3NMb2FkZXIsIHNPZmZpY2VFeGVOYW1lKTsKLSAgICAgICAgICAgIGlmIChudWxsID09IHNPZmZpY2VGaWxlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJvb3RzdHJhcEV4Y2VwdGlvbigibm8gb2ZmaWNlIGV4ZWN1dGFibGUgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgWE11bHRpQ29tcG9uZW50RmFjdG9yeSB4TUNGID0geENvbXBvbmVudENvbnRleHQuZ2V0U2VydmljZU1hbmFnZXIoKTsKLSAgICAgICAgICAgIGlmIChudWxsID09IHhNQ0YpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQm9vdHN0cmFwRXhjZXB0aW9uKCJubyBpbml0aWFsIHNlcnZpY2UgbWFuYWdlciIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBYVW5vVXJsUmVzb2x2ZXIgeFVub1VybFJlc29sdmVyID0gVW5vVXJsUmVzb2x2ZXIuY3JlYXRlKHhDb21wb25lbnRDb250ZXh0KTsKLSAgICAgICAgICAgIFN0cmluZyBzVW5vVXJsID0gInVubzpwaXBlLG5hbWU9IiArIGdldFBpcGVOYW1lKCkgKyAiO3VycDtTdGFyT2ZmaWNlLlNlcnZpY2VNYW5hZ2VyIjsKLQotICAgICAgICAgICAgVW5vVXJsIHVub3VybCA9IFVub1VybC5wYXJzZVVub1VybChzVW5vVXJsKTsKLSAgICAgICAgICAgIFN0cmluZyBjb25uVHlwZSA9IHVub3VybC5nZXRDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvdG9jb2wgPSB1bm91cmwuZ2V0UHJvdG9jb2woKTsKLSAgICAgICAgICAgIFN0cmluZyBpbml0T2JqID0gdW5vdXJsLmdldFJvb3RPaWQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGFzW10gPSBuZXcgU3RyaW5nWzVdOwotICAgICAgICAgICAgYXNbMF0gPSBzT2ZmaWNlRmlsZS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBhc1sxXSA9ICItbm9sb2dvIjsKLSAgICAgICAgICAgIGFzWzJdID0gIi1ub2RlZmF1bHQiOwotICAgICAgICAgICAgYXNbM10gPSAiLW5vcmVzdG9yZSI7ICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY29ublR5cGUuZXF1YWxzKCJwaXBlIikpIHsKLSAgICAgICAgICAgICAgICBhc1s0XSA9ICItYWNjZXB0PXBpcGUsbmFtZT0iICsgZ2V0UGlwZU5hbWUoKSArICI7IiArIHByb3RvY29sICsgIjsiICsgaW5pdE9iajsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJub3QgY29ubmVjdGlvbiBzcGVjaWZpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJvY2VzcyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoYXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBPYmplY3Qgb1NlcnZpY2VNYW5hZ2VyOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG9TZXJ2aWNlTWFuYWdlciA9IHhVbm9VcmxSZXNvbHZlci5yZXNvbHZlKCJ1bm86cGlwZSxuYW1lPSIgKyBnZXRQaXBlTmFtZSgpICsgIjt1cnA7U3Rhck9mZmljZS5TZXJ2aWNlTWFuYWdlciIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOb0Nvbm5lY3RFeGNlcHRpb24gbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOwotICAgICAgICAgICAgICAgIH0gfSB3aGlsZSAodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB4TVNGID0gKFhNdWx0aVNlcnZpY2VGYWN0b3J5KSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhNdWx0aVNlcnZpY2VGYWN0b3J5LmNsYXNzLCBvU2VydmljZU1hbmFnZXIpOwotICAgICAgICAgICAgeERlc2t0b3AgPSAoWERlc2t0b3ApIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWERlc2t0b3AuY2xhc3MsIHhNU0YuY3JlYXRlSW5zdGFuY2UoImNvbS5zdW4uc3Rhci5mcmFtZS5EZXNrdG9wIikpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICB0aHJvdyByZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCb290c3RyYXBFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwcm9jZXNzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQaXBlTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIubmFtZSIpICsgIl9PZmZpY2UiOwotICAgICAgICBzID0gcmVwbGFjZUFsbChzLCAiXyIsICIlQjciKTsKLQotICAgICAgICByZXR1cm4gcmVwbGFjZUFsbChyZXBsYWNlQWxsKFVSTEVuY29kZXIuZW5jb2RlKHMpLCAiKyIsICIlMjAiKSwgIiUiLCAiXyIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXBsYWNlQWxsKFN0cmluZyBzLCBTdHJpbmcgczEsIFN0cmluZyBzMikgewotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzKTsKLSAgICAgICAgaW50IGkgPSBzLmxlbmd0aCgpOwotICAgICAgICBpbnQgaiA9IHMxLmxlbmd0aCgpOwotICAgICAgICB3aGlsZSAoKGkgPSBzLmxhc3RJbmRleE9mKHMxLCBpIC0gMSkpID4gLTEpIHsKLSAgICAgICAgICAgIHN0cmluZ2J1ZmZlci5yZXBsYWNlKGksIGkgKyBqLCBzMik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RyaW5nYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyBzdGF0aWMgWENvbXBvbmVudENvbnRleHQgZ2V0WENvbXBvbmVudENvbnRleHQoKSB7cmV0dXJuIHhDb21wb25lbnRDb250ZXh0O30KLQlwdWJsaWMgc3RhdGljIFhNdWx0aVNlcnZpY2VGYWN0b3J5IGdldFhNdWx0aVNlcnZpY2VGYWN0b3J5KCkge3JldHVybiB4TVNGO30KLQlwdWJsaWMgc3RhdGljIFhEZXNrdG9wIGdldFhEZXNrdG9wKCkge3JldHVybiB4RGVza3RvcDt9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9vb28vdXRpbC9PREZFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL29vby91dGlsL09ERkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjEzYjZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL29vby91dGlsL09ERkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBOb3JpbWFzYSBIQVlBU0hJREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMub29vLnV0aWw7Ci0KLQotCi1wdWJsaWMgY2xhc3MgT0RGRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjY3NzcyNzgyMjE2NzgxNjI2M0w7Ci0JCi0JcHVibGljIE9ERkV4Y2VwdGlvbigpewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgT0RGRXhjZXB0aW9uKFN0cmluZyBtc2cpewotCQlzdXBlcihtc2cpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL29vby91dGlsL09ERlV0aWxzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9vb28vdXRpbC9PREZVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjE4NjgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL29vby91dGlsL09ERlV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBOb3JpbWFzYSBIQVlBU0hJREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMub29vLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5PREZDb25zdGFudHMuQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLm9mZmljZS5Eb2N1bWVudENvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uaW5pdGlhbGl6ZXIudXRpbC5PT29FZGl0b3JJbml0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLlRDSEFSOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBjb20uc3VuLnN0YXIuYmVhbnMuVW5rbm93blByb3BlcnR5RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5iZWFucy5YUHJvcGVydHlTZXQ7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmNvbXAuaGVscGVyLkJvb3RzdHJhcDsKLWltcG9ydCBjb20uc3VuLnN0YXIuY29udGFpbmVyLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmNvbnRhaW5lci5YRW51bWVyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmNvbnRhaW5lci5YRW51bWVyYXRpb25BY2Nlc3M7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmRyYXdpbmcuWERyYXdQYWdlOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5kcmF3aW5nLlhEcmF3UGFnZXM7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmRyYXdpbmcuWERyYXdQYWdlc1N1cHBsaWVyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YRGVza3RvcDsKLWltcG9ydCBjb20uc3VuLnN0YXIuZnJhbWUuWERpc3BhdGNoSGVscGVyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YRnJhbWU7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmZyYW1lLlhMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIubGFuZy5XcmFwcGVkVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5sYW5nLlhDb21wb25lbnQ7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuWE11bHRpQ29tcG9uZW50RmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnN0YXIudW5vLkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIudW5vLlVub1J1bnRpbWU7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnVuby5YQ29tcG9uZW50Q29udGV4dDsKLQotCi0KLXB1YmxpYyBjbGFzcyBPREZVdGlscyB7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RHJhd1BhZ2VDb3VudChYQ29tcG9uZW50IHhDb21wKSB7Ci0gICAgICAgIFhEcmF3UGFnZXNTdXBwbGllciB4RHJhd1BhZ2VzU3VwcGxpZXIgPSAoWERyYXdQYWdlc1N1cHBsaWVyKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKAotICAgICAgICAgICAgICAgIFhEcmF3UGFnZXNTdXBwbGllci5jbGFzcywgeENvbXApOwotICAgICAgICBYRHJhd1BhZ2VzIHhEcmF3UGFnZXMgPSB4RHJhd1BhZ2VzU3VwcGxpZXIuZ2V0RHJhd1BhZ2VzKCk7Ci0KLSAgICAgICAgcmV0dXJuIHhEcmF3UGFnZXMuZ2V0Q291bnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhEcmF3UGFnZSBnZXREcmF3UGFnZUJ5SW5kZXgoWENvbXBvbmVudCB4Q29tcCwgaW50IGluZGV4KSB0aHJvd3MgT0RGRXhjZXB0aW9uIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgWERyYXdQYWdlc1N1cHBsaWVyIHhEcmF3UGFnZXNTdXBwbGllciA9IChYRHJhd1BhZ2VzU3VwcGxpZXIpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgICAgIFhEcmF3UGFnZXNTdXBwbGllci5jbGFzcywgeENvbXApOwotICAgICAgICAgICAgWERyYXdQYWdlcyB4RHJhd1BhZ2VzID0geERyYXdQYWdlc1N1cHBsaWVyLmdldERyYXdQYWdlcygpOwotCi0gICAgICAgICAgICByZXR1cm4gKFhEcmF3UGFnZSkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYRHJhd1BhZ2UuY2xhc3MsIHhEcmF3UGFnZXMuZ2V0QnlJbmRleChpbmRleCkpOwotCi0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW9vYmUpIHsKLSAgICAgICAgICAgIGlvb2JlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IE9ERkV4Y2VwdGlvbihpb29iZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChXcmFwcGVkVGFyZ2V0RXhjZXB0aW9uIHd0ZSkgewotICAgICAgICAgICAgd3RlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IE9ERkV4Y2VwdGlvbih3dGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFR5cGUgZ2V0T0RGRmlsZVR5cGUoRG9jdW1lbnQgb2RmQ29udGVudCkgewotICAgICAgICBpZiAob2RmQ29udGVudCE9bnVsbCkgeyAgICAgCi0gICAgICAgICAgICBFbGVtZW50IGNvbnRlbnQgPSBvZGZDb250ZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEb2N1bWVudENvbnRlbnRFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoRG9jdW1lbnRDb250ZW50RWxlbWVudCljb250ZW50KS5nZXRCb2R5RWxlbWVudCgpLmdldENvbnRlbnQoKS5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb250ZW50VHlwZS5OT05FOyAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYRnJhbWUgZ2V0WEZyYW1lKFhDb21wb25lbnRDb250ZXh0IHhDb21wQ29udGV4dCkgdGhyb3dzIE9ERkV4Y2VwdGlvbiB7Ci0gICAgICAgIFhDb21wb25lbnQgeENvbXAgPSBnZXRYQ29tcG9uZW50KHhDb21wQ29udGV4dCk7Ci0gICAgICAgIFhNb2RlbCBtb2RlbCA9IChYTW9kZWwpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWE1vZGVsLmNsYXNzLCB4Q29tcCk7Ci0gICAgICAgIHJldHVybiBtb2RlbC5nZXRDdXJyZW50Q29udHJvbGxlcigpLmdldEZyYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYRGlzcGF0Y2hIZWxwZXIgZ2V0WERpc3BhdGNoSGVscGVyKFhDb21wb25lbnRDb250ZXh0IHhDb21wQ29udGV4dCkgdGhyb3dzIE9ERkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgWERpc3BhdGNoSGVscGVyIHhEaXNwYXRjaEhlbHBlciA9IG51bGw7Ci0KLSAgICAgICAgWE11bHRpQ29tcG9uZW50RmFjdG9yeSB4TUNGID0geENvbXBDb250ZXh0LmdldFNlcnZpY2VNYW5hZ2VyKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdCBvRGlzcGF0Y2hIZWxwZXIgPSB4TUNGLmNyZWF0ZUluc3RhbmNlV2l0aENvbnRleHQoImNvbS5zdW4uc3Rhci5mcmFtZS5EaXNwYXRjaEhlbHBlciIsIHhDb21wQ29udGV4dCk7Ci0gICAgICAgICAgICB4RGlzcGF0Y2hIZWxwZXIgPSAoWERpc3BhdGNoSGVscGVyKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEaXNwYXRjaEhlbHBlci5jbGFzcywgb0Rpc3BhdGNoSGVscGVyKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPREZFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHhEaXNwYXRjaEhlbHBlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhMYXlvdXRNYW5hZ2VyIGdldFhMYXlvdXRNYW5hZ2VyKFhGcmFtZSB4RnJhbWUpIHRocm93cyBPREZFeGNlcHRpb24gewotCi0gICAgICAgIFhMYXlvdXRNYW5hZ2VyIHhMYXlvdXRNYW5hZ2VyID0gbnVsbDsKLQotICAgICAgICBYUHJvcGVydHlTZXQgZnJhbWVQcm9wU2V0ID0gKFhQcm9wZXJ0eVNldCkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYUHJvcGVydHlTZXQuY2xhc3MsIHhGcmFtZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB4TGF5b3V0TWFuYWdlciA9IChYTGF5b3V0TWFuYWdlcikgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYTGF5b3V0TWFuYWdlci5jbGFzcywgZnJhbWVQcm9wU2V0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eVZhbHVlKCJMYXlvdXRNYW5hZ2VyIikpOwotICAgICAgICB9IGNhdGNoIChVbmtub3duUHJvcGVydHlFeGNlcHRpb24gdXBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKHVwZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChXcmFwcGVkVGFyZ2V0RXhjZXB0aW9uIHd0ZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE9ERkV4Y2VwdGlvbih3dGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB4TGF5b3V0TWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhDb21wb25lbnQgZ2V0WENvbXBvbmVudChYQ29tcG9uZW50Q29udGV4dCB4Q29tcG9uZW50Q29udGV4dCkgdGhyb3dzIE9ERkV4Y2VwdGlvbiB7Ci0gICAgCVhEZXNrdG9wIHhEZXNrdG9wID0gQm9vdHN0cmFwRm9yT09vQ29tcG9zaXRlLmdldFhEZXNrdG9wKCk7Ci0gICAgICAgIFhFbnVtZXJhdGlvbkFjY2VzcyB4RW51bWVyYXRpb25BY2Nlc3MgPSB4RGVza3RvcC5nZXRDb21wb25lbnRzKCk7Ci0gICAgICAgIFhFbnVtZXJhdGlvbiB4RW51bWVyYXRpb24gPSB4RW51bWVyYXRpb25BY2Nlc3MuY3JlYXRlRW51bWVyYXRpb24oKTsKLSAgICAgICAgd2hpbGUgKHhFbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgT2JqZWN0IG9Db21wID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb0NvbXAgPSB4RW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbnNlZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBPREZFeGNlcHRpb24obnNlZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoV3JhcHBlZFRhcmdldEV4Y2VwdGlvbiB3dGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKHd0ZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobnVsbCAhPSBvQ29tcCkgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gKFhDb21wb25lbnQpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWENvbXBvbmVudC5jbGFzcywgb0NvbXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYRGVza3RvcCBnZXRYRGVza3RvcChYQ29tcG9uZW50Q29udGV4dCB4Q29tcG9uZW50Q29udGV4dCkgdGhyb3dzIE9ERkV4Y2VwdGlvbiB7Ci0gICAgICAgIFhEZXNrdG9wIHhEZXNrdG9wID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCVhNdWx0aUNvbXBvbmVudEZhY3RvcnkgeE1DRiA9IHhDb21wb25lbnRDb250ZXh0LmdldFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBPYmplY3Qgb0Rlc2t0b3AgPSB4TUNGLmNyZWF0ZUluc3RhbmNlV2l0aENvbnRleHQoImNvbS5zdW4uc3Rhci5mcmFtZS5EZXNrdG9wIiwgeENvbXBvbmVudENvbnRleHQpOwotICAgICAgICAgICAgeERlc2t0b3AgPSAoWERlc2t0b3ApIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWERlc2t0b3AuY2xhc3MsIG9EZXNrdG9wKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPREZFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHhEZXNrdG9wOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyIGxvYWRPcGVuT2ZmaWNlTGlicygpIHRocm93cyBPREZFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgb3Blbk9mZmljZVByb2dyYW1QYXRoID0gT09vRWRpdG9ySW5pdFV0aWwuZ2V0T3Blbk9mZmljZVBhdGgoKSArICJcXCI7Ci0KLSAgICAgICAgRmlsZSBtc3ZjcjcxID0gbmV3IEZpbGUob3Blbk9mZmljZVByb2dyYW1QYXRoICsgIm1zdmNyNzEuZGxsIik7Ci0gICAgICAgIGlmIChtc3ZjcjcxLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ubG9hZChtc3ZjcjcxLmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLnZlbmRvciIpLmVxdWFscygiSUJNIENvcnBvcmF0aW9uIikpIHsKLSAgICAgICAgICAgIFN0cmluZyBqYXZhSG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY29tLmlibS5vdGkudm0uYm9vdHN0cmFwLmxpYnJhcnkucGF0aCIpOwotCi0gICAgICAgICAgICAvLyBkdW1teSB2YXJpYWJsZSB0byBsb2FkIGF3dC5kbGwKLSAgICAgICAgICAgIGphdmEuYXd0LkNvbG9yIGF3dENvbG9yID0gbmV3IGphdmEuYXd0LkNvbG9yKDAsIDAsIDApOwotICAgICAgICAgICAgU3lzdGVtLmxvYWQoamF2YUhvbWUgKyAiXFxqYXd0LmRsbCIpOwotICAgICAgICB9IGVsc2UgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS52ZW5kb3IiKS5lcXVhbHMoIlN1biBNaWNyb3N5c3RlbXMgSW5jLiIpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgamF2YUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL2R1bW15IHZhcmlhYmxlIHRvIGxvYWQgYXd0LmRsbAotICAgICAgICAgICAgamF2YS5hd3QuQ29sb3IgYXd0Q29sb3IgPSBuZXcgamF2YS5hd3QuQ29sb3IoMCwgMCwgMCk7Ci0gICAgICAgICAgICBTeXN0ZW0ubG9hZChqYXZhSG9tZSArICJcXGJpblxcamF3dC5kbGwiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCXRocm93IG5ldyBPREZFeGNlcHRpb24oInNob3VsZCBiZSBsYXVuY2hlZCBieSB1c2luZyBJQk0gSmF2YSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLmxvYWQob3Blbk9mZmljZVByb2dyYW1QYXRoICsgInV3aW5hcGkuZGxsIik7Ci0gICAgICAgIFN5c3RlbS5sb2FkKG9wZW5PZmZpY2VQcm9ncmFtUGF0aCArICJvZmZpY2ViZWFuLmRsbCIpOwotICAgICAgICBTeXN0ZW0ubG9hZChvcGVuT2ZmaWNlUHJvZ3JhbVBhdGggKyAic2FsMy5kbGwiKTsKLSAgICAgICAgU3lzdGVtLmxvYWQob3Blbk9mZmljZVByb2dyYW1QYXRoICsgImpwaXBlLmRsbCIpOwotCi0gICAgICAgIENsYXNzTG9hZGVyIGphdmFDbGFzc0xvYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgIAlVUkxbXSBqYXJMaXN0ID0gbmV3IFVSTFtdIHsgbmV3IEZpbGUob3Blbk9mZmljZVByb2dyYW1QYXRoICsgImNsYXNzZXNcXGp1aC5qYXIiKS50b1VSTCgpLAotICAgICAgICAJCQluZXcgRmlsZShvcGVuT2ZmaWNlUHJvZ3JhbVBhdGggKyAiY2xhc3Nlc1xcanVydC5qYXIiKS50b1VSTCgpLAotICAgICAgICAJCQluZXcgRmlsZShvcGVuT2ZmaWNlUHJvZ3JhbVBhdGggKyAiY2xhc3Nlc1xccmlkbC5qYXIiKS50b1VSTCgpLAotICAgICAgICAJCQluZXcgRmlsZShvcGVuT2ZmaWNlUHJvZ3JhbVBhdGggKyAiY2xhc3Nlc1xcdW5vaWwuamFyIikudG9VUkwoKSB9OwotICAgICAgICAJCi0gICAgICAgIAlqYXZhQ2xhc3NMb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIoamFyTGlzdCwgQm9vdHN0cmFwLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE9ERkV4Y2VwdGlvbihtdXJsZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGphdmFDbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0V2luZG93Q2xhc3MoaW50IGh3bmQpIHsKLQkJVENIQVIgYnVmZmVyID0gbmV3IFRDSEFSKDAsIDEyOCk7Ci0JCU9TLkdldENsYXNzTmFtZShod25kLCBidWZmZXIsIGJ1ZmZlci5sZW5ndGgoKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoMCwgYnVmZmVyLnN0cmxlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldE9wZW5PZmZpY2VGcmFtZU51bShpbnQgaFduZCwgaW50IGZyYW1lTnVtKSB7Ci0JCWludCByZXN1bHQgPSBmcmFtZU51bTsKLQkJaW50IGhGcmFtZSA9IDA7Ci0JCWludCBod25kQ2hpbGQgPSBPUy5HZXRXaW5kb3cgKGhXbmQsIE9TLkdXX0NISUxEKTsKLQkJd2hpbGUgKGh3bmRDaGlsZCAhPSAwKSB7Ci0JCQlTdHJpbmcgd2luQ2xhc3MgPSBnZXRXaW5kb3dDbGFzcyhod25kQ2hpbGQpOwotCQkJaWYgKHdpbkNsYXNzLmVxdWFscygiU0FMVE1QU1VCRlJBTUUiKSkgewotCQkJCXJlc3VsdCsrOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgPSBnZXRPcGVuT2ZmaWNlRnJhbWVOdW0oaHduZENoaWxkLCByZXN1bHQpOwotCQkJfQotCQkJaHduZENoaWxkID0gT1MuR2V0V2luZG93KGh3bmRDaGlsZCwgT1MuR1dfSFdORE5FWFQpOwkJCQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGdldE9wZW5PZmZpY2VGcmFtZU51bSgpIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWludCBod25kQ2hpbGQgPSBPUy5HZXRXaW5kb3cgKE9TLkdldERlc2t0b3BXaW5kb3coKSwgT1MuR1dfQ0hJTEQpOwotCQl3aGlsZSAoaHduZENoaWxkICE9IDApIHsKLQkJCXJlc3VsdCA9IGdldE9wZW5PZmZpY2VGcmFtZU51bShod25kQ2hpbGQsIHJlc3VsdCk7Ci0JCQlTdHJpbmcgd2luQ2xhc3MgPSBnZXRXaW5kb3dDbGFzcyhod25kQ2hpbGQpOwotCQkJaWYgKHdpbkNsYXNzLmVxdWFscygiU0FMRlJBTUUiKSl7Ci0JCQkJcmVzdWx0Kys7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCA9IGdldE9wZW5PZmZpY2VGcmFtZU51bShod25kQ2hpbGQsIHJlc3VsdCk7Ci0JCQl9CQkJCi0JCQlod25kQ2hpbGQgPSBPUy5HZXRXaW5kb3coaHduZENoaWxkLCBPUy5HV19IV05ETkVYVCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9vb28vdXRpbC9PT29OYXZpZ2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9ycy9vb28vdXRpbC9PT29OYXZpZ2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YWViMDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvb29vL3V0aWwvT09vTmF2aWdhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgTm9yaW1hc2EgSEFZQVNISURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3JzLm9vby51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLk9ERkNvbnN0YW50cy5Db250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5EcmF3aW5nT2JqZWN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuYmFzZS5PREZFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi5kcjNkLkRyM2RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuQ29udHJvbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuRHJhd0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmRvbS5vZGYuZHJhdy5GcmFtZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLmRyYXcuUGFnZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnRhYmxlLlRhYmxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuZG9tLm9kZi50YWJsZS5UYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5kb20ub2RmLnV0aWwuY29udmVydGVyLk9ERkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwueHBhdGguWFBhdGhTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBjb20uc3VuLnN0YXIuY29udGFpbmVyLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmNvbnRhaW5lci5YTmFtZUFjY2VzczsKLWltcG9ydCBjb20uc3VuLnN0YXIuZHJhd2luZy5YRHJhd1BhZ2U7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmRyYXdpbmcuWERyYXdQYWdlU3VwcGxpZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmRyYXdpbmcuWERyYXdQYWdlczsKLWltcG9ydCBjb20uc3VuLnN0YXIuZHJhd2luZy5YRHJhd1BhZ2VzU3VwcGxpZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmZyYW1lLlhDb250cm9sbGVyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YRnJhbWU7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmZyYW1lLlhNb2RlbDsKLWltcG9ydCBjb20uc3VuLnN0YXIubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIubGFuZy5XcmFwcGVkVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5sYW5nLlhDb21wb25lbnQ7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuWE11bHRpU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnRhYmxlLlhDZWxsOwotaW1wb3J0IGNvbS5zdW4uc3Rhci50ZXh0LlhUZXh0RG9jdW1lbnQ7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnRleHQuWFRleHRFbWJlZGRlZE9iamVjdHNTdXBwbGllcjsKLWltcG9ydCBjb20uc3VuLnN0YXIudGV4dC5YVGV4dEdyYXBoaWNPYmplY3RzU3VwcGxpZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnRleHQuWFRleHRUYWJsZTsKLWltcG9ydCBjb20uc3VuLnN0YXIudGV4dC5YVGV4dFRhYmxlc1N1cHBsaWVyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci50ZXh0LlhUZXh0Vmlld0N1cnNvcjsKLWltcG9ydCBjb20uc3VuLnN0YXIudGV4dC5YVGV4dFZpZXdDdXJzb3JTdXBwbGllcjsKLWltcG9ydCBjb20uc3VuLnN0YXIudW5vLlVub1J1bnRpbWU7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnZpZXcuWFNlbGVjdGlvblN1cHBsaWVyOwotCi1wdWJsaWMgY2xhc3MgT09vTmF2aWdhdGlvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBfdGFyZ2V0Q29udGVudElEID0gbnVsbDsKLQlwcml2YXRlIE9ERkRvY3VtZW50IF9jb250ZW50WE1MID0gbnVsbDsKLQlwcml2YXRlIENvbnRlbnRUeXBlIF9maWxlVHlwZSA9IG51bGw7Ci0JcHJpdmF0ZSBYTXVsdGlTZXJ2aWNlRmFjdG9yeSBfeE1TRiA9IG51bGw7Ci0JcHJpdmF0ZSBYQ29tcG9uZW50IF94Q29tcCA9IG51bGw7Ci0KLQlwdWJsaWMgT09vTmF2aWdhdGlvbihYTXVsdGlTZXJ2aWNlRmFjdG9yeSB4TVNGLCBYQ29tcG9uZW50IHhDb21wb25lbnQpIHsKLQkJdGhpcy5feE1TRiA9IHhNU0Y7Ci0JCXRoaXMuX3hDb21wID0geENvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50WE1MKE9ERkRvY3VtZW50IGNvbnRlbnRYTUwpIHsKLQkJdGhpcy5fY29udGVudFhNTCA9IGNvbnRlbnRYTUw7Ci0JfQotCi0JcHVibGljIE9ERkRvY3VtZW50IGdldENvbnRlbnRYTUwoKSB7Ci0JCXJldHVybiB0aGlzLl9jb250ZW50WE1MOwotCX0KLQotCS8vIFRPRE8gZmluZCBOb2RlIGZyb20gQnJvd3NlcgotCXB1YmxpYyB2b2lkIGp1bXBUb1Byb2JsZW1Qb3NpdGlvbihOb2RlIHRhcmdldE5vZGUpIHRocm93cyBPREZFeGNlcHRpb24gewotCQl0aGlzLl90YXJnZXRDb250ZW50SUQgPSAoKEVsZW1lbnQpIHRhcmdldE5vZGUpCi0JCQkJLmdldEF0dHJpYnV0ZShPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQpOwotCQlpZiAobnVsbCA9PSB0aGlzLl90YXJnZXRDb250ZW50SUQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChudWxsID09IHRoaXMuX2ZpbGVUeXBlKSB7Ci0JCQl0aGlzLl9maWxlVHlwZSA9IE9ERlV0aWxzLmdldE9ERkZpbGVUeXBlKHRoaXMuX2NvbnRlbnRYTUwpOwotCQl9Ci0JCWlmICh0aGlzLl9maWxlVHlwZSA9PSBDb250ZW50VHlwZS5OT05FKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlYTW9kZWwgeE1vZGVsID0gKFhNb2RlbCkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYTW9kZWwuY2xhc3MsCi0JCQkJdGhpcy5feENvbXApOwotCQlYQ29udHJvbGxlciB4Q29udHJvbGxlciA9IHhNb2RlbC5nZXRDdXJyZW50Q29udHJvbGxlcigpOwotCQkvLyBiZWZvcmUgc2VsZWN0IGVycm9yIGNvbnRlbnQgc2V0IERyYXdpbmcgbW9kZQotCQlpZiAodGhpcy5fZmlsZVR5cGUgPT0gQ29udGVudFR5cGUuUFJFU0VOVEFUSU9OKSB7Ci0JCQlPT29VSUNvbnRyb2xzLnNldERyYXdpbmdNb2RlKF94TVNGLCB4Q29udHJvbGxlcik7Ci0JCX0KLQotCQlTdHJpbmcgZHJhd1ByZWZpeCA9IHRoaXMuX2NvbnRlbnRYTUwKLQkJCQkubG9va3VwUHJlZml4KERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJKTsKLQkJU3RyaW5nIGRyM2RQcmVmaXggPSB0aGlzLl9jb250ZW50WE1MCi0JCQkJLmxvb2t1cFByZWZpeChEcjNkQ29uc3RhbnRzLkRSM0RfTkFNRVNQQUNFX1VSSSk7Ci0KLQkJU3RyaW5nIHRhcmdldE5vZGVOYW1lID0gdGFyZ2V0Tm9kZS5nZXROb2RlTmFtZSgpOwotCQlTdHJpbmcgdGFyZ2V0T2RmTm9kZU5hbWUgPSAoKEVsZW1lbnQpIHRhcmdldE5vZGUpCi0JCQkJLmdldEF0dHJpYnV0ZShPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX1RBR05BTUUpOwotCQlpZiAodGFyZ2V0Tm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiaW1nIikpIHsKLQkJCWp1bXBUb1Byb2JsZW1JbWFnZSh0YXJnZXROb2RlKTsKLQkJfSBlbHNlIGlmICh0YXJnZXRPZGZOb2RlTmFtZS5lcXVhbHMoZHJhd1ByZWZpeCArICI6IgotCQkJCSsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX09CSkVDVCkpIHsKLQkJCWp1bXBUb1Byb2JsZW1PYmplY3QodGFyZ2V0Tm9kZSk7Ci0JCX0gZWxzZSBpZiAodGFyZ2V0Tm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgidGFibGUiKSkgewotCQkJanVtcFRvUHJvYmxlbVRhYmxlKHRhcmdldE5vZGUpOwotCQl9IGVsc2UgaWYgKCh0YXJnZXRPZGZOb2RlTmFtZS5lcXVhbHMoZHJhd1ByZWZpeCArICI6IgotCQkJCSsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX0NBUFRJT04pKQotCQkJCXx8ICh0YXJnZXRPZGZOb2RlTmFtZS5lcXVhbHMoZHJhd1ByZWZpeCArICI6IgotCQkJCQkJKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfQ0lSQ0xFKSkKLQkJCQl8fCAodGFyZ2V0T2RmTm9kZU5hbWUuZXF1YWxzKGRyYXdQcmVmaXggKyAiOiIKLQkJCQkJCSsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX0NVU1RPTV9TSEFQRSkpCi0JCQkJfHwgKHRhcmdldE9kZk5vZGVOYW1lLmVxdWFscyhkcmF3UHJlZml4ICsgIjoiCi0JCQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9FTExJUFNFKSkKLQkJCQl8fCAodGFyZ2V0T2RmTm9kZU5hbWUuZXF1YWxzKGRyYXdQcmVmaXggKyAiOiIKLQkJCQkJCSsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX0cpKQotCQkJCXx8ICh0YXJnZXRPZGZOb2RlTmFtZS5lcXVhbHMoZHJhd1ByZWZpeCArICI6IgotCQkJCQkJKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfTElORSkpCi0JCQkJfHwgKHRhcmdldE9kZk5vZGVOYW1lLmVxdWFscyhkcmF3UHJlZml4ICsgIjoiCi0JCQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9DT05ORUNUT1IpKQotCQkJCXx8ICh0YXJnZXRPZGZOb2RlTmFtZS5lcXVhbHMoZHJhd1ByZWZpeCArICI6IgotCQkJCQkJKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUE9MWUdPTikpCi0JCQkJfHwgKHRhcmdldE9kZk5vZGVOYW1lLmVxdWFscyhkcmF3UHJlZml4ICsgIjoiCi0JCQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9QT0xZTElORSkpCi0JCQkJfHwgKHRhcmdldE9kZk5vZGVOYW1lLmVxdWFscyhkcmF3UHJlZml4ICsgIjoiCi0JCQkJCQkrIERyYXdDb25zdGFudHMuRUxFTUVOVF9SRUNUKSkKLQkJCQl8fCAodGFyZ2V0T2RmTm9kZU5hbWUuZXF1YWxzKGRyYXdQcmVmaXggKyAiOiIKLQkJCQkJCSsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX1JFR1VMQVJfUE9MWUdPTikpCi0JCQkJfHwgKHRhcmdldE9kZk5vZGVOYW1lLmVxdWFscyhkcjNkUHJlZml4ICsgIjoiCi0JCQkJCQkrIERyM2RDb25zdGFudHMuRUxFTUVOVF9TQ0VORSkpKSB7Ci0JCQlqdW1wVG9Qcm9ibGVtRHJhd2luZ1NoYXBlKHRhcmdldE5vZGUpOwotCQl9IGVsc2UgaWYgKHRhcmdldE9kZk5vZGVOYW1lLmVxdWFscyhkcmF3UHJlZml4ICsgIjoiCi0JCQkJKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUEFHRSkpIHsKLQkJCWp1bXBUb1Byb2JsZW1EcmF3aW5nUGFnZSh0YXJnZXROb2RlKTsKLQkJfSBlbHNlIGlmICh0YXJnZXRPZGZOb2RlTmFtZS5lcXVhbHMoZHJhd1ByZWZpeCArICI6IgotCQkJCSsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX0NPTlRST0wpKSB7Ci0JCQlqdW1wVG9Qcm9ibGVtRm9ybUNvbnRyb2wodGFyZ2V0Tm9kZSk7Ci0JCX0KLQotCQkvLyBhZnRlciBzZWxlY3QgZXJyb3IgY29udGVudCBoaWRlIFVJIGVsZW1lbnRzCi0JCXRyeSB7Ci0JCQlYRnJhbWUgeEZyYW1lID0geENvbnRyb2xsZXIuZ2V0RnJhbWUoKTsKLQkJCU9Pb1VJQ29udHJvbHMuaGlkZVVJRWxlbWVudHMoeEZyYW1lLCB0aGlzLl94TVNGKTsKLQkJfSBjYXRjaCAoT0RGRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQganVtcFRvUHJvYmxlbVRhYmxlKE5vZGUgdGFyZ2V0Tm9kZSkgdGhyb3dzIE9ERkV4Y2VwdGlvbiB7Ci0JCVhNb2RlbCB4TW9kZWwgPSAoWE1vZGVsKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhNb2RlbC5jbGFzcywKLQkJCQl0aGlzLl94Q29tcCk7Ci0JCVhTZWxlY3Rpb25TdXBwbGllciBzZWxlY3Rpb25TdXBwbGllciA9IChYU2VsZWN0aW9uU3VwcGxpZXIpIFVub1J1bnRpbWUKLQkJCQkucXVlcnlJbnRlcmZhY2UoWFNlbGVjdGlvblN1cHBsaWVyLmNsYXNzLCB4TW9kZWwKLQkJCQkJCS5nZXRDdXJyZW50Q29udHJvbGxlcigpKTsKLQotCQlpZiAoQ29udGVudFR5cGUuV1JJVEUuZXF1YWxzKHRoaXMuX2ZpbGVUeXBlKSkgewotCQkJWFRleHREb2N1bWVudCB4VGV4dERvYyA9IChYVGV4dERvY3VtZW50KSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKAotCQkJCQlYVGV4dERvY3VtZW50LmNsYXNzLCB0aGlzLl94Q29tcCk7Ci0KLQkJCVhUZXh0VGFibGVzU3VwcGxpZXIgeFRhYmxlU3VwcGxpZXIgPSAoWFRleHRUYWJsZXNTdXBwbGllcikgVW5vUnVudGltZQotCQkJCQkucXVlcnlJbnRlcmZhY2UoWFRleHRUYWJsZXNTdXBwbGllci5jbGFzcywgeFRleHREb2MpOwotCi0JCQlYTmFtZUFjY2VzcyB4TmFtZUFjY2VzcyA9IHhUYWJsZVN1cHBsaWVyLmdldFRleHRUYWJsZXMoKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKCEodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIG9kZkNvbnRlbnRJZCA9ICgoRWxlbWVudCkgdGFyZ2V0Tm9kZSkKLQkJCQkJCS5nZXRBdHRyaWJ1dGUoT0RGQ29udmVydGVyLk9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEKTsKLQkJCQlOb2RlTGlzdCBubCA9IFhQYXRoU2VydmljZUZhY3RvcnkKLQkJCQkJCS5uZXdTZXJ2aWNlKCkKLQkJCQkJCS5ldmFsUGF0aEZvck5vZGVMaXN0KAotCQkJCQkJCQkiLy8qW25hbWVzcGFjZS11cmkoKT0nIgotCQkJCQkJCQkJCSsgVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSQotCQkJCQkJCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkJCQkJCSsgVGFibGVDb25zdGFudHMuRUxFTUVOVF9UQUJMRQotCQkJCQkJCQkJCSsgIiddW0AiCi0JCQkJCQkJCQkJKyBPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQKLQkJCQkJCQkJCQkrICI9JyIgKyBvZGZDb250ZW50SWQgKyAiJ10iLAotCQkJCQkJCQlfY29udGVudFhNTC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCQkJaWYgKChubCA9PSBudWxsKSB8fCAobmwuZ2V0TGVuZ3RoKCkgIT0gMSkpCi0JCQkJCXJldHVybjsKLQkJCQlUYWJsZUVsZW1lbnQgdGFibGVFbGVtID0gKFRhYmxlRWxlbWVudCkgbmwuaXRlbSgwKTsKLQkJCQlTdHJpbmcgdGFibGVOYW1lID0gdGFibGVFbGVtLmdldEF0dHJpYnV0ZU5TKAotCQkJCQkJVGFibGVDb25zdGFudHMuVEFCTEVfTkFNRVNQQUNFX1VSSSwKLQkJCQkJCVRhYmxlQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0JCQkJT2JqZWN0IG9UYWJsZSA9IHhOYW1lQWNjZXNzLmdldEJ5TmFtZSh0YWJsZU5hbWUpOwotCQkJCVhUZXh0VGFibGUgeFRhYmxlID0gKFhUZXh0VGFibGUpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoCi0JCQkJCQlYVGV4dFRhYmxlLmNsYXNzLCBvVGFibGUpOwotCQkJCXNlbGVjdGlvblN1cHBsaWVyLnNlbGVjdCh4VGFibGUpOwotCi0JCQkJLy8gc2VsZWN0IHdob2xlIHRhYmxlCi0JCQkJWENvbnRyb2xsZXIgeENvbnRyb2xsZXIgPSB4TW9kZWwuZ2V0Q3VycmVudENvbnRyb2xsZXIoKTsKLQkJCQlYVGV4dFZpZXdDdXJzb3JTdXBwbGllciB4VGV4dFZpZXdDdXJzb3JTdXBwbGllciA9IChYVGV4dFZpZXdDdXJzb3JTdXBwbGllcikgVW5vUnVudGltZQotCQkJCQkJLnF1ZXJ5SW50ZXJmYWNlKFhUZXh0Vmlld0N1cnNvclN1cHBsaWVyLmNsYXNzLAotCQkJCQkJCQl4Q29udHJvbGxlcik7Ci0JCQkJWFRleHRWaWV3Q3Vyc29yIHhUZXh0Vmlld0N1cnNvciA9IHhUZXh0Vmlld0N1cnNvclN1cHBsaWVyCi0JCQkJCQkuZ2V0Vmlld0N1cnNvcigpOwotCQkJCXhUZXh0Vmlld0N1cnNvci5jb2xsYXBzZVRvU3RhcnQoKTsKLQotCQkJCVhDZWxsIGxhc3RDZWxsID0geFRhYmxlCi0JCQkJCQkuZ2V0Q2VsbEJ5TmFtZSh4VGFibGUuZ2V0Q2VsbE5hbWVzKClbeFRhYmxlCi0JCQkJCQkJCS5nZXRDZWxsTmFtZXMoKS5sZW5ndGggLSAxXSk7Ci0JCQkJc2VsZWN0aW9uU3VwcGxpZXIuc2VsZWN0KGxhc3RDZWxsKTsKLQkJCQl4VGV4dFZpZXdDdXJzb3IuZ290b1N0YXJ0KHRydWUpOwotCQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJdGhyb3cgbmV3IE9ERkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJdGhyb3cgbmV3IE9ERkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQganVtcFRvUHJvYmxlbUltYWdlKE5vZGUgdGFyZ2V0Tm9kZSkgdGhyb3dzIE9ERkV4Y2VwdGlvbiB7Ci0JCVhNb2RlbCB4TW9kZWwgPSAoWE1vZGVsKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhNb2RlbC5jbGFzcywKLQkJCQl0aGlzLl94Q29tcCk7Ci0JCVhTZWxlY3Rpb25TdXBwbGllciBzZWxlY3Rpb25TdXBwbGllciA9IChYU2VsZWN0aW9uU3VwcGxpZXIpIFVub1J1bnRpbWUKLQkJCQkucXVlcnlJbnRlcmZhY2UoWFNlbGVjdGlvblN1cHBsaWVyLmNsYXNzLCB4TW9kZWwKLQkJCQkJCS5nZXRDdXJyZW50Q29udHJvbGxlcigpKTsKLQotCQlpZiAoISh0YXJnZXROb2RlIGluc3RhbmNlb2YgRWxlbWVudCkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBvZGZDb250ZW50SWQgPSAoKEVsZW1lbnQpIHRhcmdldE5vZGUpCi0JCQkJLmdldEF0dHJpYnV0ZShPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQpOwotCQlOb2RlTGlzdCBubCA9IFhQYXRoU2VydmljZUZhY3RvcnkubmV3U2VydmljZSgpCi0JCQkJLmV2YWxQYXRoRm9yTm9kZUxpc3QoCi0JCQkJCQkiLy8qW0AiICsgT0RGQ29udmVydGVyLk9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lECi0JCQkJCQkJCSsgIj0nIiArIG9kZkNvbnRlbnRJZCArICInXSIsCi0JCQkJCQlfY29udGVudFhNTC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCWlmICgobmwgPT0gbnVsbCkgfHwgKG5sLmdldExlbmd0aCgpICE9IDEpKQotCQkJcmV0dXJuOwotCQlpZiAoIShubC5pdGVtKDApIGluc3RhbmNlb2YgT0RGRWxlbWVudCkpCi0JCQlyZXR1cm47Ci0KLQkJTm9kZSBwYXJlbnQgPSBubC5pdGVtKDApLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKCEocGFyZW50IGluc3RhbmNlb2YgRnJhbWVFbGVtZW50KSkKLQkJCXJldHVybjsKLQotCQlGcmFtZUVsZW1lbnQgZnJhbWVFbGVtID0gKEZyYW1lRWxlbWVudCkgcGFyZW50OwotCQlTdHJpbmcgZHJhd05hbWUgPSBmcmFtZUVsZW0uZ2V0QXR0cmlidXRlTlMoCi0JCQkJRHJhd0NvbnN0YW50cy5EUkFXX05BTUVTUEFDRV9VUkksIERyYXdDb25zdGFudHMuQVRUUl9OQU1FKTsKLQkJaWYgKGRyYXdOYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJT2JqZWN0IHhEb2MgPSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhUZXh0RG9jdW1lbnQuY2xhc3MsCi0JCQkJdGhpcy5feENvbXApOwotCQlpZiAoKHhEb2MgIT0gbnVsbCkgJiYgKHhEb2MgaW5zdGFuY2VvZiBYVGV4dERvY3VtZW50KSkgewotCQkJWFRleHREb2N1bWVudCB4VGV4dERvYyA9IChYVGV4dERvY3VtZW50KSB4RG9jOwotCQkJWFRleHRHcmFwaGljT2JqZWN0c1N1cHBsaWVyIHhHcmFwaGljU3VwcGxpZXIgPSAoWFRleHRHcmFwaGljT2JqZWN0c1N1cHBsaWVyKSBVbm9SdW50aW1lCi0JCQkJCS5xdWVyeUludGVyZmFjZShYVGV4dEdyYXBoaWNPYmplY3RzU3VwcGxpZXIuY2xhc3MsIHhUZXh0RG9jKTsKLQkJCVhOYW1lQWNjZXNzIHhOYW1lQWNjZXNzID0geEdyYXBoaWNTdXBwbGllci5nZXRHcmFwaGljT2JqZWN0cygpOwotCQkJdHJ5IHsKLQkJCQlPYmplY3Qgb2JqID0geE5hbWVBY2Nlc3MuZ2V0QnlOYW1lKGRyYXdOYW1lKTsKLQkJCQlzZWxlY3Rpb25TdXBwbGllci5zZWxlY3Qob2JqKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoV3JhcHBlZFRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlPYmplY3QgeFBhZ2VTdXBwbGllciA9IFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoCi0JCQkJWERyYXdQYWdlc1N1cHBsaWVyLmNsYXNzLCB0aGlzLl94Q29tcCk7Ci0JCWlmICgoeFBhZ2VTdXBwbGllciAhPSBudWxsKQotCQkJCSYmICh4UGFnZVN1cHBsaWVyIGluc3RhbmNlb2YgWERyYXdQYWdlc1N1cHBsaWVyKSkgewotCQkJWERyYXdQYWdlc1N1cHBsaWVyIHhEcmF3UGFnZXNTdXBwbGllciA9IChYRHJhd1BhZ2VzU3VwcGxpZXIpIHhQYWdlU3VwcGxpZXI7Ci0JCQlpbnQgekluZGV4ID0gKGludCkgZnJhbWVFbGVtLmdldFpJbmRleCgpOwotCQkJaW50IHBhZ2VJbmRleCA9IChpbnQpIGZyYW1lRWxlbS5nZXRQYWdlSW5kZXgoKTsKLQkJCWlmICgoekluZGV4ICE9IC0xKSAmJiAocGFnZUluZGV4ICE9IC0xKSkgewotCQkJCVhEcmF3UGFnZXMgeERyYXdQYWdlcyA9IHhEcmF3UGFnZXNTdXBwbGllci5nZXREcmF3UGFnZXMoKTsKLQkJCQl0cnkgewotCQkJCQlPYmplY3QgeFBhZ2UgPSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhEcmF3UGFnZS5jbGFzcywKLQkJCQkJCQl4RHJhd1BhZ2VzLmdldEJ5SW5kZXgocGFnZUluZGV4KSk7Ci0JCQkJCWlmICgoeFBhZ2UgIT0gbnVsbCkgJiYgKHhQYWdlIGluc3RhbmNlb2YgWERyYXdQYWdlKSkgewotCQkJCQkJWERyYXdQYWdlIHhEcmF3UGFnZSA9IChYRHJhd1BhZ2UpIHhQYWdlOwotCQkJCQkJT2JqZWN0IG9iaiA9IHhEcmF3UGFnZS5nZXRCeUluZGV4KHpJbmRleCk7Ci0JCQkJCQlzZWxlY3Rpb25TdXBwbGllci5zZWxlY3Qob2JqKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQganVtcFRvUHJvYmxlbU9iamVjdChOb2RlIHRhcmdldE5vZGUpIHRocm93cyBPREZFeGNlcHRpb24gewotCQlYTW9kZWwgeE1vZGVsID0gKFhNb2RlbCkgVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYTW9kZWwuY2xhc3MsCi0JCQkJdGhpcy5feENvbXApOwotCQlYU2VsZWN0aW9uU3VwcGxpZXIgc2VsZWN0aW9uU3VwcGxpZXIgPSAoWFNlbGVjdGlvblN1cHBsaWVyKSBVbm9SdW50aW1lCi0JCQkJLnF1ZXJ5SW50ZXJmYWNlKFhTZWxlY3Rpb25TdXBwbGllci5jbGFzcywgeE1vZGVsCi0JCQkJCQkuZ2V0Q3VycmVudENvbnRyb2xsZXIoKSk7Ci0KLQkJaWYgKCEodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgb2RmQ29udGVudElkID0gKChFbGVtZW50KSB0YXJnZXROb2RlKQotCQkJCS5nZXRBdHRyaWJ1dGUoT0RGQ29udmVydGVyLk9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEKTsKLQkJTm9kZUxpc3QgbmwgPSBYUGF0aFNlcnZpY2VGYWN0b3J5Lm5ld1NlcnZpY2UoKQotCQkJCS5ldmFsUGF0aEZvck5vZGVMaXN0KAotCQkJCQkJIi8vKltAIiArIE9ERkNvbnZlcnRlci5PVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRAotCQkJCQkJCQkrICI9JyIgKyBvZGZDb250ZW50SWQgKyAiJ10iLAotCQkJCQkJX2NvbnRlbnRYTUwuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotCQlpZiAoKG5sID09IG51bGwpIHx8IChubC5nZXRMZW5ndGgoKSAhPSAxKSkKLQkJCXJldHVybjsKLQkJaWYgKCEobmwuaXRlbSgwKSBpbnN0YW5jZW9mIE9ERkVsZW1lbnQpKQotCQkJcmV0dXJuOwotCi0JCU5vZGUgcGFyZW50ID0gbmwuaXRlbSgwKS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmICghKHBhcmVudCBpbnN0YW5jZW9mIEZyYW1lRWxlbWVudCkpCi0JCQlyZXR1cm47Ci0KLQkJRnJhbWVFbGVtZW50IGZyYW1lRWxlbSA9IChGcmFtZUVsZW1lbnQpIHBhcmVudDsKLQkJU3RyaW5nIGRyYXdOYW1lID0gZnJhbWVFbGVtLmdldEF0dHJpYnV0ZU5TKAotCQkJCURyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJLCBEcmF3Q29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0JCWlmIChkcmF3TmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCU9iamVjdCB4RG9jID0gVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYVGV4dERvY3VtZW50LmNsYXNzLAotCQkJCXRoaXMuX3hDb21wKTsKLQkJaWYgKCh4RG9jICE9IG51bGwpICYmICh4RG9jIGluc3RhbmNlb2YgWFRleHREb2N1bWVudCkpIHsKLQkJCVhUZXh0RG9jdW1lbnQgeFRleHREb2MgPSAoWFRleHREb2N1bWVudCkgeERvYzsKLQkJCVhUZXh0RW1iZWRkZWRPYmplY3RzU3VwcGxpZXIgeEdyYXBoaWNTdXBwbGllciA9IChYVGV4dEVtYmVkZGVkT2JqZWN0c1N1cHBsaWVyKSBVbm9SdW50aW1lCi0JCQkJCS5xdWVyeUludGVyZmFjZShYVGV4dEVtYmVkZGVkT2JqZWN0c1N1cHBsaWVyLmNsYXNzLAotCQkJCQkJCXhUZXh0RG9jKTsKLQkJCVhOYW1lQWNjZXNzIHhOYW1lQWNjZXNzID0geEdyYXBoaWNTdXBwbGllci5nZXRFbWJlZGRlZE9iamVjdHMoKTsKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IG9iaiA9IHhOYW1lQWNjZXNzLmdldEJ5TmFtZShkcmF3TmFtZSk7Ci0JCQkJc2VsZWN0aW9uU3VwcGxpZXIuc2VsZWN0KG9iaik7Ci0JCQkJcmV0dXJuOwotCQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJT2JqZWN0IHhQYWdlU3VwcGxpZXIgPSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKAotCQkJCVhEcmF3UGFnZXNTdXBwbGllci5jbGFzcywgdGhpcy5feENvbXApOwotCQlpZiAoKHhQYWdlU3VwcGxpZXIgIT0gbnVsbCkKLQkJCQkmJiAoeFBhZ2VTdXBwbGllciBpbnN0YW5jZW9mIFhEcmF3UGFnZXNTdXBwbGllcikpIHsKLQkJCVhEcmF3UGFnZXNTdXBwbGllciB4RHJhd1BhZ2VzU3VwcGxpZXIgPSAoWERyYXdQYWdlc1N1cHBsaWVyKSB4UGFnZVN1cHBsaWVyOwotCQkJaW50IHpJbmRleCA9IChpbnQpIGZyYW1lRWxlbS5nZXRaSW5kZXgoKTsKLQkJCWludCBwYWdlSW5kZXggPSAoaW50KSBmcmFtZUVsZW0uZ2V0UGFnZUluZGV4KCk7Ci0JCQlpZiAoKHpJbmRleCAhPSAtMSkgJiYgKHBhZ2VJbmRleCAhPSAtMSkpIHsKLQkJCQlYRHJhd1BhZ2VzIHhEcmF3UGFnZXMgPSB4RHJhd1BhZ2VzU3VwcGxpZXIuZ2V0RHJhd1BhZ2VzKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJT2JqZWN0IHhQYWdlID0gVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYRHJhd1BhZ2UuY2xhc3MsCi0JCQkJCQkJeERyYXdQYWdlcy5nZXRCeUluZGV4KHBhZ2VJbmRleCkpOwotCQkJCQlpZiAoKHhQYWdlICE9IG51bGwpICYmICh4UGFnZSBpbnN0YW5jZW9mIFhEcmF3UGFnZSkpIHsKLQkJCQkJCVhEcmF3UGFnZSB4RHJhd1BhZ2UgPSAoWERyYXdQYWdlKSB4UGFnZTsKLQkJCQkJCU9iamVjdCBvYmogPSB4RHJhd1BhZ2UuZ2V0QnlJbmRleCh6SW5kZXgpOwotCQkJCQkJc2VsZWN0aW9uU3VwcGxpZXIuc2VsZWN0KG9iaik7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9IGNhdGNoIChXcmFwcGVkVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGp1bXBUb1Byb2JsZW1EcmF3aW5nU2hhcGUoTm9kZSB0YXJnZXROb2RlKSB0aHJvd3MgT0RGRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVhNb2RlbCB4TW9kZWwgPSAoWE1vZGVsKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhNb2RlbC5jbGFzcywKLQkJCQkJdGhpcy5feENvbXApOwotCQkJWFNlbGVjdGlvblN1cHBsaWVyIHNlbGVjdGlvblN1cHBsaWVyID0gKFhTZWxlY3Rpb25TdXBwbGllcikgVW5vUnVudGltZQotCQkJCQkucXVlcnlJbnRlcmZhY2UoWFNlbGVjdGlvblN1cHBsaWVyLmNsYXNzLCB4TW9kZWwKLQkJCQkJCQkuZ2V0Q3VycmVudENvbnRyb2xsZXIoKSk7Ci0KLQkJCWlmICghKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgb2RmQ29udGVudElkID0gKChFbGVtZW50KSB0YXJnZXROb2RlKQotCQkJCQkuZ2V0QXR0cmlidXRlKE9ERkNvbnZlcnRlci5PVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRCk7Ci0JCQlOb2RlTGlzdCBubCA9IFhQYXRoU2VydmljZUZhY3RvcnkubmV3U2VydmljZSgpLmV2YWxQYXRoRm9yTm9kZUxpc3QoCi0JCQkJCSIvLypbQCIgKyBPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQgKyAiPSciCi0JCQkJCQkJKyBvZGZDb250ZW50SWQgKyAiJ10iLAotCQkJCQlfY29udGVudFhNTC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCQlpZiAoKG5sID09IG51bGwpIHx8IChubC5nZXRMZW5ndGgoKSAhPSAxKSkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoIShubC5pdGVtKDApIGluc3RhbmNlb2YgRHJhd2luZ09iamVjdEVsZW1lbnQpKQotCQkJCXJldHVybjsKLQotCQkJRHJhd2luZ09iamVjdEVsZW1lbnQgc2hhcGVFbGVtID0gKERyYXdpbmdPYmplY3RFbGVtZW50KSBubC5pdGVtKDApOwotCQkJaW50IHpJbmRleCA9IChpbnQpIHNoYXBlRWxlbS5nZXRaSW5kZXgoKTsKLQkJCWlmICh6SW5kZXggPj0gMCkgewotCQkJCU9iamVjdCB4UGFnZVN1cHBsaWVyID0gVW5vUnVudGltZS5xdWVyeUludGVyZmFjZSgKLQkJCQkJCVhEcmF3UGFnZVN1cHBsaWVyLmNsYXNzLCB0aGlzLl94Q29tcCk7Ci0JCQkJaWYgKHhQYWdlU3VwcGxpZXIgaW5zdGFuY2VvZiBYRHJhd1BhZ2VTdXBwbGllcikgewotCQkJCQlYRHJhd1BhZ2VTdXBwbGllciB4RHJhd1BhZ2VTdXBwbGllciA9IChYRHJhd1BhZ2VTdXBwbGllcikgeFBhZ2VTdXBwbGllcjsKLQkJCQkJWERyYXdQYWdlIHhEcmF3UGFnZSA9IHhEcmF3UGFnZVN1cHBsaWVyLmdldERyYXdQYWdlKCk7Ci0JCQkJCWlmIChudWxsICE9IHhEcmF3UGFnZSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlPYmplY3Qgb2JqID0geERyYXdQYWdlLmdldEJ5SW5kZXgoekluZGV4KTsKLQkJCQkJCQlzZWxlY3Rpb25TdXBwbGllci5zZWxlY3Qob2JqKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfSBjYXRjaCAoV3JhcHBlZFRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlPYmplY3QgeFBhZ2VzU3VwcGxpZXIgPSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKAotCQkJCQkJWERyYXdQYWdlc1N1cHBsaWVyLmNsYXNzLCB0aGlzLl94Q29tcCk7Ci0JCQkJaWYgKCh4UGFnZXNTdXBwbGllciAhPSBudWxsKQotCQkJCQkJJiYgKHhQYWdlc1N1cHBsaWVyIGluc3RhbmNlb2YgWERyYXdQYWdlc1N1cHBsaWVyKSkgewotCQkJCQlYRHJhd1BhZ2VzU3VwcGxpZXIgeERyYXdQYWdlc1N1cHBsaWVyID0gKFhEcmF3UGFnZXNTdXBwbGllcikgeFBhZ2VzU3VwcGxpZXI7Ci0JCQkJCWludCBwYWdlSW5kZXggPSAoaW50KSBzaGFwZUVsZW0uZ2V0UGFnZUluZGV4KCk7Ci0JCQkJCWlmICgoekluZGV4ICE9IC0xKSAmJiAocGFnZUluZGV4ICE9IC0xKSkgewotCQkJCQkJWERyYXdQYWdlcyB4RHJhd1BhZ2VzID0geERyYXdQYWdlc1N1cHBsaWVyCi0JCQkJCQkJCS5nZXREcmF3UGFnZXMoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJT2JqZWN0IHhQYWdlID0gVW5vUnVudGltZS5xdWVyeUludGVyZmFjZSgKLQkJCQkJCQkJCVhEcmF3UGFnZS5jbGFzcywgeERyYXdQYWdlcwotCQkJCQkJCQkJCQkuZ2V0QnlJbmRleChwYWdlSW5kZXgpKTsKLQkJCQkJCQlpZiAoKHhQYWdlICE9IG51bGwpICYmICh4UGFnZSBpbnN0YW5jZW9mIFhEcmF3UGFnZSkpIHsKLQkJCQkJCQkJWERyYXdQYWdlIHhEcmF3UGFnZSA9IChYRHJhd1BhZ2UpIHhQYWdlOwotCQkJCQkJCQlPYmplY3Qgb2JqID0geERyYXdQYWdlLmdldEJ5SW5kZXgoekluZGV4KTsKLQkJCQkJCQkJc2VsZWN0aW9uU3VwcGxpZXIuc2VsZWN0KG9iaik7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfSBjYXRjaCAoV3JhcHBlZFRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJaWFlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgbmV3IE9ERkV4Y2VwdGlvbihpYWUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBqdW1wVG9Qcm9ibGVtRHJhd2luZ1BhZ2UoTm9kZSB0YXJnZXROb2RlKSB0aHJvd3MgT0RGRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVhNb2RlbCB4TW9kZWwgPSAoWE1vZGVsKSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhNb2RlbC5jbGFzcywKLQkJCQkJdGhpcy5feENvbXApOwotCQkJWFNlbGVjdGlvblN1cHBsaWVyIHNlbGVjdGlvblN1cHBsaWVyID0gKFhTZWxlY3Rpb25TdXBwbGllcikgVW5vUnVudGltZQotCQkJCQkucXVlcnlJbnRlcmZhY2UoWFNlbGVjdGlvblN1cHBsaWVyLmNsYXNzLCB4TW9kZWwKLQkJCQkJCQkuZ2V0Q3VycmVudENvbnRyb2xsZXIoKSk7Ci0KLQkJCWlmIChDb250ZW50VHlwZS5QUkVTRU5UQVRJT04uZXF1YWxzKHRoaXMuX2ZpbGVUeXBlKSkgewotCQkJCWlmICghKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkKLQkJCQkJcmV0dXJuOwotCQkJCVN0cmluZyBvZGZDb250ZW50SWQgPSAoKEVsZW1lbnQpIHRhcmdldE5vZGUpCi0JCQkJCQkuZ2V0QXR0cmlidXRlKE9ERkNvbnZlcnRlci5PVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRCk7Ci0JCQkJTm9kZUxpc3QgbmwgPSBYUGF0aFNlcnZpY2VGYWN0b3J5Ci0JCQkJCQkubmV3U2VydmljZSgpCi0JCQkJCQkuZXZhbFBhdGhGb3JOb2RlTGlzdCgKLQkJCQkJCQkJIi8vKltuYW1lc3BhY2UtdXJpKCk9JyIKLQkJCQkJCQkJCQkrIERyYXdDb25zdGFudHMuRFJBV19OQU1FU1BBQ0VfVVJJCi0JCQkJCQkJCQkJKyAiJyBhbmQgbG9jYWwtbmFtZSgpPSciCi0JCQkJCQkJCQkJKyBEcmF3Q29uc3RhbnRzLkVMRU1FTlRfUEFHRQotCQkJCQkJCQkJCSsgIiddW0AiCi0JCQkJCQkJCQkJKyBPREZDb252ZXJ0ZXIuT1VUUFVUX0FUVFJfT0RGX0NPTlRFTlRfSUQKLQkJCQkJCQkJCQkrICI9JyIgKyBvZGZDb250ZW50SWQgKyAiJ10iLAotCQkJCQkJCQlfY29udGVudFhNTC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCQkJaWYgKChubCA9PSBudWxsKSB8fCAobmwuZ2V0TGVuZ3RoKCkgIT0gMSkpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAobmwuaXRlbSgwKSBpbnN0YW5jZW9mIFBhZ2VFbGVtZW50KSB7Ci0JCQkJCVBhZ2VFbGVtZW50IHBhZ2VFbGVtID0gKFBhZ2VFbGVtZW50KSBubC5pdGVtKDApOwotCQkJCQlpbnQgcGFnZUluZGV4ID0gKGludCkgcGFnZUVsZW0uZ2V0UGFnZUluZGV4KCk7Ci0JCQkJCVhEcmF3UGFnZSB4RHJhd1BhZ2UgPSBPREZVdGlscy5nZXREcmF3UGFnZUJ5SW5kZXgoCi0JCQkJCQkJdGhpcy5feENvbXAsIHBhZ2VJbmRleCk7Ci0JCQkJCXNlbGVjdGlvblN1cHBsaWVyLnNlbGVjdCh4RHJhd1BhZ2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlpYWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKGlhZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGp1bXBUb1Byb2JsZW1Gb3JtQ29udHJvbChOb2RlIHRhcmdldE5vZGUpIHRocm93cyBPREZFeGNlcHRpb24gewotCQl0cnkgewotCQkJWE1vZGVsIHhNb2RlbCA9IChYTW9kZWwpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWE1vZGVsLmNsYXNzLAotCQkJCQl0aGlzLl94Q29tcCk7Ci0JCQlYU2VsZWN0aW9uU3VwcGxpZXIgc2VsZWN0aW9uU3VwcGxpZXIgPSAoWFNlbGVjdGlvblN1cHBsaWVyKSBVbm9SdW50aW1lCi0JCQkJCS5xdWVyeUludGVyZmFjZShYU2VsZWN0aW9uU3VwcGxpZXIuY2xhc3MsIHhNb2RlbAotCQkJCQkJCS5nZXRDdXJyZW50Q29udHJvbGxlcigpKTsKLQotCQkJaWYgKCEodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKQotCQkJCXJldHVybjsKLQkJCVN0cmluZyBvZGZDb250ZW50SWQgPSAoKEVsZW1lbnQpIHRhcmdldE5vZGUpCi0JCQkJCS5nZXRBdHRyaWJ1dGUoT0RGQ29udmVydGVyLk9VVFBVVF9BVFRSX09ERl9DT05URU5UX0lEKTsKLQkJCU5vZGVMaXN0IG5sID0gWFBhdGhTZXJ2aWNlRmFjdG9yeS5uZXdTZXJ2aWNlKCkuZXZhbFBhdGhGb3JOb2RlTGlzdCgKLQkJCQkJIi8vKltuYW1lc3BhY2UtdXJpKCk9JyIgKyBEcmF3Q29uc3RhbnRzLkRSQVdfTkFNRVNQQUNFX1VSSQotCQkJCQkJCSsgIicgYW5kIGxvY2FsLW5hbWUoKT0nIgotCQkJCQkJCSsgRHJhd0NvbnN0YW50cy5FTEVNRU5UX0NPTlRST0wgKyAiJ11bQCIKLQkJCQkJCQkrIE9ERkNvbnZlcnRlci5PVVRQVVRfQVRUUl9PREZfQ09OVEVOVF9JRCArICI9JyIKLQkJCQkJCQkrIG9kZkNvbnRlbnRJZCArICInXSIsCi0JCQkJCV9jb250ZW50WE1MLmdldERvY3VtZW50RWxlbWVudCgpKTsKLQkJCWlmICgobmwgPT0gbnVsbCkgfHwgKG5sLmdldExlbmd0aCgpICE9IDEpKQotCQkJCXJldHVybjsKLQkJCWlmICghKG5sLml0ZW0oMCkgaW5zdGFuY2VvZiBDb250cm9sRWxlbWVudCkpCi0JCQkJcmV0dXJuOwotCi0JCQlDb250cm9sRWxlbWVudCBlbGVtID0gKENvbnRyb2xFbGVtZW50KSBubC5pdGVtKDApOwotCQkJaW50IHpJbmRleCA9IChpbnQpIGVsZW0uZ2V0WkluZGV4KCk7Ci0JCQlpZiAoekluZGV4ID49IDApIHsKLQkJCQlPYmplY3QgeFBhZ2VTdXBwbGllciA9IFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoCi0JCQkJCQlYRHJhd1BhZ2VTdXBwbGllci5jbGFzcywgdGhpcy5feENvbXApOwotCQkJCWlmICh4UGFnZVN1cHBsaWVyIGluc3RhbmNlb2YgWERyYXdQYWdlU3VwcGxpZXIpIHsKLQkJCQkJWERyYXdQYWdlU3VwcGxpZXIgeERyYXdQYWdlU3VwcGxpZXIgPSAoWERyYXdQYWdlU3VwcGxpZXIpIHhQYWdlU3VwcGxpZXI7Ci0JCQkJCVhEcmF3UGFnZSB4RHJhd1BhZ2UgPSB4RHJhd1BhZ2VTdXBwbGllci5nZXREcmF3UGFnZSgpOwotCQkJCQlpZiAobnVsbCAhPSB4RHJhd1BhZ2UpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJT2JqZWN0IG9iaiA9IHhEcmF3UGFnZS5nZXRCeUluZGV4KHpJbmRleCk7Ci0JCQkJCQkJc2VsZWN0aW9uU3VwcGxpZXIuc2VsZWN0KG9iaik7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0gY2F0Y2ggKFdyYXBwZWRUYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJT2JqZWN0IHhQYWdlc1N1cHBsaWVyID0gVW5vUnVudGltZS5xdWVyeUludGVyZmFjZSgKLQkJCQkJCVhEcmF3UGFnZXNTdXBwbGllci5jbGFzcywgdGhpcy5feENvbXApOwotCQkJCWlmICgoeFBhZ2VzU3VwcGxpZXIgIT0gbnVsbCkKLQkJCQkJCSYmICh4UGFnZXNTdXBwbGllciBpbnN0YW5jZW9mIFhEcmF3UGFnZXNTdXBwbGllcikpIHsKLQkJCQkJWERyYXdQYWdlc1N1cHBsaWVyIHhEcmF3UGFnZXNTdXBwbGllciA9IChYRHJhd1BhZ2VzU3VwcGxpZXIpIHhQYWdlc1N1cHBsaWVyOwotCQkJCQlpbnQgcGFnZUluZGV4ID0gKGludCkgZWxlbS5nZXRQYWdlSW5kZXgoKTsKLQkJCQkJaWYgKCh6SW5kZXggIT0gLTEpICYmIChwYWdlSW5kZXggIT0gLTEpKSB7Ci0JCQkJCQlYRHJhd1BhZ2VzIHhEcmF3UGFnZXMgPSB4RHJhd1BhZ2VzU3VwcGxpZXIKLQkJCQkJCQkJLmdldERyYXdQYWdlcygpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlPYmplY3QgeFBhZ2UgPSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKAotCQkJCQkJCQkJWERyYXdQYWdlLmNsYXNzLCB4RHJhd1BhZ2VzCi0JCQkJCQkJCQkJCS5nZXRCeUluZGV4KHBhZ2VJbmRleCkpOwotCQkJCQkJCWlmICgoeFBhZ2UgIT0gbnVsbCkgJiYgKHhQYWdlIGluc3RhbmNlb2YgWERyYXdQYWdlKSkgewotCQkJCQkJCQlYRHJhd1BhZ2UgeERyYXdQYWdlID0gKFhEcmF3UGFnZSkgeFBhZ2U7Ci0JCQkJCQkJCU9iamVjdCBvYmogPSB4RHJhd1BhZ2UuZ2V0QnlJbmRleCh6SW5kZXgpOwotCQkJCQkJCQlzZWxlY3Rpb25TdXBwbGllci5zZWxlY3Qob2JqKTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9IGNhdGNoIChXcmFwcGVkVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlpYWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBuZXcgT0RGRXhjZXB0aW9uKGlhZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvb29vL3V0aWwvT09vVUlDb250cm9scy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvcnMvb29vL3V0aWwvT09vVUlDb250cm9scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTVjZTkyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3JzL29vby91dGlsL09Pb1VJQ29udHJvbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIE5vcmltYXNhIEhBWUFTSElEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5vb28udXRpbDsKLQotaW1wb3J0IGNvbS5zdW4uc3Rhci5iZWFucy5Qcm9wZXJ0eTsKLWltcG9ydCBjb20uc3VuLnN0YXIuYmVhbnMuUHJvcGVydHlWYWx1ZTsKLWltcG9ydCBjb20uc3VuLnN0YXIuYmVhbnMuUHJvcGVydHlWZXRvRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5iZWFucy5Vbmtub3duUHJvcGVydHlFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmJlYW5zLlhQcm9wZXJ0eVNldDsKLWltcG9ydCBjb20uc3VuLnN0YXIuYmVhbnMuWFByb3BlcnR5U2V0SW5mbzsKLWltcG9ydCBjb20uc3VuLnN0YXIuZnJhbWUuWENvbnRyb2xsZXI7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmZyYW1lLlhEaXNwYXRjaDsKLWltcG9ydCBjb20uc3VuLnN0YXIuZnJhbWUuWERpc3BhdGNoSGVscGVyOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YRGlzcGF0Y2hQcm92aWRlcjsKLWltcG9ydCBjb20uc3VuLnN0YXIuZnJhbWUuWEZyYW1lOwotaW1wb3J0IGNvbS5zdW4uc3Rhci5mcmFtZS5YTGF5b3V0TWFuYWdlcjsKLWltcG9ydCBjb20uc3VuLnN0YXIubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5zdGFyLmxhbmcuV3JhcHBlZFRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIubGFuZy5YTXVsdGlTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLnN0YXIudWkuWFVJRWxlbWVudDsKLWltcG9ydCBjb20uc3VuLnN0YXIudW5vLkFueUNvbnZlcnRlcjsKLWltcG9ydCBjb20uc3VuLnN0YXIudW5vLkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnN0YXIudW5vLlVub1J1bnRpbWU7Ci1pbXBvcnQgY29tLnN1bi5zdGFyLnV0aWwuWFVSTFRyYW5zZm9ybWVyOwotCi0KLQotcHVibGljIGNsYXNzIE9Pb1VJQ29udHJvbHMgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGhpZGVVSUVsZW1lbnRzKFhGcmFtZSB4RnJhbWUsIFhNdWx0aVNlcnZpY2VGYWN0b3J5IHhNU0YpIHRocm93cyBPREZFeGNlcHRpb24gewotCQl0cnkgewotCSAgICAgICAgWERpc3BhdGNoUHJvdmlkZXIgeERpc3BhdGNoUHJvdmlkZXIgPSAoWERpc3BhdGNoUHJvdmlkZXIpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWERpc3BhdGNoUHJvdmlkZXIuY2xhc3MsIHhGcmFtZSk7CQkJCi0JICAgICAgICBPYmplY3Qgb0Rpc3BhdGNoSGVscGVyID0geE1TRi5jcmVhdGVJbnN0YW5jZSgiY29tLnN1bi5zdGFyLmZyYW1lLkRpc3BhdGNoSGVscGVyIik7Ci0JICAgIAlYRGlzcGF0Y2hIZWxwZXIgZGlzcGF0Y2hIZWxwZXIgPSAoWERpc3BhdGNoSGVscGVyKUFueUNvbnZlcnRlci50b09iamVjdChYRGlzcGF0Y2hIZWxwZXIuY2xhc3MsIG9EaXNwYXRjaEhlbHBlcik7Ci0KLQkgICAgCWV4ZWN1dGVYRGlzcGF0Y2goIk5vcm1hbE11bHRpUGFuZUdVSSIsIEJvb2xlYW4uVFJVRSwgeERpc3BhdGNoUHJvdmlkZXIsIGRpc3BhdGNoSGVscGVyKTsKLQkgICAgICAgIGV4ZWN1dGVYRGlzcGF0Y2goIklucHV0TGluZVZpc2libGUiLCBCb29sZWFuLkZBTFNFLCB4RGlzcGF0Y2hQcm92aWRlciwgZGlzcGF0Y2hIZWxwZXIpOwotICAgICAgICAgICAgZXhlY3V0ZVhEaXNwYXRjaCgiTGVmdFBhbmVEcmF3IiwgQm9vbGVhbi5GQUxTRSwgeERpc3BhdGNoUHJvdmlkZXIsIGRpc3BhdGNoSGVscGVyKTsKLSAgICAgICAgICAgIGV4ZWN1dGVYRGlzcGF0Y2goIkxlZnRQYW5lSW1wcmVzcyIsIEJvb2xlYW4uRkFMU0UsIHhEaXNwYXRjaFByb3ZpZGVyLCBkaXNwYXRjaEhlbHBlcik7Ci0JICAgICAgICBleGVjdXRlWERpc3BhdGNoKCJSaWdodFBhbmUiLCBCb29sZWFuLkZBTFNFLCB4RGlzcGF0Y2hQcm92aWRlciwgZGlzcGF0Y2hIZWxwZXIpOwotCSAgICAgICAgZXhlY3V0ZVhEaXNwYXRjaCgiUnVsZXIiLCBCb29sZWFuLkZBTFNFLCB4RGlzcGF0Y2hQcm92aWRlciwgZGlzcGF0Y2hIZWxwZXIpOwotICAgICAgICAgICAgZXhlY3V0ZVhEaXNwYXRjaCgiU2hvd1J1bGVyIiwgQm9vbGVhbi5GQUxTRSwgeERpc3BhdGNoUHJvdmlkZXIsIGRpc3BhdGNoSGVscGVyKTsKLSAgICAgICAgICAgIGV4ZWN1dGVYRGlzcGF0Y2goIlpvb21QYWdlIiwgQm9vbGVhbi5UUlVFLCB4RGlzcGF0Y2hQcm92aWRlciwgZGlzcGF0Y2hIZWxwZXIpOwotICAgICAgICAgICAgCi0JICAgICAgICBoaWRlWFVJRWxlbWVudHMoeEZyYW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0JCQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXREcmF3aW5nTW9kZShYTXVsdGlTZXJ2aWNlRmFjdG9yeSB4TVNGLCBYQ29udHJvbGxlciBjb250cm9sbGVyKSB0aHJvd3MgT0RGRXhjZXB0aW9uIHsKLSAgICAJcmV0dXJuIGV4ZWN1dGVYRGlzcGF0Y2hBY3Rpb24oeE1TRiwgY29udHJvbGxlciwgInNsb3Q6MjcwMDkiKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBoaWRlWFVJRWxlbWVudHMoWEZyYW1lIHhGcmFtZSkgdGhyb3dzIE9ERkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhMYXlvdXRNYW5hZ2VyIHhMYXlvdXRNYW5hZ2VyID0gT0RGVXRpbHMuZ2V0WExheW91dE1hbmFnZXIoeEZyYW1lKTsKLSAgICAgICAgICAgIFhVSUVsZW1lbnRbXSB4VUlFbGVtcyA9IHhMYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRzKCk7Ci0KLSAgICAgICAgICAgIFhQcm9wZXJ0eVNldCB4VUlFbGVtUHJvcFNldDsKLSAgICAgICAgICAgIFhQcm9wZXJ0eVNldEluZm8geFVJRWxlbVByb3BTZXRJbmZvOwotICAgICAgICAgICAgUHJvcGVydHlbXSB4VUlFbGVtUHJvcHM7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHhVSUVsZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgeFVJRWxlbVByb3BTZXQgPSAoWFByb3BlcnR5U2V0KSBVbm9SdW50aW1lLnF1ZXJ5SW50ZXJmYWNlKFhQcm9wZXJ0eVNldC5jbGFzcywgeFVJRWxlbXNbaV0pOwotICAgICAgICAgICAgICAgIHhVSUVsZW1Qcm9wU2V0SW5mbyA9IHhVSUVsZW1Qcm9wU2V0LmdldFByb3BlcnR5U2V0SW5mbygpOwotICAgICAgICAgICAgICAgIGlmKHhVSUVsZW1Qcm9wU2V0SW5mby5oYXNQcm9wZXJ0eUJ5TmFtZSgiUGVyc2lzdGVudCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhVSUVsZW1Qcm9wU2V0LnNldFByb3BlcnR5VmFsdWUoIlBlcnNpc3RlbnQiLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeFVJRWxlbVByb3BzID0geFVJRWxlbVByb3BTZXRJbmZvLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHhVSUVsZW1Qcm9wcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoeFVJRWxlbVByb3BzW2pdLk5hbWUuZXF1YWxzKCJSZXNvdXJjZVVSTCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4TGF5b3V0TWFuYWdlci5oaWRlRWxlbWVudCh4VUlFbGVtUHJvcFNldC5nZXRQcm9wZXJ0eVZhbHVlKHhVSUVsZW1Qcm9wc1tqXS5OYW1lKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVW5rbm93blByb3BlcnR5RXhjZXB0aW9uIHVwZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE9ERkV4Y2VwdGlvbih1cGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoV3JhcHBlZFRhcmdldEV4Y2VwdGlvbiB3dGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPREZFeGNlcHRpb24od3RlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFByb3BlcnR5VmV0b0V4Y2VwdGlvbiBwdmUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPREZFeGNlcHRpb24ocHZlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPREZFeGNlcHRpb24oaWFlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV4ZWN1dGVYRGlzcGF0Y2goU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSwgWERpc3BhdGNoUHJvdmlkZXIgeERpc3BhdGNoUHJvdmlkZXIsCi0gICAgCQlYRGlzcGF0Y2hIZWxwZXIgZGlzcGF0Y2hIZWxwZXIpIHRocm93cyBPREZFeGNlcHRpb24gewotICAgIAlQcm9wZXJ0eVZhbHVlW10gcFZhbHVlID0gbmV3IFByb3BlcnR5VmFsdWVbMV07Ci0gICAgICAgIHBWYWx1ZVswXSA9IG5ldyBQcm9wZXJ0eVZhbHVlKCk7Ci0gICAgICAgIHBWYWx1ZVswXS5OYW1lID0gbmFtZTsKLSAgICAgICAgcFZhbHVlWzBdLlZhbHVlID0gdmFsdWU7Ci0KLSAgICAgICAgZGlzcGF0Y2hIZWxwZXIuZXhlY3V0ZURpc3BhdGNoKHhEaXNwYXRjaFByb3ZpZGVyLCAiLnVubzoiICsgbmFtZSwgIiIsIDAsIHBWYWx1ZSk7Ci0gICAgfQotICAgIAotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBleGVjdXRlWERpc3BhdGNoQWN0aW9uKFhNdWx0aVNlcnZpY2VGYWN0b3J5IHhNU0YsIFhDb250cm9sbGVyIGNvbnRyb2xsZXIsIFN0cmluZyBhY3Rpb24pIHsKLQkJdHJ5IHsKLQkJCVhEaXNwYXRjaFByb3ZpZGVyIGRpc3BhdGNoUHJvdmlkZXIgPSAoWERpc3BhdGNoUHJvdmlkZXIpVW5vUnVudGltZS5xdWVyeUludGVyZmFjZShYRGlzcGF0Y2hQcm92aWRlci5jbGFzcywgY29udHJvbGxlcik7Ci0JCQlpZiAobnVsbCAhPSBkaXNwYXRjaFByb3ZpZGVyKSB7Ci0JCQkJY29tLnN1bi5zdGFyLnV0aWwuVVJMIGFjdGlvblVSTFtdID0gbmV3IGNvbS5zdW4uc3Rhci51dGlsLlVSTFsxXTsKLQkJCQlhY3Rpb25VUkxbMF0gPSBuZXcgY29tLnN1bi5zdGFyLnV0aWwuVVJMKCk7Ci0JCQkJYWN0aW9uVVJMWzBdLkNvbXBsZXRlID0gYWN0aW9uOwotCQkJCVhVUkxUcmFuc2Zvcm1lciB1cmxUcmFuc2Zvcm1lciA9IChYVVJMVHJhbnNmb3JtZXIpIFVub1J1bnRpbWUucXVlcnlJbnRlcmZhY2UoWFVSTFRyYW5zZm9ybWVyLmNsYXNzLAotCQkJCQkJeE1TRi5jcmVhdGVJbnN0YW5jZSgiY29tLnN1bi5zdGFyLnV0aWwuVVJMVHJhbnNmb3JtZXIiKSk7Ci0JCQkJdXJsVHJhbnNmb3JtZXIucGFyc2VTdHJpY3QoYWN0aW9uVVJMKTsKLQkJCQlYRGlzcGF0Y2ggZGlzcGF0Y2ggPSBkaXNwYXRjaFByb3ZpZGVyLnF1ZXJ5RGlzcGF0Y2goYWN0aW9uVVJMWzBdLCAiIiwgMCk7Ci0JCQkJaWYgKG51bGwgIT0gZGlzcGF0Y2gpIHsKLQkJCQkJZGlzcGF0Y2guZGlzcGF0Y2goYWN0aW9uVVJMWzBdLCBuZXcgUHJvcGVydHlWYWx1ZVswXSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vT09vRWRpdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vT09vRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NTdmZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL09Pb0VkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgTm9yaW1hc2EgSEFZQVNISURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb287Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvcnMub29vLk9Pb0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLklNb2RlbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5JTW9kZWxTZXJ2aWNlSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLkR1bW15RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydDsKLQotLyoqCi0gKiBUaGUgRWRpdG9yIGltcGxlbWVudGF0aW9uIHRvIG9wZW4gT3BlbkRvY3VtZW50IEZvcm1hdCAoT0RGKSBmaWxlcyBieSB1c2luZwotICogT3Blbk9mZmljZS5vcmcuIEl0IGFsc28gcHJvdmlkZSBhY2Nlc3MgdG8gbW9kZWwgdmlhIHtAbGluayBJTW9kZWxTZXJ2aWNlfS4KLSAqIAotICogQHNlZSBJTW9kZWxTZXJ2aWNlSG9sZGVyCi0gKiBAc2VlIElNb2RlbFNlcnZpY2UKLSAqLwotcHVibGljIGNsYXNzIE9Pb0VkaXRvciBleHRlbmRzIEVkaXRvclBhcnQgaW1wbGVtZW50cyBJTW9kZWxTZXJ2aWNlSG9sZGVyIHsKLQotCS8qKgotCSAqIElEIG9mIHRoaXMgRWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBPT29FZGl0b3IuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBPT29Db21wb3NpdGUgX29kZkJyb3dzZXI7Ci0KLQlwcml2YXRlIElFZGl0b3JJbnB1dCBpbnB1dDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgT3Blbk9mZmljZS5vcmcgRWRpdG9yLgotCSAqLwotCXB1YmxpYyBPT29FZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzZXRTaXRlKHNpdGUpOwotCQlzZXRJbnB1dChpbnB1dCk7Ci0JCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIHRhcmdldFVybCA9IG51bGw7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIER1bW15RWRpdG9ySW5wdXQpIHsKLQkJCXRhcmdldFVybCA9ICgoRHVtbXlFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFVybCgpOwotCQkJaWYgKCIiLmVxdWFscyh0YXJnZXRVcmwpKSB7Ci0JCQkJdGFyZ2V0VXJsID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXRoaXMuX29kZkJyb3dzZXIgPSBuZXcgT09vQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUsIHRoaXMpOwotCQlpZiAodGFyZ2V0VXJsICE9IG51bGwpIHsKLQkJCV9vZGZCcm93c2VyLm9wZW4odGFyZ2V0VXJsKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0KLQlwdWJsaWMgSU1vZGVsU2VydmljZSBnZXRNb2RlbFNlcnZpY2UoKSB7Ci0JCXJldHVybiB0aGlzLl9vZGZCcm93c2VyOwotCX0KLQotCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLl9vZGZCcm93c2VyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3JUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJc2V0UGFydE5hbWUodGl0bGUpOwotCQlzZXRJbnB1dFdpdGhOb3RpZnkobmV3IER1bW15RWRpdG9ySW5wdXQoX29kZkJyb3dzZXIuZ2V0VVJMKCksIGlucHV0Ci0JCQkJLmdldE5hbWUoKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9hY3Rpb25zL0VkaXRPREZBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9hY3Rpb25zL0VkaXRPREZBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4NDg3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vYWN0aW9ucy9FZGl0T0RGQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51aS51dGlsLlBsYXRmb3JtVUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0KLQotcHVibGljIGNsYXNzIEVkaXRPREZBY3Rpb24gZXh0ZW5kcyBBY3Rpb257Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJFZGl0IjsKLQotICAgIHB1YmxpYyBFZGl0T0RGQWN0aW9uKCkgewotICAgICAgICBzZXRUZXh0KG1lc3NhZ2UpOwotICAgICAgICBzZXRUb29sVGlwVGV4dChtZXNzYWdlKTsKLSAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUlVdGlsLmdldFNoYXJlZEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19ERUZfVklFVykpOyAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIE1lc3NhZ2VCb3ggbXNnQm94ID0gbmV3IE1lc3NhZ2VCb3goUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9LKTsKLSAgICAgICAgbXNnQm94LnNldE1lc3NhZ2UoIm5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKLSAgICAgICAgbXNnQm94Lm9wZW4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vYWN0aW9ucy9PcGVuT0RGQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vYWN0aW9ucy9PcGVuT0RGQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiY2M2ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvcnMub29vL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvcnMvb29vL2FjdGlvbnMvT3Blbk9ERkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9ycy5vb28uT09vRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28uT09vRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkudXRpbC5Nb2RlbFNlcnZpY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnVpLnV0aWwuUGxhdGZvcm1VSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgT3Blbk9ERkFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gT09vRWRpdG9yUGx1Z2luCi0JCQkuZ2V0UmVzb3VyY2VTdHJpbmcoIk9ERkVkaXRvckFjdGlvbi5PcGVuIik7Ci0KLQlwdWJsaWMgT3Blbk9ERkFjdGlvbigpIHsKLQkJc2V0VGV4dChtZXNzYWdlKTsKLQkJc2V0VG9vbFRpcFRleHQobWVzc2FnZSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJVXRpbAotCQkJCS5nZXRTaGFyZWRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJRmlsZURpYWxvZyBvcGVuRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQlvcGVuRGlhbG9nCi0JCQkJLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7ICJPcGVuRG9jdW1lbnQgKCoub2R0OyAqLm9kcDsgKi5vZHMpIiB9KTsKLQkJb3BlbkRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLm9kdDsgKi5vZHA7ICoub2RzIiB9KTsKLQkJU3RyaW5nIHNVcmwgPSBvcGVuRGlhbG9nLm9wZW4oKTsKLQotCQlpZiAoc1VybCAhPSBudWxsKSB7Ci0JCQlNb2RlbFNlcnZpY2VVdGlscy5sYXVuY2goc1VybCwgT09vRWRpdG9yLklEKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9hY3Rpb25zL1NhdmVPREZBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3JzL29vby9hY3Rpb25zL1NhdmVPREZBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2MzcxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9ycy5vb28vc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9ycy9vb28vYWN0aW9ucy9TYXZlT0RGQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3JzLm9vby5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51aS51dGlsLlBsYXRmb3JtVUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0KLQotcHVibGljIGNsYXNzIFNhdmVPREZBY3Rpb24gZXh0ZW5kcyBBY3Rpb257Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJTYXZlIjsKLQotICAgIHB1YmxpYyBTYXZlT0RGQWN0aW9uKCkgewotICAgICAgICBzZXRUZXh0KG1lc3NhZ2UpOwotICAgICAgICBzZXRUb29sVGlwVGV4dChtZXNzYWdlKTsKLSAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUlVdGlsLmdldFNoYXJlZEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19ERUZfVklFVykpOyAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIE1lc3NhZ2VCb3ggbXNnQm94ID0gbmV3IE1lc3NhZ2VCb3goUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9LKTsKLSAgICAgICAgbXNnQm94LnNldE1lc3NhZ2UoIm5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKLSAgICAgICAgbXNnQm94Lm9wZW4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDZhOTZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MzU4MTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBNYXkgMTIgMTc6MDA6MzcgSlNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy8vc3JjL21lc3NhZ2VzLnByb3BlcnRpZXM9ODg1OV8xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZDIyNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQUNURiBNb2RlbCBVSSBQbHVnLWluIChJbmN1YmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuTW9kZWxVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuYWN0Zi5jb3JlLAotIG9yZy5lY2xpcHNlLmFjdGYudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aSwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvciwKLSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIsCi0gb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS51dGlsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODFkYmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzUxNzc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgY29uZmlnLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL2NvbmZpZy9mYXZvcml0ZXMucHJlZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9jb25maWcvZmF2b3JpdGVzLnByZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NzE4NDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL2NvbmZpZy9mYXZvcml0ZXMucHJlZgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUaHUgTWF5IDEwIDE4OjA2OjAyIEpTVCAyMDA3Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1JQk09aHR0cFw6Ly93d3cuaWJtLmNvbS8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvaWNvbnMvYnJvd3Nlci9nby5wbmcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvaWNvbnMvYnJvd3Nlci9nby5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTVlYmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL2ljb25zL2Jyb3dzZXIvZ28ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL2ljb25zL3Rvb2xiYXIvcmVsb2FkLnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9pY29ucy90b29sYmFyL3JlbG9hZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZjVmYjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL2ljb25zL3Rvb2xiYXIvcmVsb2FkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9pY29ucy90b29sYmFyL3NjcmlwdERlYnVnLnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9pY29ucy90b29sYmFyL3NjcmlwdERlYnVnLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmOWJiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvaWNvbnMvdG9vbGJhci9zY3JpcHREZWJ1Zy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvaWNvbnMvdG9vbGJhci9zdG9wLnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9pY29ucy90b29sYmFyL3N0b3AucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDI4YzQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9pY29ucy90b29sYmFyL3N0b3AucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjNWNmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJicm93c2VyRmF2b3JpdGVzIiBuYW1lPSJXZWIgQnJvd3NlciBGYXZvcml0ZXMiIHNjaGVtYT0ic2NoZW1hL2Jyb3dzZXJGYXZvcml0ZXMuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0id2ViQnJvd3NlckV2ZW50TGlzdGVuZXIiIG5hbWU9IldlYiBCcm93c2VyIEV2ZW50IExpc3RlbmVyIiBzY2hlbWE9InNjaGVtYS93ZWJCcm93c2VyRXZlbnRMaXN0ZW5lci5leHNkIi8+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zY2hlbWEvYnJvd3NlckZhdm9yaXRlcy5leHNkIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NjaGVtYS9icm93c2VyRmF2b3JpdGVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMjExZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NjaGVtYS9icm93c2VyRmF2b3JpdGVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aSIgaWQ9ImJyb3dzZXJGYXZvcml0ZXMiIG5hbWU9IldlYiBCcm93c2VyIEZhdm9yaXRlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFkZCBpbml0aWFsIEJyb3dzZXIgRmF2b3JpdGVzLiBGYXZvcml0ZXMgaW5mb3JtYXRpb24gbmVlZHMgdG8gYmUgd3JpdHRlbiBpbiBwcm9wZXJ0aWVzIGZpbGUgZm9ybWF0LiBQbGVhc2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiBmYXZvcml0ZXMgYXMga2V5IGFuZCBzdG9yZSB0aGUgVVJMIGluIHZhbHVlLgotCi0mbHQ7cHJlJmd0OwotRWNsaXBzZS5vcmdcIGhvbWU9aHR0cFw6Ly93d3cuZWNsaXBzZS5vcmcvCi0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmF2b3JpdGVzIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYXZvcml0ZXMiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmRmlsZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoZSByZXNvdXJjZSBvZiBwcm9wZXJ0aWVzIGZpbGUgdGhhdCBpbmNsdWRlIGJyb3dzZXIgZmF2b3JpdGVzIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBleHRlbnNpb24gZGVmaW5pdGlvbjoKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmJyb3dzZXJGYXZvcml0ZXMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7ZmF2b3JpdGVzIHByZWZGaWxlPSZxdW90O2Zhdm9yaXRlcy5wcm9wZXJ0aWVzJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGNvbnRyaWJ1dG9yIHdpbGwgc3BlY2lmeSB0aGUgcHJvcGVydGllcyBmaWxlIHRoYXQgaW5jbHVkZSBicm93c2VyIGZhdm9yaXRlcyBpbmZvcm1hdGlvbiBhcyBhIHJlc291cmNlLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZXhhbXBsZSB1c2UgY2FzZSBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbiAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5hY3RmLmV4YW1wbGVzLmFpYnJvd3NlciZsdDsvc2FtcCZndDsgcGx1Z2luLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcwotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zY2hlbWEvd2ViQnJvd3NlckV2ZW50TGlzdGVuZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zY2hlbWEvd2ViQnJvd3NlckV2ZW50TGlzdGVuZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0NDQ4MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc2NoZW1hL3dlYkJyb3dzZXJFdmVudExpc3RlbmVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aSIgaWQ9IndlYkJyb3dzZXJFdmVudExpc3RlbmVyIiBuYW1lPSJXZWIgQnJvd3NlciBFdmVudCBMaXN0ZW5lciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFkZCBuZXcgRXZlbnQgTGlzdGVuZXJzIHRvIEFDVEYgV2ViIEJyb3dzZXJzLiBMaXN0ZW5lcnMgY2FuIHJlY2VpdmUgYnJvd3NlciBldmVudHMsIHN1Y2ggYXMgdGl0bGUgY2hhbmdlLCBuYXZpZ2F0ZSBjb21wbGV0ZSwgZXRjLi4gKFNlZSAmbHQ7c2FtcCZndDtJV2ViQnJvd3NlckFDVEZFdmVudExpc3RlbmVyJmx0Oy9zYW1wJmd0OyBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IGV2ZW50cy4pCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imxpc3RlbmVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJsaXN0ZW5lciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSVdlYkJyb3dzZXJBQ1RGRXZlbnRMaXN0ZW5lciZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5JV2ViQnJvd3NlckFDVEZFdmVudExpc3RlbmVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gZXh0ZW5zaW9uIGRlZmluaXRpb246Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS53ZWJCcm93c2VyRXZlbnRMaXN0ZW5lciZxdW90OyZndDsKLSAgICAgICZsdDtsaXN0ZW5lcgotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuYWN0Zi5haS5uYXZpZ2F0b3IuaW1wbC5XZWJFdmVudExpc3RlbmVyJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGNvbnRyaWJ1dG9yIHdpbGwgYWRkIG5ldyBFdmVudCBMaXN0ZW5lciBieSB1c2luZyAmbHQ7c2FtcCZndDtsaXN0bmVyJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGUuIFRoZSBzcGVjaWZpZWQgY2xhc3MgbXVzdCBpbXBsZW1lbnQgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5JV2ViQnJvd3NlckFDVEZFdmVudExpc3RlbmVyJmx0Oy9zYW1wJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuYWN0Zi5haS5uYXZpZ2F0b3ImbHQ7L3NhbXAmZ3Q7IHBsdWdpbiBoYXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24uIChJZiB5b3UgaW5jbHVkZSB0aGUgcGx1Z2luLCB0aGUgRXZlbnQgTGlzdGVuZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyZCB0byB0aGlzIGV4dGVuc2lvbi4pCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTQ3MDFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU1lbnVDb25zdC4mRm9udF8yID0gRm9udCBTaXplKCZYKQotTWVudUNvbnN0Lkxhcmdlc3RfMyA9IExhcmdlc3RcdCgmRykKLU1lbnVDb25zdC5MYXJnZV80ID0gTGFyZ2VcdCgmTCkKLU1lbnVDb25zdC5NZWRpdW1fNSA9IE1lZGl1bVx0KCZNKQotTWVudUNvbnN0LlNtYWxsXzYgPSBTbWFsbFx0KCZTKQotTWVudUNvbnN0LlNtYWxsZXN0XzcgPSBTbWFsbGVzdFx0KCZBKQotTWVudUNvbnN0LkYmYXZvcml0ZXNfOCA9IEYmYXZvcml0ZXMKLU1lbnVDb25zdC5BZGRGYXZvcml0ZXMgPSAmQWRkIHRvIEZhdm9yaXRlcwotTWVudUNvbnN0LkFycmFuZ2VGYXZvcml0ZXMgPSAmT3JnYW5pemUgRmF2b3JpdGVzCi0KLVdlYkJyb3dzZXIuQWRkcmVzcyA9IEEmZGRyZXNzCi1XZWJCcm93c2VyLkJhY2t3YXJkXzQgPSAmQmFjawotV2ViQnJvd3Nlci5Gb3J3YXJkXzUgPSAmRm9yd2FyZAotV2ViQnJvd3Nlci5TdG9wID0gJlN0b3AKLVdlYkJyb3dzZXIuUmVmcmVzaCA9ICZSZWZyZXNoCi1XZWJCcm93c2VyLlNjcmlwdCA9ICZPbWl0IFNjcmlwdCBEZWJ1ZyBNZXNzYWdlcwotV2ViQnJvd3Nlci5HbyA9IEdvCi0KLVdlYkJyb3dzZXIuQmFja3dhcmRfNF90cCA9IEJhY2sKLVdlYkJyb3dzZXIuRm9yd2FyZF81X3RwID0gRm9yd2FyZAotV2ViQnJvd3Nlci5TdG9wX3RwID0gU3RvcAotV2ViQnJvd3Nlci5SZWZyZXNoX3RwID0gUmVmcmVzaAotV2ViQnJvd3Nlci5TY3JpcHRfdHAgPSBPbWl0IHNjcmlwdCBkZWJ1ZyBtZXNzYWdlcwotV2ViQnJvd3Nlci5Hb190cCA9IEdvCi0KLURpYWxvZ0FycmFuZ2VGYXZvcml0ZS5UaXRsZSA9IEFycmFuZ2UgRmF2b3JpdGVzCi1EaWFsb2dBcnJhbmdlRmF2b3JpdGUuTW9kaWZ5X05hbWUgPSAmUmVuYW1lCi1EaWFsb2dBcnJhbmdlRmF2b3JpdGUuRGVsZXRlID0gJkRlbGV0ZQotCi1EaWFsb2dBZGRGYXZvcml0ZS5UaXRsZSA9IEVkaXQgTmFtZQotRGlhbG9nQWRkRmF2b3JpdGUuTmFtZV9MYWJlbCA9IE5hbWU6Ci1EaWFsb2dBZGRGYXZvcml0ZS5UZXh0X0VtcHR5X0FsZXJ0ID0gVGhlIG5hbWUgY2FuIG5vdCBiZSBlbXB0eS4KLURpYWxvZ0FkZEZhdm9yaXRlLlRleHRfRXhpc3RfQWxlcnQgPSBUaGUgbmFtZSBoYXMgZXhpc3RlZCBpbiB0aGUgZmF2b3JpdGVzLgotRGlhbG9nQ29uc3QuTmFtZV9MYWJlbCA9IE5hbWUKLQotSW1hZ2VDcmVhdG9yLkltYWdlVG9vTGFyZ2UgPSBJbWFnZSBzaXplIGlzIHRvbyBsYXJnZS4gVGhlIHNpbXVsYXRpb24gaW1hZ2UgaXMgc2hvcnRlbmVkLlxuXG4gLVBsZWFzZSBhZGp1c3QgdGhlIGRpc3BsYXkgc2l6ZSBvZiB0YXJnZXQgY29udGVudC5cbiBvclxuIC1QbGVhc2UgdHVybiBvZmYgIndob2xlIHBhZ2UiIGNoZWNrIGJveC4gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9tZXNzYWdlc19qYS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9tZXNzYWdlc19qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjg3YTI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvbWVzc2FnZXNfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU1lbnVDb25zdC4mRm9udF8yID0gXHU2NTg3XHU1YjU3XHUzMDZlXHUzMGI1XHUzMGE0XHUzMGJhXHQoJlgpCi1NZW51Q29uc3QuTGFyZ2VzdF8zID0gXHU2NzAwXHU1OTI3XHQoJkcpCi1NZW51Q29uc3QuTGFyZ2VfNCA9IFx1NTkyN1x0KCZMKQotTWVudUNvbnN0Lk1lZGl1bV81ID0gXHU0ZTJkXHQoJk0pCi1NZW51Q29uc3QuU21hbGxfNiA9IFx1NWMwZlx0KCZTKQotTWVudUNvbnN0LlNtYWxsZXN0XzcgPSBcdTY3MDBcdTVjMGZcdCgmQSkKLU1lbnVDb25zdC5GJmF2b3JpdGVzXzggPSBcdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGEoJkEpCi1NZW51Q29uc3QuQWRkRmF2b3JpdGVzID0gXHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZiXHU4ZmZkXHU1MmEwKCZBKQotTWVudUNvbnN0LkFycmFuZ2VGYXZvcml0ZXMgPSBcdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmVcdTY1NzRcdTc0MDYoJk8pCi0KLVdlYkJyb3dzZXIuQWRkcmVzcyA9IFx1MzBhMlx1MzBjOVx1MzBlY1x1MzBiOSgmRCkKLVdlYkJyb3dzZXIuQmFja3dhcmRfNCA9IFx1NjIzYlx1MzA4Ylx0KCZCKQotV2ViQnJvd3Nlci5Gb3J3YXJkXzUgPSBcdTkwMzJcdTMwODBcdCgmRikKLVdlYkJyb3dzZXIuU3RvcCA9IFx1NTA1Y1x1NmI2Mlx0KCZTKQotV2ViQnJvd3Nlci5SZWZyZXNoID0gXHU2NzAwXHU2NWIwXHUzMDZlXHU2MGM1XHU1ODMxXHUzMDZiXHU2NmY0XHU2NWIwXHQoJlIpCi1XZWJCcm93c2VyLlNjcmlwdCA9XHUzMGI5XHUzMGFmXHUzMGVhXHUzMGQ3XHUzMGM4XHUzMGE4XHUzMGU5XHUzMGZjXHU4ODY4XHU3OTNhXHUzMDkyXHU1MDVjXHU2YjYyXHQoJk8pCi1XZWJCcm93c2VyLkdvID0gXHU3OWZiXHU1MmQ1Ci0KLQotV2ViQnJvd3Nlci5CYWNrd2FyZF80X3RwID0gXHU2MjNiXHUzMDhiCi1XZWJCcm93c2VyLkZvcndhcmRfNV90cCA9IFx1OTAzMlx1MzA4MAotV2ViQnJvd3Nlci5TdG9wX3RwID0gXHU1MDVjXHU2YjYyCi1XZWJCcm93c2VyLlJlZnJlc2hfdHAgPSBcdTY3MDBcdTY1YjBcdTMwNmVcdTYwYzVcdTU4MzFcdTMwNmJcdTY2ZjRcdTY1YjAKLVdlYkJyb3dzZXIuU2NyaXB0X3RwID1cdTMwYjlcdTMwYWZcdTMwZWFcdTMwZDdcdTMwYzhcdTMwYThcdTMwZTlcdTMwZmNcdTg4NjhcdTc5M2FcdTMwOTJcdTUwNWNcdTZiNjIKLVdlYkJyb3dzZXIuR29fdHAgPSBcdTc5ZmJcdTUyZDUKLQotRGlhbG9nQXJyYW5nZUZhdm9yaXRlLlRpdGxlID0gXHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlXHU2NTc0XHU3NDA2Ci1EaWFsb2dBcnJhbmdlRmF2b3JpdGUuTW9kaWZ5X05hbWUgPSBcdTU0MGRcdTUyNGRcdTMwNmVcdTU5MDlcdTY2ZjRcdCgmUikKLURpYWxvZ0FycmFuZ2VGYXZvcml0ZS5EZWxldGUgPSBcdTUyNGFcdTk2NjRcdCgmRCkKLQotRGlhbG9nQWRkRmF2b3JpdGUuVGl0bGUgPSBcdTU0MGRcdTUyNGRcdTMwNmVcdTdkZThcdTk2YzYKLURpYWxvZ0FkZEZhdm9yaXRlLk5hbWVfTGFiZWwgPSBcdTU0MGRcdTUyNGRcdWZmMWEKLURpYWxvZ0FkZEZhdm9yaXRlLlRleHRfRW1wdHlfQWxlcnQgPSBcdTRmNTVcdTMwNGJcdTU0MGRcdTUyNGRcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDQKLURpYWxvZ0FkZEZhdm9yaXRlLlRleHRfRXhpc3RfQWxlcnQgPSBcdTMwNWRcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNmZcdTY1ZTJcdTMwNmJcdTRmN2ZcdTc1MjhcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTkKLURpYWxvZ0NvbnN0Lk5hbWVfTGFiZWwgPSBcdTU0MGRcdTUyNGQKLQotSW1hZ2VDcmVhdG9yLkltYWdlVG9vTGFyZ2UgPSBcdTc1M2JcdTUwY2ZcdTMwYjVcdTMwYTRcdTMwYmFcdTMwNGNcdTU5MjdcdTMwNGRcdTMwNTlcdTMwNGVcdTMwOGJcdTMwNWZcdTMwODFcdWZmMGNcdTc1M2JcdTUwY2ZcdTMwNmVcdTRlMDBcdTkwZThcdTMwNGNcdTMwYjdcdTMwZGZcdTMwZTVcdTMwZWNcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjNcdTViZmVcdThjNjFcdTMwNGJcdTMwODlcdTMwYWJcdTMwYzNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdWZmMGVcblxuIC1cdTViZmVcdThjNjFcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNmVcdTg4NjhcdTc5M2FcdTMwYjVcdTMwYTRcdTMwYmFcdTMwOTJcdThhYmZcdTdiYzBcdTMwNTlcdTMwOGJcdTMwNGJcbiAtXHUzMDBjXHU1MTY4XHU3NTNiXHU5NzYyXHUzMDBkXHUzMGMxXHUzMGE3XHUzMGMzXHUzMGFmXHUzMGRjXHUzMGMzXHUzMGFmXHUzMGI5XHUzMDkyXHUzMGFhXHUzMGQ1XHUzMDZiXHUzMDU3XHUzMDY2XHU0ZTBiXHUzMDU1XHUzMDQ0XHVmZjBlIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL0Jyb3dzZXJGYXZvcml0ZXNFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9Ccm93c2VyRmF2b3JpdGVzRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZDQ2NWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL0Jyb3dzZXJGYXZvcml0ZXNFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmxvZ2dpbmcuRGVidWdQcmludFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBCcm93c2VyRmF2b3JpdGVzRXh0ZW5zaW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX05BTUUgPSAiYnJvd3NlckZhdm9yaXRlcyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFWT1JJVEVTID0gImZhdm9yaXRlcyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUkVGX0ZJTEUgPSAicHJlZkZpbGUiOwotCi0JcHJpdmF0ZSBzdGF0aWMgQnJvd3NlckZhdm9yaXRlc0V4dGVuc2lvbltdIGV4dGVuc2lvbnM7Ci0KLQlwcml2YXRlIHN0YXRpYyBVUkxbXSBwcmVmRmlsZVVSTHMgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgVVJMW10gZ2V0QnJvd3NlckZhdm9yaXRlc1ByZWZGaWxlVVJMcygpIHsKLQkJaWYgKHByZWZGaWxlVVJMcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJlZkZpbGVVUkxzOwotCQl9Ci0KLQkJQnJvd3NlckZhdm9yaXRlc0V4dGVuc2lvbltdIHRtcEV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKCk7Ci0JCUFycmF5TGlzdDxVUkw+IHRtcExpc3QgPSBuZXcgQXJyYXlMaXN0PFVSTD4oKTsKLQkJaWYgKHRtcEV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0bXBFeHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVVJMIHRtcEluZm8gPSB0bXBFeHRlbnNpb25zW2ldCi0JCQkJCQkuZ2V0UHJlZkZpbGVVUkwoKTsKLQkJCQlpZiAodG1wSW5mbyAhPSBudWxsKSB7Ci0JCQkJCXRtcExpc3QuYWRkKHRtcEluZm8pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwcmVmRmlsZVVSTHMgPSBuZXcgVVJMW3RtcExpc3Quc2l6ZSgpXTsKLQkJdG1wTGlzdC50b0FycmF5KHByZWZGaWxlVVJMcyk7Ci0JCXJldHVybiBwcmVmRmlsZVVSTHM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQnJvd3NlckZhdm9yaXRlc0V4dGVuc2lvbltdIGdldEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChleHRlbnNpb25zICE9IG51bGwpCi0JCQlyZXR1cm4gZXh0ZW5zaW9uczsKLQotCQlJRXh0ZW5zaW9uW10gdG1wRXh0ZW5zaW9ucyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkKLQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoTW9kZWxVSVBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9OQU1FKQotCQkJCS5nZXRFeHRlbnNpb25zKCk7Ci0KLQkJRGVidWdQcmludFV0aWwuZGV2T3JEZWJ1Z1ByaW50bG4oQnJvd3NlckZhdm9yaXRlc0V4dGVuc2lvbi5jbGFzcy5nZXROYW1lKCkrIjoiCi0JCQkJKyB0bXBFeHRlbnNpb25zLmxlbmd0aCk7Ci0KLQkJTGlzdDxCcm93c2VyRmF2b3JpdGVzRXh0ZW5zaW9uPiBsID0gbmV3IEFycmF5TGlzdDxCcm93c2VyRmF2b3JpdGVzRXh0ZW5zaW9uPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRtcEV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gdG1wRXh0ZW5zaW9uc1tpXQotCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJQnJvd3NlckZhdm9yaXRlc0V4dGVuc2lvbiBleCA9IHBhcnNlRXh0ZW5zaW9uKGNvbmZpZ0VsZW1lbnRzW2pdKTsKLQkJCQlpZiAoZXggIT0gbnVsbCkgewotCQkJCQlsLmFkZChleCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWV4dGVuc2lvbnMgPSBsLnRvQXJyYXkobmV3IEJyb3dzZXJGYXZvcml0ZXNFeHRlbnNpb25bbC5zaXplKCldKTsKLQkJcmV0dXJuIGV4dGVuc2lvbnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQnJvd3NlckZhdm9yaXRlc0V4dGVuc2lvbiBwYXJzZUV4dGVuc2lvbigKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCWlmICghY29uZmlnRWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEZBVk9SSVRFUykpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IEJyb3dzZXJGYXZvcml0ZXNFeHRlbnNpb24oY29uZmlnRWxlbWVudCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBVUkwgcHJlZkZpbGVVcmwgPSBudWxsOwotCi0JcHJpdmF0ZSBCcm93c2VyRmF2b3JpdGVzRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlJQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSBjb25maWdFbGVtZW50LmdldENvbnRyaWJ1dG9yKCk7Ci0JCQlTdHJpbmcgcHJlZkZpbGUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX1BSRUZfRklMRSk7Ci0JCQlwcmVmRmlsZVVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoUGxhdGZvcm0uZ2V0QnVuZGxlKGNvbnRyaWJ1dG9yLmdldE5hbWUoKSkuZ2V0RW50cnkocHJlZkZpbGUpKTsJCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCURlYnVnUHJpbnRVdGlsLmRldk9yRGVidWdQcmludFN0YWNrVHJhY2UoZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgVVJMIGdldFByZWZGaWxlVVJMKCkgewotCQlyZXR1cm4gcHJlZkZpbGVVcmw7Ci0JfQotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvRmF2b3JpdGVzQ2hhbmdlRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9GYXZvcml0ZXNDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU1NThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9GYXZvcml0ZXNDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzQ2hhbmdlRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3NTU4MDQyMTYzMDM2MTczNzM2TDsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBfZmF2b3JpdGVzTWFwOwotCQotCXB1YmxpYyBGYXZvcml0ZXNDaGFuZ2VFdmVudChPYmplY3Qgb2JqLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGZhdm9yaXRlc01hcCkgewotCQlzdXBlcihvYmopOwotCQlzZXRGYXZvcml0ZXNNYXAoZmF2b3JpdGVzTWFwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGYXZvcml0ZXNNYXAoTWFwPFN0cmluZywgU3RyaW5nPiBmYXZvcml0ZXNNYXApIHsKLQkJdGhpcy5fZmF2b3JpdGVzTWFwID0gZmF2b3JpdGVzTWFwOwotCX0KLQotCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEZhdm9yaXRlc01hcCgpIHsKLQkJcmV0dXJuIHRoaXMuX2Zhdm9yaXRlc01hcDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvRmF2b3JpdGVzQ2hhbmdlTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9GYXZvcml0ZXNDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2QyNTQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9GYXZvcml0ZXNDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmF2b3JpdGVzQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgaW50ZXJuYWxseSBpZiB0aGUgZmF2b3JpdGUgaXRlbXMgYXJlIGNoYW5nZWQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgZmF2b3JpdGUgY2hhbmdlCi0JICovCi0JcHVibGljIHZvaWQgZmF2b3JpdGVzQ2hhbmdlZChGYXZvcml0ZXNDaGFuZ2VFdmVudCBlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9GYXZvcml0ZXNVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvRmF2b3JpdGVzVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDk0ZGJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9GYXZvcml0ZXNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlU3RvcmU7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBGYXZvcml0ZXNVdGlsIElOU1RBTkNFID0gbmV3IEZhdm9yaXRlc1V0aWwoKTsKLQotCVByb3BlcnRpZXMgZmF2b3JpdGVzUHJvcCA9IG51bGw7Ci0KLQlGaWxlIHRhcmdldEZpbGU7Ci0KLQlNb2RlbFVJUGx1Z2luIHBsdWdpbjsKLQotCXByaXZhdGUgRmF2b3JpdGVzVXRpbCgpIHsKLQkJcGx1Z2luID0gTW9kZWxVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCUlQYXRoIGZhdm9yaXRlc1BhdGggPSBwbHVnaW4uZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgKLQkJCQkiZmF2b3JpdGVzLnByb3BlcnRpZXMiKTsKLQkJZmF2b3JpdGVzUHJvcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCVN0cmluZyB0YXJnZXRGaWxlTmFtZSA9IGZhdm9yaXRlc1BhdGgudG9PU1N0cmluZygpOwotCQl0cnkgewotCQkJdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldEZpbGVOYW1lKTsKLQkJCWlmICh0YXJnZXRGaWxlLmNhblJlYWQoKSkgewotCQkJCWZhdm9yaXRlc1Byb3AubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHRhcmdldEZpbGUpKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0KLQkJaWYgKCFwbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5OT1RfRklSU1RfVElNRSkpIHsKLQotCQkJVVJMW10gcHJlZkZpbGVzID0gQnJvd3NlckZhdm9yaXRlc0V4dGVuc2lvbgotCQkJCQkuZ2V0QnJvd3NlckZhdm9yaXRlc1ByZWZGaWxlVVJMcygpOwotCi0JCQlpZiAocHJlZkZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQlmb3IoVVJMIHRhcmdldCA6IHByZWZGaWxlcyl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJbnB1dFN0cmVhbSBwcmVmSVMgPSB0YXJnZXQub3BlblN0cmVhbSgpOwotCQkJCQkJaWYgKHByZWZJUyAhPSBudWxsKSB7Ci0JCQkJCQkJUHJlZmVyZW5jZVN0b3JlIHRtcFN0b3JlID0gbmV3IFByZWZlcmVuY2VTdG9yZSgpOwotCQkJCQkJCXRtcFN0b3JlLmxvYWQocHJlZklTKTsKLQkJCQkJCQlmb3IgKFN0cmluZyBrZXkgOiB0bXBTdG9yZS5wcmVmZXJlbmNlTmFtZXMoKSkgewotCQkJCQkJCQlmYXZvcml0ZXNQcm9wLnB1dChrZXksIHRtcFN0b3JlLmdldFN0cmluZyhrZXkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9CQkJCQkKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfSBlbHNlIHsKLQotCQkJCXRyeSB7Ci0JCQkJCUlucHV0U3RyZWFtIHByZWZJUyA9IEZpbGVMb2NhdG9yLm9wZW5TdHJlYW0oUGxhdGZvcm0KLQkJCQkJCQkuZ2V0QnVuZGxlKE1vZGVsVUlQbHVnaW4uUExVR0lOX0lEKSwgbmV3IFBhdGgoCi0JCQkJCQkJImNvbmZpZy9mYXZvcml0ZXMucHJlZiIpLCBmYWxzZSk7Ci0JCQkJCWlmIChwcmVmSVMgIT0gbnVsbCkgewotCQkJCQkJUHJlZmVyZW5jZVN0b3JlIHRtcFN0b3JlID0gbmV3IFByZWZlcmVuY2VTdG9yZSgpOwotCQkJCQkJdG1wU3RvcmUubG9hZChwcmVmSVMpOwotCQkJCQkJZm9yIChTdHJpbmcga2V5IDogdG1wU3RvcmUucHJlZmVyZW5jZU5hbWVzKCkpIHsKLQkJCQkJCQlmYXZvcml0ZXNQcm9wLnB1dChrZXksIHRtcFN0b3JlLmdldFN0cmluZyhrZXkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQlmYXZvcml0ZXNQcm9wLnN0b3JlKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpLCAiIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0RmF2b3JpdGVzTWFwKCkgewotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZhdm9yaXRlc01hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JCWlmIChJTlNUQU5DRS5mYXZvcml0ZXNQcm9wICE9IG51bGwpIHsKLQkJCVNldDxPYmplY3Q+IGtleVNldCA9IElOU1RBTkNFLmZhdm9yaXRlc1Byb3Aua2V5U2V0KCk7Ci0JCQlmb3IgKE9iamVjdCBrZXkgOiBrZXlTZXQpIHsKLQkJCQlmYXZvcml0ZXNNYXAucHV0KChTdHJpbmcpIGtleSwgSU5TVEFOQ0UuZmF2b3JpdGVzUHJvcAotCQkJCQkJLmdldFByb3BlcnR5KChTdHJpbmcpIGtleSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhdm9yaXRlc01hcDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUZhdm9yaXRlc01hcChNYXA8U3RyaW5nLCBTdHJpbmc+IGZhdm9yaXRlc01hcCkgewotCi0JCWlmIChJTlNUQU5DRS5mYXZvcml0ZXNQcm9wICE9IG51bGwpIHsKLQkJCUlOU1RBTkNFLmZhdm9yaXRlc1Byb3AuY2xlYXIoKTsKLQotCQkJSXRlcmF0b3I8U3RyaW5nPiBmYXZvcml0ZXNJdCA9IGZhdm9yaXRlc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJU3RyaW5nIGtleTsKLQkJCXdoaWxlIChmYXZvcml0ZXNJdC5oYXNOZXh0KCkpIHsKLQkJCQlrZXkgPSAoU3RyaW5nKSBmYXZvcml0ZXNJdC5uZXh0KCk7Ci0JCQkJSU5TVEFOQ0UuZmF2b3JpdGVzUHJvcC5wdXQoa2V5LCAoU3RyaW5nKSBmYXZvcml0ZXNNYXAuZ2V0KGtleSkpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlJTlNUQU5DRS5mYXZvcml0ZXNQcm9wLnN0b3JlKG5ldyBGaWxlT3V0cHV0U3RyZWFtKAotCQkJCQkJSU5TVEFOQ0UudGFyZ2V0RmlsZSksICIiKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9Nb2RlbFVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvTW9kZWxVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjMzNWU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9Nb2RlbFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIE1vZGVsVUlQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBNb2RlbFVJUGx1Z2luKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLk5PVF9GSVJTVF9USU1FLCB0cnVlKTsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kZWxVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbiBwbHVnLWluCi0JICogcmVsYXRpdmUgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCi0JCQkJUExVR0lOX0lELCBwYXRoKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL0FkZEZhdm9yaXRlc0FjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL0FkZEZhdm9yaXRlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjk4ZGE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9BZGRGYXZvcml0ZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLkZhdm9yaXRlc0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuRmF2b3JpdGVzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvci5kaWFsb2dzLkZhdm9yaXRlc0FkZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLklNb2RlbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5JV2ViQnJvd3NlckFDVEY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS51dGlsLk1vZGVsU2VydmljZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkudXRpbC5Nb2RlbFNlcnZpY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotLyoqCi0gKiBBY3Rpb24gdG8gYWRkIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IGFjdGl2ZSB7QGxpbmsgSU1vZGVsU2VydmljZX0gYXMgYQotICogZmF2b3JpdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRGYXZvcml0ZXNBY3Rpb24gZXh0ZW5kcyBGYXZvcml0ZXNBY3Rpb24gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSBBZGRGYXZvcml0ZXNBY3Rpb24uY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IF93aW5kb3c7Ci0KLQlwdWJsaWMgQWRkRmF2b3JpdGVzQWN0aW9uKElXb3JrYmVuY2hXaW5kb3cgd2luZG93LAotCQkJTWFwPFN0cmluZywgU3RyaW5nPiBmYXZvcml0ZXNNYXApIHsKLQkJdGhpcy5fd2luZG93ID0gd2luZG93OwotCi0JCXNldElkKElEKTsKLQkJc2V0VGV4dChNb2RlbFNlcnZpY2VNZXNzYWdlcy5nZXRTdHJpbmcoIk1lbnVDb25zdC5BZGRGYXZvcml0ZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChudWxsICE9IHRoaXMuX3dpbmRvdykgewotCi0JCQlJTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZSA9IE1vZGVsU2VydmljZVV0aWxzCi0JCQkJCS5nZXRBY3RpdmVNb2RlbFNlcnZpY2UoKTsKLQkJCWlmIChtb2RlbFNlcnZpY2UgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIHRpdGxlID0gbW9kZWxTZXJ2aWNlLmdldFVSTCgpOwotCQkJaWYgKG1vZGVsU2VydmljZSBpbnN0YW5jZW9mIElXZWJCcm93c2VyQUNURikgewotCQkJCXRpdGxlID0gKChJV2ViQnJvd3NlckFDVEYpIG1vZGVsU2VydmljZSkuZ2V0TG9jYXRpb25OYW1lKCk7Ci0JCQl9Ci0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHRtcE1hcCA9IEZhdm9yaXRlc1V0aWwuZ2V0RmF2b3JpdGVzTWFwKCk7Ci0JCQlGYXZvcml0ZXNBZGREaWFsb2cgYWRkRGlhbG9nID0gbmV3IEZhdm9yaXRlc0FkZERpYWxvZyh0aGlzLl93aW5kb3cKLQkJCQkJLmdldFNoZWxsKCksIHRtcE1hcCwgdGl0bGUpOwotCi0JCQlpbnQgcmV0ID0gYWRkRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJCVN0cmluZyB1cmwgPSBtb2RlbFNlcnZpY2UuZ2V0VVJMKCk7Ci0JCQkJdG1wTWFwLnB1dChhZGREaWFsb2cuZ2V0TmFtZSgpLCB1cmwpOwotCQkJCUZhdm9yaXRlc1V0aWwuc2F2ZUZhdm9yaXRlc01hcCh0bXBNYXApOwotCQkJCUZhdm9yaXRlc0NoYW5nZUV2ZW50IGZjZSA9IG5ldyBGYXZvcml0ZXNDaGFuZ2VFdmVudCh0aGlzLAotCQkJCQkJdG1wTWFwKTsKLQkJCQlmaXJlRmF2b3JpdGVzQ2hhbmdlZChmY2UpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL0FycmFuZ2VGYXZvcml0ZXNBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9BcnJhbmdlRmF2b3JpdGVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OTU0NjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL0FycmFuZ2VGYXZvcml0ZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLkZhdm9yaXRlc0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuRmF2b3JpdGVzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvci5kaWFsb2dzLkZhdm9yaXRlc0FycmFuZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS51dGlsLk1vZGVsU2VydmljZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi0KLXB1YmxpYyBjbGFzcyBBcnJhbmdlRmF2b3JpdGVzQWN0aW9uIGV4dGVuZHMgRmF2b3JpdGVzQWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gQXJyYW5nZUZhdm9yaXRlc0FjdGlvbi5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgX3dpbmRvdzsKLQotCXB1YmxpYyBBcnJhbmdlRmF2b3JpdGVzQWN0aW9uKElXb3JrYmVuY2hXaW5kb3cgd2luZG93LCBNYXA8U3RyaW5nLCBTdHJpbmc+IGZhdm9yaXRlc01hcCkgewotCQl0aGlzLl93aW5kb3cgPSB3aW5kb3c7Ci0KLQkJc2V0SWQoSUQpOwotCQlzZXRUZXh0KE1vZGVsU2VydmljZU1lc3NhZ2VzLmdldFN0cmluZygiTWVudUNvbnN0LkFycmFuZ2VGYXZvcml0ZXMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHRtcE1hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQl0bXBNYXAucHV0QWxsKEZhdm9yaXRlc1V0aWwuZ2V0RmF2b3JpdGVzTWFwKCkpOwotCQlGYXZvcml0ZXNBcnJhbmdlRGlhbG9nIGFycmFuZ2VEaWFsb2cgPSBuZXcgRmF2b3JpdGVzQXJyYW5nZURpYWxvZygKLQkJCQl0aGlzLl93aW5kb3cuZ2V0U2hlbGwoKSwgdG1wTWFwKTsKLQotCQlpbnQgcmV0dXJuQ29kZSA9IGFycmFuZ2VEaWFsb2cub3BlbigpOwotCQlpZiAocmV0dXJuQ29kZSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEICYmIGFycmFuZ2VEaWFsb2cuaXNNb2RpZmllZCgpKSB7Ci0JCQl0bXBNYXAgPSBhcnJhbmdlRGlhbG9nLmdldEZhdm9yaXRlc01hcCgpOwotCQkJRmF2b3JpdGVzVXRpbC5zYXZlRmF2b3JpdGVzTWFwKHRtcE1hcCk7Ci0JCQlGYXZvcml0ZXNDaGFuZ2VFdmVudCBmY2UgPSBuZXcgRmF2b3JpdGVzQ2hhbmdlRXZlbnQodGhpcywgdG1wTWFwKTsKLQkJCWZpcmVGYXZvcml0ZXNDaGFuZ2VkKGZjZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvRmF2b3JpdGVzQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvRmF2b3JpdGVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ODEwZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL0Zhdm9yaXRlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLmVkaXRvci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuRmF2b3JpdGVzQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5GYXZvcml0ZXNDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotCi0KLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZhdm9yaXRlc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcml2YXRlIFZlY3RvcjxGYXZvcml0ZXNDaGFuZ2VMaXN0ZW5lcj4gX2Zhdm9yaXRlc0NoYW5nZUxpc3RlbmVycyA9IG5ldyBWZWN0b3I8RmF2b3JpdGVzQ2hhbmdlTGlzdGVuZXI+KCk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRGYXZvcml0ZXNDaGFuZ2VMaXN0ZW5lcihGYXZvcml0ZXNDaGFuZ2VMaXN0ZW5lciBmY2wpIHsKLQkJdGhpcy5fZmF2b3JpdGVzQ2hhbmdlTGlzdGVuZXJzLmFkZEVsZW1lbnQoZmNsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVGYXZvcml0ZXNDaGFuZ2VMaXN0ZW5lcihGYXZvcml0ZXNDaGFuZ2VMaXN0ZW5lciBmY2wpIHsKLQkJdGhpcy5fZmF2b3JpdGVzQ2hhbmdlTGlzdGVuZXJzLnJlbW92ZUVsZW1lbnQoZmNsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlRmF2b3JpdGVzQ2hhbmdlZChGYXZvcml0ZXNDaGFuZ2VFdmVudCBmY2UpIHsKLQkJaWYgKHRoaXMuX2Zhdm9yaXRlc0NoYW5nZUxpc3RlbmVycy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuX2Zhdm9yaXRlc0NoYW5nZUxpc3RlbmVycy5zaXplKCk7IGkrKykgewotCQkJCSgoRmF2b3JpdGVzQ2hhbmdlTGlzdGVuZXIpIHRoaXMuX2Zhdm9yaXRlc0NoYW5nZUxpc3RlbmVycy5lbGVtZW50QXQoaSkpLmZhdm9yaXRlc0NoYW5nZWQoZmNlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9GYXZvcml0ZXNJdGVtQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvRmF2b3JpdGVzSXRlbUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2M2NDY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9GYXZvcml0ZXNJdGVtQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLnV0aWwuTW9kZWxTZXJ2aWNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzSXRlbUFjdGlvbiBleHRlbmRzIEZhdm9yaXRlc0FjdGlvbiB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IEZhdm9yaXRlc0l0ZW1BY3Rpb24uY2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IF93aW5kb3c7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBfdXJsOwotICAgIAotICAgIGJvb2xlYW4gdXNlRXhpc3RpbmdFZGl0b3I7Ci0KLSAgICBwdWJsaWMgRmF2b3JpdGVzSXRlbUFjdGlvbihJV29ya2JlbmNoV2luZG93IHdpbmRvdywgU3RyaW5nIG5hbWUsIFN0cmluZyB1cmwsIGJvb2xlYW4gdXNlRXhpc3RpbmdFZGl0b3IpIHsKLSAgICAgICAgdGhpcy5fd2luZG93ID0gd2luZG93OwotICAgICAgICB0aGlzLl91cmwgPSB1cmw7Ci0gICAgICAgIHRoaXMudXNlRXhpc3RpbmdFZGl0b3IgPSB1c2VFeGlzdGluZ0VkaXRvcjsKLSAgICAgICAgCi0gICAgICAgIHNldFRleHQobmFtZSk7Ci0gICAgICAgIHNldElkKElEICsgIl8iICsgbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBpZiAobnVsbCAhPSB0aGlzLl93aW5kb3cpIHsKLSAgICAgICAgICAgIGlmKHVzZUV4aXN0aW5nRWRpdG9yKXsKLSAgICAgICAgICAgICAgICBNb2RlbFNlcnZpY2VVdGlscy5vcGVuSW5FeGlzdGluZ0VkaXRvcihfdXJsKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIE1vZGVsU2VydmljZVV0aWxzLmxhdW5jaChfdXJsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3IvZGlhbG9ncy9GYXZvcml0ZXNBZGREaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3IvZGlhbG9ncy9GYXZvcml0ZXNBZGREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlOWM0My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9yL2RpYWxvZ3MvRmF2b3JpdGVzQWRkRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3IuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLnV0aWwuTW9kZWxTZXJ2aWNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc0FkZERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gX21hcDsKLQotCXByaXZhdGUgU3RyaW5nIF9uYW1lOwotCi0JcHJpdmF0ZSBUZXh0IF9uYW1lVGV4dDsKLQotCXB1YmxpYyBGYXZvcml0ZXNBZGREaWFsb2coU2hlbGwgc2hlbGwsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihzaGVsbCk7Ci0JCXRoaXMuX21hcCA9IG1hcDsKLQkJdGhpcy5fbmFtZSA9IG5hbWU7Ci0JfTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIF9uYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJX25hbWUgPSBfbmFtZVRleHQuZ2V0VGV4dCgpOwotCQlpZiAoX25hbWUuZXF1YWxzKCIiKSkgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIkVycm9yIiwgTW9kZWxTZXJ2aWNlTWVzc2FnZXMKLQkJCQkJLmdldFN0cmluZygiRGlhbG9nQWRkRmF2b3JpdGUuVGV4dF9FbXB0eV9BbGVydCIpKTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIGlmIChfbWFwLmNvbnRhaW5zS2V5KF9uYW1lKSkgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIkVycm9yIiwgTW9kZWxTZXJ2aWNlTWVzc2FnZXMKLQkJCQkJLmdldFN0cmluZygiRGlhbG9nQWRkRmF2b3JpdGUuVGV4dF9FeGlzdF9BbGVydCIpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dDEgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0MS5udW1Db2x1bW5zID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0MSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTW9kZWxTZXJ2aWNlTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJEaWFsb2dBZGRGYXZvcml0ZS5OYW1lX0xhYmVsIikpOwotCi0JCXRoaXMuX25hbWVUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdGhpcy5fbmFtZVRleHQuc2V0VGV4dChfbmFtZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDI1MDsKLQkJdGhpcy5fbmFtZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcmV0dXJuIChjb21wb3NpdGUpOwotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoTW9kZWxTZXJ2aWNlTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJEaWFsb2dBZGRGYXZvcml0ZS5UaXRsZSIpKTsKLQkJbmV3U2hlbGwuc2V0TG9jYXRpb24oMjAwLCAyMDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3IvZGlhbG9ncy9GYXZvcml0ZXNBcnJhbmdlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvZWRpdG9yL2RpYWxvZ3MvRmF2b3JpdGVzQXJyYW5nZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzQ3M2YyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9lZGl0b3IvZGlhbG9ncy9GYXZvcml0ZXNBcnJhbmdlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9yLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkudXRpbC5Nb2RlbFNlcnZpY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzQXJyYW5nZURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gX2Zhdm9yaXRlc01hcDsKLQlwcml2YXRlIGJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBGYXZvcml0ZXNBcnJhbmdlRGlhbG9nKFNoZWxsIHNoZWxsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGZhdm9yaXRlc01hcCkgewotCQlzdXBlcihzaGVsbCk7Ci0JCXRoaXMuX2Zhdm9yaXRlc01hcCA9IGZhdm9yaXRlc01hcDsKLQl9OwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0MSA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQxLm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQxKTsKLQotCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTgotCQkJCXwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDEwMDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCVN0cmluZ1tdIGNvbHMgPSB7Ci0JCQkJTW9kZWxTZXJ2aWNlTWVzc2FnZXMuZ2V0U3RyaW5nKCJEaWFsb2dDb25zdC5OYW1lX0xhYmVsIiksCi0JCQkJIlVSTDogIiB9OwotCQlUYWJsZUNvbHVtbiBjb2wgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5CRUdJTk5JTkcpOwotCQljb2wuc2V0VGV4dChjb2xzWzBdKTsKLQkJY29sLnNldFdpZHRoKDIwMCk7Ci0JCWNvbCA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkJFR0lOTklORyk7Ci0JCWNvbC5zZXRUZXh0KGNvbHNbMV0pOwotCQljb2wuc2V0V2lkdGgoMzAwKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGtleUl0ID0gX2Zhdm9yaXRlc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoa2V5SXQuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGtleUl0Lm5leHQoKTsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJaXRlbS5zZXRUZXh0KDAsIG5hbWUpOwotCQkJaXRlbS5zZXRUZXh0KDEsIF9mYXZvcml0ZXNNYXAuZ2V0KG5hbWUpKTsKLQkJfQotCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dChNb2RlbFNlcnZpY2VNZXNzYWdlcwotCQkJCS5nZXRTdHJpbmcoIkRpYWxvZ0FycmFuZ2VGYXZvcml0ZS5Nb2RpZnlfTmFtZSIpKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgYXJnMCkgewotCQkJCWlmICh0YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCkgewotCQkJCQlTdHJpbmcgbmFtZSA9IHRhYmxlLmdldFNlbGVjdGlvbigpWzBdLmdldFRleHQoMCk7Ci0JCQkJCUZhdm9yaXRlc0FkZERpYWxvZyBkbGcgPSBuZXcgRmF2b3JpdGVzQWRkRGlhbG9nKGdldFNoZWxsKCksCi0JCQkJCQkJX2Zhdm9yaXRlc01hcCwgbmFtZSk7Ci0JCQkJCWludCByZXQgPSBkbGcub3BlbigpOwotCQkJCQlTdHJpbmcgbmV3TmFtZSA9IGRsZy5nZXROYW1lKCk7Ci0JCQkJCWlmIChyZXQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCAmJiAhbmV3TmFtZS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCXRhYmxlLmdldFNlbGVjdGlvbigpWzBdLnNldFRleHQoMCwgbmV3TmFtZSk7Ci0JCQkJCQlfZmF2b3JpdGVzTWFwLnB1dChuZXdOYW1lLCBfZmF2b3JpdGVzTWFwLmdldChuYW1lKSk7Ci0JCQkJCQlfZmF2b3JpdGVzTWFwLnJlbW92ZShuYW1lKTsKLQkJCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoTW9kZWxTZXJ2aWNlTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJEaWFsb2dBcnJhbmdlRmF2b3JpdGUuRGVsZXRlIikpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGFyZzApIHsKLQkJCQlpZiAodGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDApIHsKLQkJCQkJVGFibGVJdGVtW10gaXRlbXMgPSB0YWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJX2Zhdm9yaXRlc01hcC5yZW1vdmUoaXRlbXNbaV0uZ2V0VGV4dCgwKSk7Ci0JCQkJCX0KLQkJCQkJdGFibGUucmVtb3ZlKHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoTW9kZWxTZXJ2aWNlTWVzc2FnZXMKLQkJCQkuZ2V0U3RyaW5nKCJEaWFsb2dBcnJhbmdlRmF2b3JpdGUuVGl0bGUiKSk7Ci0JfQotCi0JcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0RmF2b3JpdGVzTWFwKCkgewotCQlyZXR1cm4gdGhpcy5fZmF2b3JpdGVzTWFwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvSVByZWZlcmVuY2VDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9JUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWI4ZjFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9JUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLQotcHVibGljIGludGVyZmFjZSBJUHJlZmVyZW5jZUNvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0ZJUlNUX1RJTUUgPSAiYnJ3b3Nlci5wcmVmZXJlbmNlcy5ub3RGaXJzdFRpbWUiOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL0lNb2RlbFNlcnZpY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9JTW9kZWxTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2N2Q1NmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL0lNb2RlbFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBwcm92aWRlIGFjY2VzcyB0byB0aGUgbW9kZWwgb2YgdGhlIGNvbnRlbnQuIFVzZXJzIGNhbiBnZXQgdGhpcwotICoge0BsaW5rIElNb2RlbFNlcnZpY2V9IHRocm91Z2gge0BsaW5rIElNb2RlbFNlcnZpY2VIb2xkZXJ9IHRoYXQgaXMgaW1wbGVtZW50ZWQKLSAqIHdpdGgge0BsaW5rIElFZGl0b3JQYXJ0fS4KLSAqIAotICogQHNlZSBJTW9kZWxTZXJ2aWNlSG9sZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsU2VydmljZSB7Ci0KLQkvKioKLQkgKiBIVE1MIE1JTUUgdHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gTUlNRVRZUEVTX0hUTUwgPSB7ICJ0ZXh0L2h0bWwiLAotCQkJImFwcGxpY2F0aW9uL3hodG1sK3htbCIgfTsKLQotCS8qKgotCSAqIE9ERiBNSU1FIHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1JTUVUWVBFU19PREYgPSB7Ci0JCQkiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24iLAotCQkJImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dCIsCi0JCQkiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldCIgfTsKLQotCS8qKgotCSAqIEhUTUwgZXh0ZW5zaW9ucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRVhUU19IVE1MID0geyAiaHRtbCIsICJodG0iLCAieGh0bWwiLCAibWh0IiB9OwotCi0JLyoqCi0JICogT0RGIGV4dGVuc2lvbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVYVFNfT0RGID0geyAib2R0IiwgIm9kcyIsICJvZHAiIH07Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1dJTkRPV0hBTkRMRSA9ICJXaW5kb3dIYW5kbGUiOwotCi0JLyoqCi0JICogR2V0IE1JTUUgdHlwZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMge0BsaW5rIElNb2RlbFNlcnZpY2V9Ci0JICogCi0JICogQHJldHVybiBhcnJheSBvZiBNSU1FIHR5cGUKLQkgKi8KLQlTdHJpbmdbXSBnZXRTdXBwb3J0TUlNRVR5cGVzKCk7Ci0KLQkvLyBUT0RPIHVzZSBlZGl0b3IgZXh0ZW5zaW9uIGluZm8KLQkvKioKLQkgKiBHZXQgZmlsZSBleHRlbnNpb25zIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGlzIHtAbGluayBJTW9kZWxTZXJ2aWNlfQotCSAqIAotCSAqIEByZXR1cm4gYXJyYXkgb2YgZmlsZSBleHRlbnNpb25zCi0JICovCi0JU3RyaW5nW10gZ2V0U3VwcG9ydEV4dGVuc2lvbnMoKTsKLQotCS8qKgotCSAqIEdldCBNSU1FIHR5cGUgb2YgdGhlIGNvbnRlbnQKLQkgKiAKLQkgKiBAcmV0dXJuIE1JTUUgdHlwZSBvZiB0aGUgY29udGVudAotCSAqLwotCVN0cmluZyBnZXRDdXJyZW50TUlNRVR5cGUoKTsKLQotCS8qKgotCSAqIE9wZW4gc3BlY2lmaWVkIFVSTAotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIHRhcmdldCBVUkwKLQkgKi8KLQl2b2lkIG9wZW4oU3RyaW5nIHVybCk7Ci0KLQkvKioKLQkgKiBPcGVuIHNwZWNpZmllZCB7QGxpbmsgRmlsZX0KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICB0YXJnZXQge0BsaW5rIEZpbGV9Ci0JICovCi0Jdm9pZCBvcGVuKEZpbGUgdGFyZ2V0KTsKLQotCS8qKgotCSAqIEdldCBjb250ZW50IFVSTCBhcyBTdHJpbmcKLQkgKiAKLQkgKiBAcmV0dXJuIGNvbnRlbnQgVVJMIGFzIFN0cmluZwotCSAqLwotCVN0cmluZyBnZXRVUkwoKTsKLQotCS8qKgotCSAqIEdldCB0aXRsZQotCSAqIAotCSAqIEByZXR1cm4gdGl0bGUKLQkgKi8KLQlTdHJpbmcgZ2V0VGl0bGUoKTsKLQotCS8qKgotCSAqIEdldCBJRAotCSAqIAotCSAqIEByZXR1cm4gSUQKLQkgKi8KLQlTdHJpbmcgZ2V0SUQoKTsKLQotCS8vIFRPRE8gc3VwcG9ydCBvdGhlciBtb2RlbAotCS8qKgotCSAqIEdldCBtb2RlbCBvZiB0aGUgY29udGVudCBhcyB7QGxpbmsgRG9jdW1lbnR9LiBUaGlzIG1ldGhvZCByZXR1cm5zCi0JICoge0BsaW5rIERvY3VtZW50fSBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgc291cmNlIG9mIHRoZSBjb250ZW50LgotCSAqIAotCSAqIEByZXR1cm4ge0BsaW5rIERvY3VtZW50fQotCSAqLwotCURvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBHZXQgbW9kZWwgb2YgdGhlIGNvbnRlbnQgYXMge0BsaW5rIERvY3VtZW50fS4gVGhpcyBtZXRob2QgcmV0dXJucwotCSAqIHJ1bnRpbWUge0BsaW5rIERvY3VtZW50fSBpbnNpZGUgdGhlIEVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGN1cnJlbnQge0BsaW5rIERvY3VtZW50fQotCSAqLwotCURvY3VtZW50IGdldExpdmVEb2N1bWVudCgpOwotCi0JLyoqCi0JICogR2V0IHRoZSB7QGxpbmsgQ29tcG9zaXRlfSB0aGF0IGhvbGQgdGhlIGNvbnRlbnQKLQkgKiAKLQkgKiBAcmV0dXJuIHRhcmdldCB7QGxpbmsgQ29tcG9zaXRlfQotCSAqLwotCUNvbXBvc2l0ZSBnZXRUYXJnZXRDb21wb3NpdGUoKTsKLQotCS8qKgotCSAqIFNhdmUgdGhlIG9yaWdpbmFsIHtAbGluayBEb2N1bWVudH0gaW50byB0YXJnZXQgZmlsZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICB0YXJnZXQgZmlsZSBwYXRoCi0JICogQHJldHVybiByZXN1bHRpbmcge0BsaW5rIEZpbGV9Ci0JICovCi0JRmlsZSBzYXZlT3JpZ2luYWxEb2N1bWVudChTdHJpbmcgZmlsZSk7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSB7QGxpbmsgRG9jdW1lbnR9IGludG8gSFRNTCBhbmQgc2F2ZSBpbnRvIHRhcmdldCBmaWxlLiBFbXB0eQotCSAqIGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQgaWYgdGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGFyZ2V0IGZpbGUgcGF0aAotCSAqIEByZXR1cm4gcmVzdWx0aW5nIHtAbGluayBGaWxlfS4KLQkgKi8KLQlGaWxlIHNhdmVEb2N1bWVudEFzSFRNTEZpbGUoU3RyaW5nIGZpbGUpOwotCi0JLyoqCi0JICogTW92ZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBzcGVjaWZpZWQge0BsaW5rIE5vZGV9Ci0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgdGFyZ2V0IHtAbGluayBOb2RlfQotCSAqLwotCXZvaWQganVtcFRvTm9kZShOb2RlIHRhcmdldCk7Ci0KLQkvKioKLQkgKiBHZXQge0BsaW5rIElNb2RlbFNlcnZpY2VTY3JvbGxNYW5hZ2VyfSB0byBzY3JvbGwgdGhlIGNvbnRlbnQKLQkgKiAKLQkgKiBAcmV0dXJuIHNjcm9sbCBtYW5hZ2VyIHtAbGluayBJTW9kZWxTZXJ2aWNlU2Nyb2xsTWFuYWdlcn0KLQkgKi8KLQlJTW9kZWxTZXJ2aWNlU2Nyb2xsTWFuYWdlciBnZXRTY3JvbGxNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBHZXQgYWxsIGltYWdlIHBvc2l0aW9uIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgY29udGVudAotCSAqIAotCSAqIEByZXR1cm4gYXJyYXkgb2Yge0BsaW5rIEltYWdlUG9zaXRpb25JbmZvfQotCSAqLwotCUltYWdlUG9zaXRpb25JbmZvW10gZ2V0QWxsSW1hZ2VQb3NpdGlvbigpOwotCi0JLyoqCi0JICogR2V0IHtAbGluayBJTW9kZWxTZXJ2aWNlSG9sZGVyfSB3aG8gb3ducyB0aGlzIGltcGxlbWVudGF0aW9uCi0JICogCi0JICogQHJldHVybiB7QGxpbmsgSU1vZGVsU2VydmljZUhvbGRlcn0KLQkgKi8KLQlJTW9kZWxTZXJ2aWNlSG9sZGVyIGdldE1vZGVsU2VydmljZUhvbGRlcigpOwotCi0JLyoqCi0JICogR2V0IGNvcnJlc3BvbmRpbmcge0BsaW5rIE9iamVjdH0gd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4gVGhpcyBtZXRob2QgaXMKLQkgKiB1c2VkIGZvciBpbXBsZW1lbnRhdGlvbiB1bmlxdWUgY3VzdG9taXphdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0YXJnZXQga2V5Ci0JICogQHJldHVybiBjb3JyZXNwb25kaW5nIHtAbGluayBPYmplY3R9IHdpdGggdGhlIHNwZWNpZmllZCBrZXkKLQkgKi8KLQlPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBrZXkpOwotCS8vIGNsZWFyaGlnaGxpZ2h0Ci0JLy8gc2l6ZQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvSU1vZGVsU2VydmljZUhvbGRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL0lNb2RlbFNlcnZpY2VIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiYmRlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvSU1vZGVsU2VydmljZUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBkZXNpZ25lZCB0byBpbXBsZW1lbnQgdG9nZXRoZXIgd2l0aCB7QGxpbmsgSUVkaXRvclBhcnR9LgotICogSW1wbGVtZW50YXRpb25zIGFyZSBhbHNvIG5lZWQgdG8gaW1wbGVtZW50IHtAbGluayBJTW9kZWxTZXJ2aWNlfSB0byBhY2Nlc3MgdG8KLSAqIG1vZGVsIG9mIHRoZSBjb250ZW50IHdpdGhpbiBFZGl0b3IuCi0gKiAKLSAqIEBzZWUgSUVkaXRvclBhcnQKLSAqIEBzZWUgSU1vZGVsU2VydmljZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbFNlcnZpY2VIb2xkZXIgewotCS8qKgotCSAqIEdldCB7QGxpbmsgSU1vZGVsU2VydmljZX0gdG8gYWNjZXNzIHRvIG1vZGVsIG9mIHRoZSBjb250ZW50Ci0JICogCi0JICogQHJldHVybiB7QGxpbmsgSU1vZGVsU2VydmljZX0KLQkgKi8KLQlJTW9kZWxTZXJ2aWNlIGdldE1vZGVsU2VydmljZSgpOwotCi0JLyoqCi0JICogR2V0IHtAbGluayBJRWRpdG9yUGFydH0gaW1wbGVtZW50ZWQgdG9nZXRoZXIgd2l0aCB0aGlzIGludGVyZmFjZQotCSAqIAotCSAqIEByZXR1cm4ge0BsaW5rIElFZGl0b3JQYXJ0fQotCSAqLwotCUlFZGl0b3JQYXJ0IGdldEVkaXRvclBhcnQoKTsKLQotCS8qKgotCSAqIFNldCB0aXRsZSB0byB7QGxpbmsgSUVkaXRvclBhcnR9IGltcGxlbWVudGVkIHRvZ2V0aGVyIHdpdGggdGhpcyBpbnRlcmZhY2UKLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRhcmdldCB0aXRsZQotCSAqLwotCXZvaWQgc2V0RWRpdG9yVGl0bGUoU3RyaW5nIHRpdGxlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9JTW9kZWxTZXJ2aWNlU2Nyb2xsTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL0lNb2RlbFNlcnZpY2VTY3JvbGxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MmY2ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL0lNb2RlbFNlcnZpY2VTY3JvbGxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWk7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHNjcm9sbCB7QGxpbmsgSU1vZGVsU2VydmljZX0KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxTZXJ2aWNlU2Nyb2xsTWFuYWdlciB7Ci0JLyoqCi0JICogU2Nyb2xsIHR5cGU6IG5vdCBzdXBwb3J0ZWQKLQkgKi8KLQlzdGF0aWMgaW50IE5PTkUgPSAtMTsKLQkvKioKLQkgKiBTY3JvbGwgdHlwZTogYWJzb2x1dGUgY29vcmRpbmF0ZQotCSAqLwotCXN0YXRpYyBpbnQgQUJTT0xVVEVfQ09PUkRJTkFURSA9IDA7Ci0JLyoqCi0JICogU2Nyb2xsIHR5cGU6IGluY3JlbWVudGFsCi0JICovCi0Jc3RhdGljIGludCBJTkNSRU1FTlRBTCA9IDE7Ci0JLyoqCi0JICogU2Nyb2xsIHR5cGU6IHBhZ2UgYnkgcGFnZQotCSAqLwotCXN0YXRpYyBpbnQgUEFHRSA9IDI7Ci0KLQkvKioKLQkgKiBHZXQgc2Nyb2xsIHR5cGUgb2YgdGhlIHtAbGluayBJTW9kZWxTZXJ2aWNlfQotCSAqIAotCSAqIEByZXR1cm4gc2Nyb2xsIHR5cGUKLQkgKi8KLQlpbnQgZ2V0U2Nyb2xsVHlwZSgpOwotCi0JLyoqCi0JICogU2Nyb2xsIHRvIHkKLQkgKiAKLQkgKiBAcGFyYW0geQotCSAqICAgICAgICAgICAgdGFyZ2V0IFkgY29vcmRpbmF0ZQotCSAqIEBwYXJhbSB3YWl0UmVuZGVyaW5nCi0JICogICAgICAgICAgICBpZiB0cnVlLCB3YWl0IGEgZmluaXNoIG9mIHJlbmRlcmluZwotCSAqLwotCXZvaWQgYWJzb2x1dGVDb29yZGluYXRlU2Nyb2xsKGludCB5LCBib29sZWFuIHdhaXRSZW5kZXJpbmcpOwotCi0JLyoqCi0JICogU2Nyb2xsIHRvICh4LHkpCi0JICogCi0JICogQHBhcmFtIHgKLQkgKiAgICAgICAgICAgIHRhcmdldCBYIGNvb3JkaW5hdGUKLQkgKiBAcGFyYW0geQotCSAqICAgICAgICAgICAgdGFyZ2V0IFkgY29vcmRpbmF0ZQotCSAqIEBwYXJhbSB3YWl0UmVuZGVyaW5nCi0JICogICAgICAgICAgICBpZiB0cnVlLCB3YWl0IGEgZmluaXNoIG9mIHJlbmRlcmluZwotCSAqLwotCXZvaWQgYWJzb2x1dGVDb29yZGluYXRlU2Nyb2xsKGludCB4LCBpbnQgeSwgYm9vbGVhbiB3YWl0UmVuZGVyaW5nKTsKLQotCS8qKgotCSAqIEluY3JlbWVudGFsIHNjcm9sbCAoaG9yaXpvbnRhbCkKLQkgKiAKLQkgKiBAcGFyYW0gd2FpdFJlbmRlcmluZwotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgd2FpdCBhIGZpbmlzaCBvZiByZW5kZXJpbmcKLQkgKiBAcmV0dXJuIHNjcm9sbCBzaXplLCBvciAtMSBpZiBub3Qgc3VwcG9ydGVkCi0JICovCi0JaW50IGluY3JlbWVudFNjcm9sbFgoYm9vbGVhbiB3YWl0UmVuZGVyaW5nKTsKLQotCS8qKgotCSAqIERlY3JlbWVudGFsIHNjcm9sbCAoaG9yaXpvbnRhbCkKLQkgKiAKLQkgKiBAcGFyYW0gd2FpdFJlbmRlcmluZwotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgd2FpdCBhIGZpbmlzaCBvZiByZW5kZXJpbmcKLQkgKiBAcmV0dXJuIHNjcm9sbCBzaXplLCBvciAtMSBpZiBub3Qgc3VwcG9ydGVkCi0JICovCi0JaW50IGRlY3JlbWVudFNjcm9sbFgoYm9vbGVhbiB3YWl0UmVuZGVyaW5nKTsKLQotCS8qKgotCSAqIEluY3JlbWVudGFsIHNjcm9sbCAodmVydGljYWwpCi0JICogCi0JICogQHBhcmFtIHdhaXRSZW5kZXJpbmcKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHdhaXQgYSBmaW5pc2ggb2YgcmVuZGVyaW5nCi0JICogQHJldHVybiBzY3JvbGwgc2l6ZSwgb3IgLTEgaWYgbm90IHN1cHBvcnRlZAotCSAqLwotCWludCBpbmNyZW1lbnRTY3JvbGxZKGJvb2xlYW4gd2FpdFJlbmRlcmluZyk7Ci0KLQkvKioKLQkgKiBEZWNyZW1lbnRhbCBzY3JvbGwgKHZlcnRpY2FsKQotCSAqIAotCSAqIEBwYXJhbSB3YWl0UmVuZGVyaW5nCi0JICogICAgICAgICAgICBpZiB0cnVlLCB3YWl0IGEgZmluaXNoIG9mIHJlbmRlcmluZwotCSAqIEByZXR1cm4gc2Nyb2xsIHNpemUsIG9yIC0xIGlmIG5vdCBzdXBwb3J0ZWQKLQkgKi8KLQlpbnQgZGVjcmVtZW50U2Nyb2xsWShib29sZWFuIHdhaXRSZW5kZXJpbmcpOwotCi0JLyoqCi0JICogSW5jcmVtZW50YWwgbGFyZ2Ugc2Nyb2xsIChob3Jpem9udGFsKQotCSAqIAotCSAqIEBwYXJhbSB3YWl0UmVuZGVyaW5nCi0JICogICAgICAgICAgICBpZiB0cnVlLCB3YWl0IGEgZmluaXNoIG9mIHJlbmRlcmluZwotCSAqIEByZXR1cm4gc2Nyb2xsIHNpemUsIG9yIC0xIGlmIG5vdCBzdXBwb3J0ZWQKLQkgKi8KLQlpbnQgaW5jcmVtZW50TGFyZ2VTY3JvbGxYKGJvb2xlYW4gd2FpdFJlbmRlcmluZyk7Ci0KLQkvKioKLQkgKiBEZWNyZW1lbnRhbCBsYXJnZSBzY3JvbGwgKGhvcml6b250YWwpCi0JICogCi0JICogQHBhcmFtIHdhaXRSZW5kZXJpbmcKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHdhaXQgYSBmaW5pc2ggb2YgcmVuZGVyaW5nCi0JICogQHJldHVybiBzY3JvbGwgc2l6ZSwgb3IgLTEgaWYgbm90IHN1cHBvcnRlZAotCSAqLwotCWludCBkZWNyZW1lbnRMYXJnZVNjcm9sbFgoYm9vbGVhbiB3YWl0UmVuZGVyaW5nKTsKLQotCS8qKgotCSAqIEluY3JlbWVudGFsIGxhcmdlIHNjcm9sbCAodmVydGljYWwpCi0JICogCi0JICogQHBhcmFtIHdhaXRSZW5kZXJpbmcKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHdhaXQgYSBmaW5pc2ggb2YgcmVuZGVyaW5nCi0JICogQHJldHVybiBzY3JvbGwgc2l6ZSwgb3IgLTEgaWYgbm90IHN1cHBvcnRlZAotCSAqLwotCWludCBpbmNyZW1lbnRMYXJnZVNjcm9sbFkoYm9vbGVhbiB3YWl0UmVuZGVyaW5nKTsKLQotCS8qKgotCSAqIERlY3JlbWVudGFsIGxhcmdlIHNjcm9sbCAodmVydGljYWwpCi0JICogCi0JICogQHBhcmFtIHdhaXRSZW5kZXJpbmcKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHdhaXQgYSBmaW5pc2ggb2YgcmVuZGVyaW5nCi0JICogQHJldHVybiBzY3JvbGwgc2l6ZSwgb3IgLTEgaWYgbm90IHN1cHBvcnRlZAotCSAqLwotCWludCBkZWNyZW1lbnRMYXJnZVNjcm9sbFkoYm9vbGVhbiB3YWl0UmVuZGVyaW5nKTsKLQotCS8qKgotCSAqIEluY3JlbWVudGFsIHBhZ2Ugc2Nyb2xsIChQYWdlIHVwKQotCSAqIAotCSAqIEBwYXJhbSB3YWl0UmVuZGVyaW5nCi0JICogICAgICAgICAgICBpZiB0cnVlLCB3YWl0IGEgZmluaXNoIG9mIHJlbmRlcmluZwotCSAqIEByZXR1cm4gc2Nyb2xsIHNpemUsIG9yIC0xIGlmIG5vdCBzdXBwb3J0ZWQKLQkgKi8KLQlpbnQgaW5jcmVtZW50UGFnZVNjcm9sbChib29sZWFuIHdhaXRSZW5kZXJpbmcpOwotCi0JLyoqCi0JICogRGVjcmVtZW50YWwgcGFnZSBzY3JvbGwgKFBhZ2UgZG93bikKLQkgKiAKLQkgKiBAcGFyYW0gd2FpdFJlbmRlcmluZwotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgd2FpdCBhIGZpbmlzaCBvZiByZW5kZXJpbmcKLQkgKiBAcmV0dXJuIHNjcm9sbCBzaXplLCBvciAtMSBpZiBub3Qgc3VwcG9ydGVkCi0JICovCi0JaW50IGRlY3JlbWVudFBhZ2VTY3JvbGwoYm9vbGVhbiB3YWl0UmVuZGVyaW5nKTsKLQotCS8qKgotCSAqIEp1bXAgdG8gc3BlY2lmaWVkIHBhZ2UKLQkgKiAKLQkgKiBAcGFyYW0gcGFnZU51bWJlcgotCSAqICAgICAgICAgICAgdGFyZ2V0IHBhZ2UgbnVtYmVyCi0JICogQHBhcmFtIHdhaXRSZW5kZXJpbmcKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHdhaXQgYSBmaW5pc2ggb2YgcmVuZGVyaW5nCi0JICogQHJldHVybiByZXN1bHRpbmcgcGFnZSBudW1iZXIKLQkgKi8KLQlpbnQganVtcFRvUGFnZShpbnQgcGFnZU51bWJlciwgYm9vbGVhbiB3YWl0UmVuZGVyaW5nKTsKLQotCS8qKgotCSAqIEdldCBjdXJyZW50IHBhZ2UgbnVtYmVyIG9mIHRoZSBjb250ZW50Ci0JICogCi0JICogQHJldHVybiBjdXJyZW50IHBhZ2UgbnVtYmVyCi0JICovCi0JaW50IGdldEN1cnJlbnRQYWdlTnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBHZXQgcGFnZSBudW1iZXIgb2YgdGhlIGxhc3QgcGFnZSBvZiB0aGUgY29udGVudAotCSAqIAotCSAqIEByZXR1cm4gcGFnZSBudW1iZXIgb2YgdGhlIGxhc3QgcGFnZQotCSAqLwotCWludCBnZXRMYXN0UGFnZU51bWJlcigpOwotCi0JLyoqCi0JICogR2V0IHNjcmVlbiBzaXplIG9mIHtAbGluayBJTW9kZWxTZXJ2aWNlfQotCSAqIAotCSAqIEBwYXJhbSBpc1dob2xlCi0JICogICAgICAgICAgICA8dWw+Ci0JICogICAgICAgICAgICA8bGk+dHJ1ZTogdHJ5IHRvIGNhbGN1bGF0ZSBlbnRpcmUgYXJlYSBvZiB0aGUgY29udGVudDwvbGk+Ci0JICogICAgICAgICAgICA8bGk+ZmFsc2U6IGN1cnJlbnQgdmlzaWJsZSBhcmVhIHNpemU8L2xpPgotCSAqICAgICAgICAgICAgPC91bD4KLQkgKiBAcmV0dXJuIHNjcmVlbiBzaXplIG9mIHtAbGluayBJTW9kZWxTZXJ2aWNlfQotCSAqLwotCU1vZGVsU2VydmljZVNpemVJbmZvIGdldFNpemUoYm9vbGVhbiBpc1dob2xlKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9JbWFnZVBvc2l0aW9uSW5mby5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL0ltYWdlUG9zaXRpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMDRhNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL0ltYWdlUG9zaXRpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpOwotCi0vKioKLSAqIEltYWdlUG9zaXRpb25JbmZvIHN0b3JlcyBwb3NpdGlvbiBpbmZvcm1hdGlvbiBvZiBpbWFnZXMKLSAqLwotcHVibGljIGNsYXNzIEltYWdlUG9zaXRpb25JbmZvIHsKLQlpbnQgeCA9IDA7Ci0JaW50IHkgPSAwOwotCWludCB3aWR0aCA9IDA7Ci0JaW50IGhlaWdodCA9IDA7Ci0JU3RyaW5nIHVybCA9ICIiOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2Yge0BsaW5rIEltYWdlUG9zaXRpb25JbmZvfQotCSAqIAotCSAqIEBwYXJhbSB4Ci0JICogICAgICAgICAgICBYIHBvc2l0aW9uCi0JICogQHBhcmFtIHkKLQkgKiAgICAgICAgICAgIFkgcG9zaXRpb24KLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqICAgICAgICAgICAgaGVpZ2h0Ci0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgaW1hZ2UgVVJMCi0JICovCi0JcHVibGljIEltYWdlUG9zaXRpb25JbmZvKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBTdHJpbmcgdXJsKSB7Ci0JCXRoaXMueCA9IHg7Ci0JCXRoaXMueSA9IHk7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaGVpZ2h0Ci0JICovCi0JcHVibGljIGludCBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBoZWlnaHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IGhlaWdodAotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50IGhlaWdodCkgewotCQl0aGlzLmhlaWdodCA9IGhlaWdodDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFVSTCBvZiBpbWFnZSBhcyBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgVVJMIG9mIGltYWdlCi0JICogQHBhcmFtIHVybAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gd2lkdGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldFdpZHRoKCkgewotCQlyZXR1cm4gd2lkdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0IHdpZHRoCi0JICogQHBhcmFtIHdpZHRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHdpZHRoKSB7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFggcG9zaXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFgoKSB7Ci0JCXJldHVybiB4OwotCX0KLQotCS8qKgotCSAqIFNldCBYIHBvc2l0aW9uCi0JICogQHBhcmFtIHgKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRYKGludCB4KSB7Ci0JCXRoaXMueCA9IHg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBZIHBvc2l0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRZKCkgewotCQlyZXR1cm4geTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgWSBwb3NpdGlvbgotCSAqIEBwYXJhbSB5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0WShpbnQgeSkgewotCQl0aGlzLnkgPSB5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL01vZGVsU2VydmljZUltYWdlQ3JlYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL01vZGVsU2VydmljZUltYWdlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2QyNzE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9Nb2RlbFNlcnZpY2VJbWFnZUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkudXRpbC5Nb2RlbFNlcnZpY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZXNzYWdlQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBjcmVhdGUgYSBzY3JlZW5zaG90IChiaXRtYXAgZmlsZSkgb2YgdGhlCi0gKiB7QGxpbmsgSU1vZGVsU2VydmljZX0KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsU2VydmljZUltYWdlQ3JlYXRvciB7Ci0KLQkvLyAyNTZNIC0+IDcwMDAwMDAgNDAwTS0+MTAwMDAwMDAKLQkvKioKLQkgKiBNYXhpbXVtIHNpemUgb2Ygc2NyZWVuc2hvdCBpbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERVTVBfSU1HX1NJWkVfTElNSVQgPSAxMDAwMDAwMDsKLQotCXByaXZhdGUgSU1vZGVsU2VydmljZSBtb2RlbFNlcnZpY2U7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBvZiB0aGUgY2xhc3MKLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWxTZXJ2aWNlCi0JICogICAgICAgICAgICB0YXJnZXQge0BsaW5rIElNb2RlbFNlcnZpY2V9Ci0JICovCi0JcHVibGljIE1vZGVsU2VydmljZUltYWdlQ3JlYXRvcihJTW9kZWxTZXJ2aWNlIG1vZGVsU2VydmljZSkgewotCQl0aGlzLm1vZGVsU2VydmljZSA9IG1vZGVsU2VydmljZTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBzY3JlZW5zaG90IG9mIHRoZSB7QGxpbmsgSU1vZGVsU2VydmljZX0gYW5kIHNhdmUgaXQgYXMgYml0bWFwCi0JICogZmlsZQotCSAqIAotCSAqIEBwYXJhbSBzYXZlRmlsZU5hbWUKLQkgKiAgICAgICAgICAgIHRhcmdldCBmaWxlIHBhdGgKLQkgKiBAcGFyYW0gaXNXaG9sZQotCSAqICAgICAgICAgICAgPHVsPgotCSAqICAgICAgICAgICAgPGxpPnRydWU6IHRyeSB0byBpbmNsdWRlIGVudGlyZSBhcmVhIG9mIHRoZSBjb250ZW50IGludG8KLQkgKiAgICAgICAgICAgIHNjcmVlbnNob3Q8L2xpPgotCSAqICAgICAgICAgICAgPGxpPmZhbHNlOiBnZW5lcmF0ZSBzY3JlZW5zaG90IG9mIGN1cnJlbnQgdmlzaWJsZSBhcmVhPC9saT4KLQkgKiAgICAgICAgICAgIDwvdWw+Ci0JICogQHJldHVybiByZXN1bHRpbmcge0BsaW5rIEZpbGV9Ci0JICovCi0JcHVibGljIEZpbGUgZ2V0U2NyZWVuSW1hZ2VBc0JNUChTdHJpbmcgc2F2ZUZpbGVOYW1lLCBib29sZWFuIGlzV2hvbGUpIHsKLQotCQlJTW9kZWxTZXJ2aWNlU2Nyb2xsTWFuYWdlciBzY3JvbGxNYW5hZ2VyID0gbW9kZWxTZXJ2aWNlCi0JCQkJLmdldFNjcm9sbE1hbmFnZXIoKTsKLQkJaW50W10gc2l6ZSA9IHNjcm9sbE1hbmFnZXIuZ2V0U2l6ZShpc1dob2xlKS50b0FycmF5KCk7Ci0KLQkJYm9vbGVhbiBodWdlSW1hZ2UgPSBmYWxzZTsKLQotCQlpZiAoc2l6ZVswXSA8IDEgfHwgc2l6ZVsxXSA8IDEpIHsKLQkJCXNpemUgPSBuZXcgaW50W10geyAxLCAxLCAxLCAxIH07Ci0JCX0KLQotCQlpZiAoc2l6ZVsyXSAqIHNpemVbM10gPiBEVU1QX0lNR19TSVpFX0xJTUlUKSB7Ci0JCQlzaXplWzNdID0gRFVNUF9JTUdfU0laRV9MSU1JVCAvIHNpemVbMl07Ci0JCQlpZiAoaXNXaG9sZSkgewotCQkJCWh1Z2VJbWFnZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlJbWFnZURhdGFbXSB3aG9sZUltZ0RhdGE7Ci0KLQkJaWYgKGlzV2hvbGUpIHsKLQkJCXN3aXRjaCAoc2Nyb2xsTWFuYWdlci5nZXRTY3JvbGxUeXBlKCkpIHsKLQkJCWNhc2UgSU1vZGVsU2VydmljZVNjcm9sbE1hbmFnZXIuQUJTT0xVVEVfQ09PUkRJTkFURToKLQkJCQl3aG9sZUltZ0RhdGEgPSBnZXRJbWFnZUJ5QWJzb2x1dGVDb29yZGluYXRlU2Nyb2xsKHNpemUsCi0JCQkJCQlzY3JvbGxNYW5hZ2VyLCB0cnVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU1vZGVsU2VydmljZVNjcm9sbE1hbmFnZXIuUEFHRToKLQkJCQl3aG9sZUltZ0RhdGEgPSBnZXRJbWFnZUJ5UGFnZVNjcm9sbChzaXplLCBzY3JvbGxNYW5hZ2VyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU1vZGVsU2VydmljZVNjcm9sbE1hbmFnZXIuSU5DUkVNRU5UQUw6Ci0JCQkJd2hvbGVJbWdEYXRhID0gZ2V0SW1hZ2VCeUluY3JlbWVudGFsU2Nyb2xsKHNpemUsIHNjcm9sbE1hbmFnZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTW9kZWxTZXJ2aWNlU2Nyb2xsTWFuYWdlci5OT05FOgotCQkJZGVmYXVsdDoKLQkJCQlodWdlSW1hZ2UgPSBmYWxzZTsKLQkJCQl3aG9sZUltZ0RhdGEgPSBnZXRJbWFnZUJ5QWJzb2x1dGVDb29yZGluYXRlU2Nyb2xsKHNpemUsCi0JCQkJCQlzY3JvbGxNYW5hZ2VyLCBmYWxzZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl3aG9sZUltZ0RhdGEgPSBnZXRJbWFnZUJ5QWJzb2x1dGVDb29yZGluYXRlU2Nyb2xsKHNpemUsCi0JCQkJCXNjcm9sbE1hbmFnZXIsIGZhbHNlKTsKLQkJfQotCi0JCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQlsb2FkZXIuZGF0YSA9IHdob2xlSW1nRGF0YTsKLQkJbG9hZGVyLnNhdmUoc2F2ZUZpbGVOYW1lLCBTV1QuSU1BR0VfQk1QKTsKLQotCQlpZiAoaHVnZUltYWdlKSB7Ci0JCQlNZXNzYWdlQm94IHdhcm4gPSBuZXcgTWVzc2FnZUJveChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9LCi0JCQkJCXwgU1dULklDT05fSU5GT1JNQVRJT04pOwotCQkJd2Fybi5zZXRNZXNzYWdlKE1vZGVsU2VydmljZU1lc3NhZ2VzCi0JCQkJCS5nZXRTdHJpbmcoIkltYWdlQ3JlYXRvci5JbWFnZVRvb0xhcmdlIikpOwotCQkJd2Fybi5vcGVuKCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IEZpbGUoc2F2ZUZpbGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlRGF0YVtdIGdldEltYWdlQnlBYnNvbHV0ZUNvb3JkaW5hdGVTY3JvbGwoaW50W10gc2l6ZSwKLQkJCUlNb2RlbFNlcnZpY2VTY3JvbGxNYW5hZ2VyIHNjcm9sbE1hbmFnZXIsIGJvb2xlYW4gaXNXaG9sZSkgewotCQlJbWFnZSBpbWcgPSBuZXcgSW1hZ2UoRGlzcGxheS5nZXREZWZhdWx0KCksIHNpemVbMF0gKyAyLCBzaXplWzFdICsgMik7Ci0JCUltYWdlRGF0YVtdIHdob2xlSW1nRGF0YSA9IG5ldyBJbWFnZURhdGFbMV07Ci0JCUdDIGdjID0gbmV3IEdDKG1vZGVsU2VydmljZS5nZXRUYXJnZXRDb21wb3NpdGUoKSk7Ci0JCWludCB4Q250LCB5Q250OwotCi0JCWlmIChpc1dob2xlKSB7Ci0JCQl4Q250ID0gKHNpemVbMl0gKyBzaXplWzBdIC0gMSkgLyBzaXplWzBdOwotCQkJeUNudCA9IChzaXplWzNdICsgc2l6ZVsxXSAtIDEpIC8gc2l6ZVsxXTsKLQkJfSBlbHNlIHsKLQkJCXhDbnQgPSAxOwotCQkJeUNudCA9IDE7Ci0JCQlzaXplWzJdID0gc2l6ZVswXTsKLQkJCXNpemVbM10gPSBzaXplWzFdOwotCQl9Ci0JCUltYWdlRGF0YVtdW10gaW1nRGF0YSA9IG5ldyBJbWFnZURhdGFbeENudF1beUNudF07Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzdGFydCBhOiIreENudCsiICIreUNudCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB4Q250OyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgeUNudDsgaisrKSB7Ci0JCQkJaWYgKGlzV2hvbGUpIHsKLQkJCQkJc2Nyb2xsTWFuYWdlci5hYnNvbHV0ZUNvb3JkaW5hdGVTY3JvbGwoaSAqIHNpemVbMF0sIGoKLQkJCQkJCQkqIHNpemVbMV0sIHRydWUpOwotCQkJCX0KLQotCQkJCWdjLmNvcHlBcmVhKGltZywgMCwgMCk7Ci0JCQkJaW1nRGF0YVtpXVtqXSA9IGltZy5nZXRJbWFnZURhdGEoKTsKLQkJCX0KLQkJfQotCQlpZiAoaXNXaG9sZSkgewotCQkJc2Nyb2xsTWFuYWdlci5hYnNvbHV0ZUNvb3JkaW5hdGVTY3JvbGwoMCwgMCwgZmFsc2UpOwotCQl9Ci0KLQkJaW50IGRlcHRoID0gaW1nRGF0YVswXVswXS5kZXB0aDsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHNpemVbMF0gKyAiICIgKyBzaXplWzFdICsgIiAiICsgc2l6ZVsyXSArICIgIiArCi0JCS8vIHNpemVbM10gKyAiICIgKyBkZXB0aCk7Ci0KLQkJd2hvbGVJbWdEYXRhWzBdID0gbmV3IEltYWdlRGF0YShzaXplWzJdLCBzaXplWzNdLCBkZXB0aCwKLQkJCQlpbWdEYXRhWzBdWzBdLnBhbGV0dGUpOwotCQkvLyBuZXcgUGFsZXR0ZURhdGEoMHhmZiwweGZmLDB4ZmYpKTsKLQotCQlpbnQgd2hvbGVSb3dCeXRlcyA9ICgoc2l6ZVsyXSAqIGRlcHRoICsgMzEpIC8gMzIpICogNDsKLQkJaW50IHBhcnRSb3dCeXRlcyA9ICgoKHNpemVbMF0gKyAyKSAqIGRlcHRoICsgMzEpIC8gMzIpICogNDsKLQkJZGVwdGggPSBkZXB0aCAvIDg7Ci0JCWludCB4QmVnaW4sIHlCZWdpbjsKLQotCQlpbnQgd2hvbGVTaXplID0gd2hvbGVJbWdEYXRhWzBdLmRhdGEubGVuZ3RoOwotCi0JCWZvciAoaW50IGogPSAwOyBqIDwgeUNudDsgaisrKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHhDbnQ7IGkrKykgewotCQkJCWlmIChqIDwgeUNudCAtIDEpIHsKLQkJCQkJeUJlZ2luID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQl5QmVnaW4gPSBzaXplWzFdICogeUNudCAtIHNpemVbM107Ci0JCQkJfQotCi0JCQkJaWYgKGkgPCB4Q250IC0gMSkgewotCQkJCQl4QmVnaW4gPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXhCZWdpbiA9IHNpemVbMF0gKiB4Q250IC0gc2l6ZVsyXTsKLQkJCQl9Ci0JCQkJeEJlZ2luICs9IDI7Ci0KLQkJCQlmb3IgKGludCBrID0geUJlZ2luOyBrIDwgc2l6ZVsxXTsgaysrKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaToiICsgaSArICIgajoiICsgaiArICIgazoiICsgayk7Ci0JCQkJCWludCB3aG9sZUJlZ2luID0gKGogKiBzaXplWzFdICsgKGsgLSB5QmVnaW4pKQotCQkJCQkJCSogd2hvbGVSb3dCeXRlcyArIGkgKiBzaXplWzBdICogZGVwdGg7Ci0JCQkJCWludCBjb3B5U2l6ZSA9IHBhcnRSb3dCeXRlcyAtIHhCZWdpbiAqIGRlcHRoOwotCQkJCQlpZiAod2hvbGVTaXplIDwgd2hvbGVCZWdpbiArIGNvcHlTaXplKSB7Ci0JCQkJCQljb3B5U2l6ZSA9IHdob2xlU2l6ZSAtIHdob2xlQmVnaW47Ci0JCQkJCX0KLQkJCQkJU3lzdGVtLmFycmF5Y29weShpbWdEYXRhW2ldW2pdLmRhdGEsIChrICsgMikgKiBwYXJ0Um93Qnl0ZXMKLQkJCQkJCQkrIHhCZWdpbiAqIGRlcHRoLCB3aG9sZUltZ0RhdGFbMF0uZGF0YSwgd2hvbGVCZWdpbiwKLQkJCQkJCQljb3B5U2l6ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZ2MuZGlzcG9zZSgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkltYWdlQ3JlYXRvcihhYnMpOiBmaW4iKTsKLQotCQlyZXR1cm4gd2hvbGVJbWdEYXRhOwotCi0JfQotCi0JcHJpdmF0ZSBJbWFnZURhdGFbXSBnZXRJbWFnZUJ5SW5jcmVtZW50YWxTY3JvbGwoaW50W10gc2l6ZSwKLQkJCUlNb2RlbFNlcnZpY2VTY3JvbGxNYW5hZ2VyIHNjcm9sbE1hbmFnZXIpIHsKLQkJZmluYWwgSW1hZ2UgaW1nID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCBzaXplWzBdICsgMiwKLQkJCQlzaXplWzFdICsgMik7Ci0JCUltYWdlRGF0YVtdIHdob2xlSW1nRGF0YSA9IG5ldyBJbWFnZURhdGFbMV07Ci0JCWZpbmFsIEdDIGdjID0gbmV3IEdDKG1vZGVsU2VydmljZS5nZXRUYXJnZXRDb21wb3NpdGUoKSk7Ci0JCWludCB4Q250ID0gMSwgeUNudCA9IDE7Ci0KLQkJLy8gVE9ETyB1c2UgZ2V0U2Nyb2xsY291bnQoKSBtZXRob2QKLQkJd2hpbGUgKHNjcm9sbE1hbmFnZXIuaW5jcmVtZW50TGFyZ2VTY3JvbGxYKGZhbHNlKSA+IDApCi0JCQk7Ci0JCXdoaWxlIChzY3JvbGxNYW5hZ2VyLmluY3JlbWVudExhcmdlU2Nyb2xsWShmYWxzZSkgPiAwKQotCQkJOwotCi0JCXdoaWxlIChzY3JvbGxNYW5hZ2VyLmRlY3JlbWVudExhcmdlU2Nyb2xsWChmYWxzZSkgPiAwKSB7Ci0JCQl4Q250Kys7Ci0JCX0KLQkJd2hpbGUgKHNjcm9sbE1hbmFnZXIuZGVjcmVtZW50TGFyZ2VTY3JvbGxZKGZhbHNlKSA+IDApIHsKLQkJCXlDbnQrKzsKLQkJfQotCi0JCS8vIGZvciByZW5kZXJpbmcgd2FpdAotCQlzY3JvbGxNYW5hZ2VyLmRlY3JlbWVudExhcmdlU2Nyb2xsWSh0cnVlKTsKLQotCQlJbWFnZURhdGFbXVtdIGltZ0RhdGEgPSBuZXcgSW1hZ2VEYXRhW3hDbnRdW3lDbnRdOwotCQlpbnRbXSBzY3JvbGxYID0gbmV3IGludFt4Q250XTsKLQkJaW50W10gc2Nyb2xsWSA9IG5ldyBpbnRbeUNudF07Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzdGFydDoiICsgeENudCArICIgIiArIHlDbnQpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiWDogIitzY3JvbGxNYW5hZ2VyLmluY3JlbWVudFNjcm9sbFgoKSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiWTogIitzY3JvbGxNYW5hZ2VyLmluY3JlbWVudFNjcm9sbFkoKSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB4Q250OyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgeUNudDsgaisrKSB7Ci0KLQkJCQlnYy5jb3B5QXJlYShpbWcsIDAsIDApOwotCQkJCWltZ0RhdGFbaV1bal0gPSBpbWcuZ2V0SW1hZ2VEYXRhKCk7Ci0KLQkJCQkvLyBnYy5jb3B5QXJlYShpbWcsIDAsIDApOwotCQkJCS8vIGltZ0RhdGFbaV1bal0gPSBpbWcuZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJc2Nyb2xsWVtqXSA9IHNjcm9sbE1hbmFnZXIuaW5jcmVtZW50TGFyZ2VTY3JvbGxZKHRydWUpOwotCQkJfQotCQkJc2Nyb2xsWFtpXSA9IHNjcm9sbE1hbmFnZXIuaW5jcmVtZW50TGFyZ2VTY3JvbGxYKHRydWUpOwotCQkJd2hpbGUgKHNjcm9sbE1hbmFnZXIuZGVjcmVtZW50TGFyZ2VTY3JvbGxZKGZhbHNlKSA+IDApCi0JCQkJOwotCQl9Ci0KLQkJaW50IGRlcHRoID0gaW1nRGF0YVswXVswXS5kZXB0aDsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHNpemVbMF0gKyAiICIgKyBzaXplWzFdICsgIiAiICsgc2l6ZVsyXSArICIgIiArCi0JCS8vIHNpemVbM10gKyAiICIgKyBkZXB0aCk7Ci0KLQkJd2hvbGVJbWdEYXRhWzBdID0gbmV3IEltYWdlRGF0YShzaXplWzJdLCBzaXplWzNdLCBkZXB0aCwKLQkJCQlpbWdEYXRhWzBdWzBdLnBhbGV0dGUpOwotCi0JCWludCB3aG9sZVJvd0J5dGVzID0gKChzaXplWzJdICogZGVwdGggKyAzMSkgLyAzMikgKiA0OwotCQlpbnQgcGFydFJvd0J5dGVzID0gKCgoc2l6ZVswXSArIDIpICogZGVwdGggKyAzMSkgLyAzMikgKiA0OwotCQlkZXB0aCA9IGRlcHRoIC8gODsKLQkJaW50IHhCZWdpbiwgeUJlZ2luOwotCQlpbnQgY3VyWCA9IDAsIGN1clkgPSAwOwotCQlpbnQgZmluWCA9IDAsIGZpblkgPSAwOwotCi0JCWludCB3aG9sZVNpemUgPSB3aG9sZUltZ0RhdGFbMF0uZGF0YS5sZW5ndGg7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb3B5IHN0YXJ0Iik7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgeUNudDsgaisrKSB7Ci0JCQlpZiAoaiA9PSAwKSB7Ci0JCQkJeUJlZ2luID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJeUJlZ2luID0gZmluWSAtIGN1clk7Ci0JCQl9Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlk6ICIgKyB5QmVnaW4gKyAiICIgKyBjdXJZICsgIiAiICsgZmluWSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHhDbnQ7IGkrKykgewotCi0JCQkJaWYgKGkgPT0gMCkgewotCQkJCQl4QmVnaW4gPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXhCZWdpbiA9IGZpblggLSBjdXJYOwotCQkJCX0KLQkJCQl4QmVnaW4gKz0gMjsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlg6ICIgKyB4QmVnaW4gKyAiICIgKyBjdXJYICsgIiAiICsgZmluWCk7Ci0KLQkJCQkvLyBmb3IgKGludCBrID0geUJlZ2luOyBrIDwgc2l6ZVsxXTsgaysrKSB7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBzaXplWzFdOyBrKyspIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpOiIgKyBpICsgIiBqOiIgKyBqICsgIiBrOiIgKyBrKTsKLQotCQkJCQlpbnQgd2hvbGVCZWdpbiA9IChmaW5ZICsgKGsgLSB5QmVnaW4pKSAqIHdob2xlUm93Qnl0ZXMKLQkJCQkJCQkrIGZpblggKiBkZXB0aDsKLQkJCQkJaW50IGNvcHlTaXplID0gcGFydFJvd0J5dGVzIC0geEJlZ2luICogZGVwdGg7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbih3aG9sZUJlZ2luICsgIiAiICsgY29weVNpemUgKyAiICIgKwotCQkJCQkvLyB3aG9sZVNpemUpOwotCQkJCQlpZiAod2hvbGVTaXplIDwgd2hvbGVCZWdpbiArIGNvcHlTaXplKSB7Ci0JCQkJCQljb3B5U2l6ZSA9IHdob2xlU2l6ZSAtIHdob2xlQmVnaW47Ci0JCQkJCX0KLQkJCQkJaWYgKGNvcHlTaXplID4gMCkgewotCQkJCQkJU3lzdGVtLmFycmF5Y29weShpbWdEYXRhW2ldW2pdLmRhdGEsIChrICsgMikKLQkJCQkJCQkJKiBwYXJ0Um93Qnl0ZXMgKyB4QmVnaW4gKiBkZXB0aCwKLQkJCQkJCQkJd2hvbGVJbWdEYXRhWzBdLmRhdGEsIHdob2xlQmVnaW4sIGNvcHlTaXplKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljdXJYICs9IHNjcm9sbFhbaV07Ci0JCQkJZmluWCArPSBzaXplWzBdIC0geEJlZ2luOwotCQkJfQotCQkJY3VyWSArPSBzY3JvbGxZW2pdOwotCQkJZmluWSArPSBzaXplWzFdIC0geUJlZ2luOwotCQl9Ci0KLQkJZ2MuZGlzcG9zZSgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkltYWdlQ3JlYXRvcihpbmMpOiBmaW4iKTsKLQkJcmV0dXJuIHdob2xlSW1nRGF0YTsKLQotCX0KLQotCXByaXZhdGUgSW1hZ2VEYXRhW10gZ2V0SW1hZ2VCeVBhZ2VTY3JvbGwoaW50W10gc2l6ZSwKLQkJCUlNb2RlbFNlcnZpY2VTY3JvbGxNYW5hZ2VyIHNjcm9sbE1hbmFnZXIpIHsKLQkJZmluYWwgSW1hZ2UgaW1nID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCBzaXplWzBdICsgMiwKLQkJCQlzaXplWzFdICsgMik7Ci0JCUltYWdlRGF0YVtdIHdob2xlSW1nRGF0YSA9IG5ldyBJbWFnZURhdGFbMV07Ci0JCWZpbmFsIEdDIGdjID0gbmV3IEdDKG1vZGVsU2VydmljZS5nZXRUYXJnZXRDb21wb3NpdGUoKSk7Ci0JCWludCB5Q250ID0gMTsKLQotCQl5Q250ID0gc2Nyb2xsTWFuYWdlci5nZXRMYXN0UGFnZU51bWJlcigpOwotCQlpZiAoeUNudCA8IDEpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigicGFnZSBjb3VudDoiICsgeUNudCk7Ci0JCQl5Q250ID0gMTsKLQkJfQotCi0JCXNjcm9sbE1hbmFnZXIuanVtcFRvUGFnZSgxLCB0cnVlKTsKLQotCQlJbWFnZURhdGFbXSBpbWdEYXRhID0gbmV3IEltYWdlRGF0YVt5Q250XTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0OiIgKyAiICIgKyB5Q250KTsKLQotCQlmb3IgKGludCBqID0gMDsgaiA8IHlDbnQ7IGorKykgewotCQkJZ2MuY29weUFyZWEoaW1nLCAwLCAwKTsKLQkJCWltZ0RhdGFbal0gPSBpbWcuZ2V0SW1hZ2VEYXRhKCk7Ci0JCQlzY3JvbGxNYW5hZ2VyLmluY3JlbWVudFBhZ2VTY3JvbGwodHJ1ZSk7Ci0JCX0KLQkJc2Nyb2xsTWFuYWdlci5qdW1wVG9QYWdlKDEsIGZhbHNlKTsKLQotCQlpbnQgZGVwdGggPSBpbWdEYXRhWzBdLmRlcHRoOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oc2l6ZVswXSArICIgIiArIHNpemVbMV0gKyAiICIgKyBzaXplWzJdICsgIiAiICsKLQkJLy8gc2l6ZVszXSArICIgIiArIGRlcHRoKTsKLQotCQl3aG9sZUltZ0RhdGFbMF0gPSBuZXcgSW1hZ2VEYXRhKHNpemVbMl0sIHNpemVbM10sIGRlcHRoLAotCQkJCWltZ0RhdGFbMF0ucGFsZXR0ZSk7Ci0KLQkJaW50IHdob2xlUm93Qnl0ZXMgPSAoKHNpemVbMl0gKiBkZXB0aCArIDMxKSAvIDMyKSAqIDQ7Ci0JCWludCBwYXJ0Um93Qnl0ZXMgPSAoKChzaXplWzBdICsgMikgKiBkZXB0aCArIDMxKSAvIDMyKSAqIDQ7Ci0JCWRlcHRoID0gZGVwdGggLyA4OwotCi0JCWludCB3aG9sZVNpemUgPSB3aG9sZUltZ0RhdGFbMF0uZGF0YS5sZW5ndGg7Ci0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCB5Q250OyBqKyspIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgc2l6ZVsxXTsgaysrKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpOiIgKyBpICsgIiBqOiIgKyBqICsgIiBrOiIgKyBrKTsKLQkJCQlpbnQgd2hvbGVCZWdpbiA9IChzaXplWzFdICogaiArIGspICogd2hvbGVSb3dCeXRlczsKLQkJCQlpbnQgY29weVNpemUgPSBwYXJ0Um93Qnl0ZXM7Ci0JCQkJaWYgKHdob2xlU2l6ZSA8IHdob2xlQmVnaW4gKyBjb3B5U2l6ZSkgewotCQkJCQljb3B5U2l6ZSA9IHdob2xlU2l6ZSAtIHdob2xlQmVnaW47Ci0JCQkJfQotCQkJCWlmIChjb3B5U2l6ZSA+IDApIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShpbWdEYXRhW2pdLmRhdGEsIChrICsgMikgKiBwYXJ0Um93Qnl0ZXMsCi0JCQkJCQkJd2hvbGVJbWdEYXRhWzBdLmRhdGEsIHdob2xlQmVnaW4sIGNvcHlTaXplKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCWdjLmRpc3Bvc2UoKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbWFnZUNyZWF0b3IocGFnZSk6IGZpbiIpOwotCQlyZXR1cm4gd2hvbGVJbWdEYXRhOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL01vZGVsU2VydmljZVNpemVJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvTW9kZWxTZXJ2aWNlU2l6ZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiZTJmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvTW9kZWxTZXJ2aWNlU2l6ZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpOwotCi0vKioKLSAqIE1vZGVsU2VydmljZVNpemVJbmZvIHN0b3JlcyBzaXplIGluZm9ybWF0aW9uIG9mIHtAbGluayBJTW9kZWxTZXJ2aWNlfQotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxTZXJ2aWNlU2l6ZUluZm8gewotCi0JaW50IHZpZXdTaXplWDsKLQotCWludCB2aWV3U2l6ZVk7Ci0KLQlpbnQgd2hvbGVTaXplWDsKLQotCWludCB3aG9sZVNpemVZOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgdGhlIGNsYXNzCi0JICogCi0JICogQHBhcmFtIHZpZXdTaXplWAotCSAqICAgICAgICAgICAgY3VycmVudCB2aXNpYmxlIHZpZXcgc2l6ZSAoaG9yaXpvbnRhbCkKLQkgKiBAcGFyYW0gdmlld1NpemVZCi0JICogICAgICAgICAgICBjdXJyZW50IHZpc2libGUgdmlldyBzaXplICh2ZXJ0aWNhbCkKLQkgKiBAcGFyYW0gd2hvbGVTaXplWAotCSAqICAgICAgICAgICAgZW50aXJlIGNvbnRlbnQgc2l6ZSAoaG9yaXpvbnRhbCkKLQkgKiBAcGFyYW0gd2hvbGVTaXplWQotCSAqICAgICAgICAgICAgZW50aXJlIGNvbnRlbnQgc2l6ZSAodmVydGljYWwpCi0JICovCi0JcHVibGljIE1vZGVsU2VydmljZVNpemVJbmZvKGludCB2aWV3U2l6ZVgsIGludCB2aWV3U2l6ZVksIGludCB3aG9sZVNpemVYLAotCQkJaW50IHdob2xlU2l6ZVkpIHsKLQkJdGhpcy52aWV3U2l6ZVggPSB2aWV3U2l6ZVg7Ci0JCXRoaXMudmlld1NpemVZID0gdmlld1NpemVZOwotCQl0aGlzLndob2xlU2l6ZVggPSB3aG9sZVNpemVYOwotCQl0aGlzLndob2xlU2l6ZVkgPSB3aG9sZVNpemVZOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdmlldyBzaXplIFgKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZpZXdTaXplWCgpIHsKLQkJcmV0dXJuIHZpZXdTaXplWDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHZpZXcgc2l6ZSBZCi0JICovCi0JcHVibGljIGludCBnZXRWaWV3U2l6ZVkoKSB7Ci0JCXJldHVybiB2aWV3U2l6ZVk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBlbnRpcmUgY29udGVudCBzaXplIFgKLQkgKi8KLQlwdWJsaWMgaW50IGdldFdob2xlU2l6ZVgoKSB7Ci0JCXJldHVybiB3aG9sZVNpemVYOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gZW50aXJlIGNvbnRlbnQgc2l6ZSBZCi0JICovCi0JcHVibGljIGludCBnZXRXaG9sZVNpemVZKCkgewotCQlyZXR1cm4gd2hvbGVTaXplWTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRvIGFycmF5IHt2aWV3IHNpemUgWCwgdmlldyBzaXplIFksIHdob2xlIHNpemUgWCwgd2hvbGUgc2l6ZSBZfQotCSAqIAotCSAqIEByZXR1cm4gY29udmVydGVkIHNpemUgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgaW50W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7IHZpZXdTaXplWCwgdmlld1NpemVZLCB3aG9sZVNpemVYLCB3aG9sZVNpemVZIH07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJWaWV3OiAoIiArIHZpZXdTaXplWCArICIsICIgKyB2aWV3U2l6ZVkgKyAiKSBXaG9sZTogKCIKLQkJCQkrIHdob2xlU2l6ZVggKyAiLCAiICsgd2hvbGVTaXplWSArICIpIjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvRHVtbXlFZGl0b3JJbnB1dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvci9EdW1teUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMjkyMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvci9EdW1teUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLklNb2RlbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotCi0vKioKLSAqIER1bW15IEVkaXRvciBJbnB1dCBmb3IgRWRpdG9ycyBvZiBBQ1RGIHtAbGluayBJTW9kZWxTZXJ2aWNlfSBpbXBsZW1lbnRhdGlvbi4KLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCBmb3Igb3BlbiBleHRlcm5hbCByZXNvdXJjZXMsIHN1Y2ggYXMgV2ViIHNpdGUsIGV0Yy4KLSAqIAotICogQHNlZSBJTW9kZWxTZXJ2aWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBEdW1teUVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0IHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSAiIjsKLQotCXByaXZhdGUgU3RyaW5nIHVybCA9ICIiOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgdGFyZ2V0IGNvbnRlbnQgVVJMCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoaXMgRWRpdG9yIGlucHV0Ci0JICovCi0JcHVibGljIER1bW15RWRpdG9ySW5wdXQoU3RyaW5nIHVybCwgU3RyaW5nIG5hbWUpIHsKLQkJc2V0VXJsKHVybCk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJleGlzdHMiKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRhcmdldCBjb250ZW50IFVSTCBhcyBTdHJpbmcuIEFDVEYge0BsaW5rIElNb2RlbFNlcnZpY2V9Ci0JICogaW1wbGVtZW50YXRpb25zIHdpbGwgb3BlbiB0aGUgVVJMLgotCSAqIAotCSAqIEByZXR1cm4gdGFyZ2V0IGNvbnRlbnQgVVJMIGFzIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7Ci0JCWlmICh1cmwgIT0gbnVsbCkgewotCQkJdGhpcy51cmwgPSB1cmw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYWN0aW9ucy9EaXNhYmxlRGVidWdNZXNzYWdlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2FjdGlvbnMvRGlzYWJsZURlYnVnTWVzc2FnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDU1MDc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYWN0aW9ucy9EaXNhYmxlRGVidWdNZXNzYWdlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuTW9kZWxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLklNb2RlbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5JV2ViQnJvd3NlckFDVEY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS51dGlsLk1vZGVsU2VydmljZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkudXRpbC5Nb2RlbFNlcnZpY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIEFjdGlvbiB0byBpbnZva2UgZGlzYWJsZVNjcmlwdERlYnVnZ2VyIG1ldGhvZCBvZiB0aGUgY3VycmVudCBhY3RpdmUKLSAqIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0gKi8KLXB1YmxpYyBjbGFzcyBEaXNhYmxlRGVidWdNZXNzYWdlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMKLQkJSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2UgPSBNb2RlbFNlcnZpY2VNZXNzYWdlcwotCQkJLmdldFN0cmluZygiV2ViQnJvd3Nlci5TY3JpcHQiKTsKLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlX3RwID0gTW9kZWxTZXJ2aWNlTWVzc2FnZXMKLQkJCS5nZXRTdHJpbmcoIldlYkJyb3dzZXIuU2NyaXB0X3RwIik7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBvZiB0aGUgYWN0aW9uIHdpdGggaW1hZ2UgaWNvbi4KLQkgKi8KLQlwdWJsaWMgRGlzYWJsZURlYnVnTWVzc2FnZUFjdGlvbigpIHsKLQkJdGhpcyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBvZiB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmbGFnCi0JICogICAgICAgICAgICBpZiB0cnVlLCBzZXQgaW1hZ2UgaWNvbiB0byB0aGUgQWN0aW9uCi0JICovCi0JcHVibGljIERpc2FibGVEZWJ1Z01lc3NhZ2VBY3Rpb24oYm9vbGVhbiBmbGFnKSB7Ci0JCXN1cGVyKCJzY3JpcHQiLCBBU19DSEVDS19CT1gpOwotCQlzZXRUZXh0KG1lc3NhZ2UpOwotCQlzZXRUb29sVGlwVGV4dChtZXNzYWdlX3RwKTsKLQkJLy8gVE9ETyByZWZlciBjdXJyZW50IHNldHRpbmcKLQkJc2V0Q2hlY2tlZCh0cnVlKTsKLQkJaWYgKGZsYWcpCi0JCQlzZXRJbWFnZURlc2NyaXB0b3IoTW9kZWxVSVBsdWdpbgotCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy90b29sYmFyL3NjcmlwdERlYnVnLnBuZyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0KLQkJSU1vZGVsU2VydmljZSBtb2RlbFNlcnZpY2UgPSBNb2RlbFNlcnZpY2VVdGlscy5nZXRBY3RpdmVNb2RlbFNlcnZpY2UoKTsKLQkJaWYgKG1vZGVsU2VydmljZSAhPSBudWxsICYmIG1vZGVsU2VydmljZSBpbnN0YW5jZW9mIElXZWJCcm93c2VyQUNURikgewotCQkJKChJV2ViQnJvd3NlckFDVEYpIG1vZGVsU2VydmljZSkuc2V0RGlzYWJsZVNjcmlwdERlYnVnZ2VyKHRoaXMKLQkJCQkJLmlzQ2hlY2tlZCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRDaGVja2VkKCgoQWN0aW9uKSBldmVudC5nZXRTb3VyY2UoKSkuaXNDaGVja2VkKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYWN0aW9ucy9GYXZvcml0ZXNNZW51LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2FjdGlvbnMvRmF2b3JpdGVzTWVudS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODM2MTY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYWN0aW9ucy9GYXZvcml0ZXNNZW51LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuRmF2b3JpdGVzQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5GYXZvcml0ZXNDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLkZhdm9yaXRlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9ucy5BZGRGYXZvcml0ZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9ucy5BcnJhbmdlRmF2b3JpdGVzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuZWRpdG9yLmFjdGlvbnMuRmF2b3JpdGVzSXRlbUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLnV0aWwuTW9kZWxTZXJ2aWNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotLyoqCi0gKiBNZW51TWFuYWdlciBmb3IgZmF2b3JpdGVzIGNvbnRyb2wKLSAqLwotcHVibGljIGNsYXNzIEZhdm9yaXRlc01lbnUgZXh0ZW5kcyBNZW51TWFuYWdlciBpbXBsZW1lbnRzCi0JCUZhdm9yaXRlc0NoYW5nZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyBfd2luZG93OwotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gX2Zhdm9yaXRlc0l0ZW1JZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotCXByaXZhdGUgYm9vbGVhbiB1c2VFeGlzdGluZ0VkaXRvcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIG9mIE1lbnVNYW5hZ2VyLiBJZiB1c2VyIHNlbGVjdHMgZmF2b3JpdGUgaXRlbSwgb3BlbiB3aXRoIG5ldwotCSAqIEVkaXRvciB3aW5kb3cuCi0JICogCi0JICogQHBhcmFtIHdpbmRvdwotCSAqICAgICAgICAgICAgdGFyZ2V0IHtAbGluayBJV29ya2JlbmNoV2luZG93fQotCSAqLwotCXB1YmxpYyBGYXZvcml0ZXNNZW51KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXRoaXMod2luZG93LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgTWVudU1hbmFnZXIKLQkgKiAKLQkgKiBAcGFyYW0gd2luZG93Ci0JICogICAgICAgICAgICB0YXJnZXQge0BsaW5rIElXb3JrYmVuY2hXaW5kb3d9Ci0JICogQHBhcmFtIHVzZUV4aXN0aW5nRWRpdG9yCi0JICogICAgICAgICAgICBpZiB0cnVlLCB1c2UgZXhpc3RpbmcgZWRpdG9yIHRvIG9wZW4gc2VsZWN0ZWQgZmF2b3JpdGUgaXRlbQotCSAqLwotCXB1YmxpYyBGYXZvcml0ZXNNZW51KElXb3JrYmVuY2hXaW5kb3cgd2luZG93LCBib29sZWFuIHVzZUV4aXN0aW5nRWRpdG9yKSB7Ci0JCXN1cGVyKE1vZGVsU2VydmljZU1lc3NhZ2VzLmdldFN0cmluZygiTWVudUNvbnN0LkYmYXZvcml0ZXNfOCIpKTsKLQkJdGhpcy5fd2luZG93ID0gd2luZG93OwotCi0JCXRoaXMudXNlRXhpc3RpbmdFZGl0b3IgPSB1c2VFeGlzdGluZ0VkaXRvcjsKLQotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGZhdm9yaXRlc01hcCA9IEZhdm9yaXRlc1V0aWwuZ2V0RmF2b3JpdGVzTWFwKCk7Ci0KLQkJQWRkRmF2b3JpdGVzQWN0aW9uIGZhdm9yaXRlc0FkZEFjdGlvbiA9IG5ldyBBZGRGYXZvcml0ZXNBY3Rpb24od2luZG93LAotCQkJCWZhdm9yaXRlc01hcCk7Ci0JCWFkZChmYXZvcml0ZXNBZGRBY3Rpb24pOwotCQlmYXZvcml0ZXNBZGRBY3Rpb24uYWRkRmF2b3JpdGVzQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0KLQkJQXJyYW5nZUZhdm9yaXRlc0FjdGlvbiBmYXZvcml0ZXNBcnJhbmdlQWN0aW9uID0gbmV3IEFycmFuZ2VGYXZvcml0ZXNBY3Rpb24oCi0JCQkJdGhpcy5fd2luZG93LCBmYXZvcml0ZXNNYXApOwotCQlhZGQoZmF2b3JpdGVzQXJyYW5nZUFjdGlvbik7Ci0JCWZhdm9yaXRlc0FycmFuZ2VBY3Rpb24uYWRkRmF2b3JpdGVzQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0KLQkJYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJdXBkYXRlQWxsRmF2b3JpdGVzSXRlbXMoZmF2b3JpdGVzTWFwKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuRmF2b3JpdGVzQ2hhbmdlTGlzdGVuZXIjZmF2b3JpdGVzQ2hhbmdlZChvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLmludGVybmFsLnVpLkZhdm9yaXRlc0NoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZhdm9yaXRlc0NoYW5nZWQoRmF2b3JpdGVzQ2hhbmdlRXZlbnQgZmNlKSB7Ci0JCXVwZGF0ZUFsbEZhdm9yaXRlc0l0ZW1zKGZjZS5nZXRGYXZvcml0ZXNNYXAoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUFsbEZhdm9yaXRlc0l0ZW1zKE1hcDxTdHJpbmcsIFN0cmluZz4gZmF2b3JpdGVzTWFwKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gZmF2b3JpdGVzSXQgPSBmYXZvcml0ZXNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotCQlyZW1vdmVBbGxGYXZvcml0ZXNJdGVtQWN0aW9uKCk7Ci0JCXdoaWxlIChmYXZvcml0ZXNJdC5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgZmF2b3JpdGVzSXQubmV4dCgpOwotCQkJU3RyaW5nIHVybCA9IChTdHJpbmcpIGZhdm9yaXRlc01hcC5nZXQobmFtZSk7Ci0JCQlhZGRGYXZvcml0ZXNJdGVtQWN0aW9uKG5hbWUsIHVybCk7Ci0JCX0KLQotCQlGYXZvcml0ZXNVdGlsLnNhdmVGYXZvcml0ZXNNYXAoZmF2b3JpdGVzTWFwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsRmF2b3JpdGVzSXRlbUFjdGlvbigpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLl9mYXZvcml0ZXNJdGVtSWRMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlyZW1vdmUoKFN0cmluZykgdGhpcy5fZmF2b3JpdGVzSXRlbUlkTGlzdC5nZXQoaSkpOwotCQl9Ci0JCXRoaXMuX2Zhdm9yaXRlc0l0ZW1JZExpc3QuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRmF2b3JpdGVzSXRlbUFjdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHVybCkgewotCQlGYXZvcml0ZXNJdGVtQWN0aW9uIGZhdm9yaXRlc0l0ZW1BY3Rpb24gPSBuZXcgRmF2b3JpdGVzSXRlbUFjdGlvbigKLQkJCQl0aGlzLl93aW5kb3csIG5hbWUsIHVybCwgdXNlRXhpc3RpbmdFZGl0b3IpOwotCQlhZGQoZmF2b3JpdGVzSXRlbUFjdGlvbik7Ci0JCXRoaXMuX2Zhdm9yaXRlc0l0ZW1JZExpc3QuYWRkKEZhdm9yaXRlc0l0ZW1BY3Rpb24uSUQgKyAiXyIgKyBuYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYWN0aW9ucy9Hb0JhY2tBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYWN0aW9ucy9Hb0JhY2tBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlMzMyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2FjdGlvbnMvR29CYWNrQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuSU1vZGVsU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5icm93c2VyLkRlZmF1bHRXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5JV2ViQnJvd3NlckFDVEY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5JV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLnV0aWwuTW9kZWxTZXJ2aWNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS51dGlsLk1vZGVsU2VydmljZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudWkudXRpbC5QbGF0Zm9ybVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci0KLS8qKgotICogQWN0aW9uIHRvIGludm9rZSBnb0JhY2t3YXJkIG1ldGhvZCBvZiB0aGUgY3VycmVudCBhY3RpdmUKLSAqIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0gKi8KLXB1YmxpYyBjbGFzcyBHb0JhY2tBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2UgPSBNb2RlbFNlcnZpY2VNZXNzYWdlcwotCQkJLmdldFN0cmluZygiV2ViQnJvd3Nlci5CYWNrd2FyZF80Iik7Ci0KLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlX3RwID0gTW9kZWxTZXJ2aWNlTWVzc2FnZXMKLQkJCS5nZXRTdHJpbmcoIldlYkJyb3dzZXIuQmFja3dhcmRfNF90cCIpOwotCi0JcHJpdmF0ZSBJV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudExpc3RlbmVyIGRlZmF1bHRMaXN0ZW5lciA9IG5ldyBEZWZhdWx0V2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudExpc3RlbmVyKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBvZiB0aGUgYWN0aW9uIHdpdGggaW1hZ2UgaWNvbi4KLQkgKi8KLQlwdWJsaWMgR29CYWNrQWN0aW9uKCkgewotCQl0aGlzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIG9mIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGZsYWcKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHNldCBpbWFnZSBpY29uIHRvIHRoZSBBY3Rpb24KLQkgKi8KLQlwdWJsaWMgR29CYWNrQWN0aW9uKGJvb2xlYW4gZmxhZykgewotCQlzZXRUZXh0KG1lc3NhZ2UpOwotCQlzZXRUb29sVGlwVGV4dChtZXNzYWdlX3RwKTsKLQkJaWYgKGZsYWcpCi0JCQlzZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSVV0aWwKLQkJCQkJLmdldFNoYXJlZEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0JBQ0spKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUlNb2RlbFNlcnZpY2UgbW9kZWxTZXJ2aWNlID0gTW9kZWxTZXJ2aWNlVXRpbHMuZ2V0QWN0aXZlTW9kZWxTZXJ2aWNlKCk7Ci0JCWlmIChtb2RlbFNlcnZpY2UgIT0gbnVsbCAmJiBtb2RlbFNlcnZpY2UgaW5zdGFuY2VvZiBJV2ViQnJvd3NlckFDVEYpIHsKLQkJCVdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnQgZXZlbnQgPSBuZXcgV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudCgKLQkJCQkJdGhpcywgKChJV2ViQnJvd3NlckFDVEYpIG1vZGVsU2VydmljZSkpOwotCQkJaWYgKElXZWJCcm93c2VyQUNURi5XZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50TGlzdG5lckhvbGRlci5MSVNURU5FUiAhPSBudWxsKSB7Ci0JCQkJSVdlYkJyb3dzZXJBQ1RGLldlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0bmVySG9sZGVyLkxJU1RFTkVSCi0JCQkJCQkuZ29CYWNrKGV2ZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVmYXVsdExpc3RlbmVyLmdvQmFjayhldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2FjdGlvbnMvR29Gb3J3YXJkQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2FjdGlvbnMvR29Gb3J3YXJkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZDVhNzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvci9hY3Rpb25zL0dvRm9yd2FyZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLklNb2RlbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5EZWZhdWx0V2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSVdlYkJyb3dzZXJBQ1RGOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSVdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5icm93c2VyLldlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS51dGlsLk1vZGVsU2VydmljZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkudXRpbC5Nb2RlbFNlcnZpY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnVpLnV0aWwuUGxhdGZvcm1VSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotCi0vKioKLSAqIEFjdGlvbiB0byBpbnZva2UgZ29Gb3J3YXJkIG1ldGhvZCBvZiB0aGUgY3VycmVudCBhY3RpdmUKLSAqIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0gKi8KLXB1YmxpYyBjbGFzcyBHb0ZvcndhcmRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2UgPSBNb2RlbFNlcnZpY2VNZXNzYWdlcwotCQkJLmdldFN0cmluZygiV2ViQnJvd3Nlci5Gb3J3YXJkXzUiKTsKLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlX3RwID0gTW9kZWxTZXJ2aWNlTWVzc2FnZXMKLQkJCS5nZXRTdHJpbmcoIldlYkJyb3dzZXIuRm9yd2FyZF81X3RwIik7Ci0KLQlwcml2YXRlIElXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50TGlzdGVuZXIgZGVmYXVsdExpc3RlbmVyID0gbmV3IERlZmF1bHRXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50TGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIG9mIHRoZSBhY3Rpb24gd2l0aCBpbWFnZSBpY29uLgotCSAqLwotCXB1YmxpYyBHb0ZvcndhcmRBY3Rpb24oKSB7Ci0JCXRoaXModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmxhZwotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgc2V0IGltYWdlIGljb24gdG8gdGhlIEFjdGlvbgotCSAqLwotCXB1YmxpYyBHb0ZvcndhcmRBY3Rpb24oYm9vbGVhbiBmbGFnKSB7Ci0JCXNldFRleHQobWVzc2FnZSk7Ci0JCXNldFRvb2xUaXBUZXh0KG1lc3NhZ2VfdHApOwotCQlpZiAoZmxhZykKLQkJCXNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJVXRpbAotCQkJCQkuZ2V0U2hhcmVkSW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfRk9SV0FSRCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSU1vZGVsU2VydmljZSBtb2RlbFNlcnZpY2UgPSBNb2RlbFNlcnZpY2VVdGlscy5nZXRBY3RpdmVNb2RlbFNlcnZpY2UoKTsKLQkJaWYgKG1vZGVsU2VydmljZSAhPSBudWxsICYmIG1vZGVsU2VydmljZSBpbnN0YW5jZW9mIElXZWJCcm93c2VyQUNURikgewotCQkJV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudCBldmVudCA9IG5ldyBXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50KAotCQkJCQl0aGlzLCAoKElXZWJCcm93c2VyQUNURikgbW9kZWxTZXJ2aWNlKSk7Ci0JCQlpZiAoSVdlYkJyb3dzZXJBQ1RGLldlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0bmVySG9sZGVyLkxJU1RFTkVSICE9IG51bGwpIHsKLQkJCQlJV2ViQnJvd3NlckFDVEYuV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudExpc3RuZXJIb2xkZXIuTElTVEVORVIKLQkJCQkJCS5nb0ZvcndhcmQoZXZlbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlkZWZhdWx0TGlzdGVuZXIuZ29Gb3J3YXJkKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYWN0aW9ucy9SZWZyZXNoQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2FjdGlvbnMvUmVmcmVzaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzI4ZWNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYWN0aW9ucy9SZWZyZXNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwuaW50ZXJuYWwudWkuTW9kZWxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLklNb2RlbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5EZWZhdWx0V2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSVdlYkJyb3dzZXJBQ1RGOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSVdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5icm93c2VyLldlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS51dGlsLk1vZGVsU2VydmljZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkudXRpbC5Nb2RlbFNlcnZpY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotCi0vKioKLSAqIEFjdGlvbiB0byBpbnZva2UgcmVmcmVzaCBtZXRob2Qgb2YgdGhlIGN1cnJlbnQgYWN0aXZlCi0gKiB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGfQotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZSA9IE1vZGVsU2VydmljZU1lc3NhZ2VzCi0JCQkuZ2V0U3RyaW5nKCJXZWJCcm93c2VyLlJlZnJlc2giKTsKLQotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2VfdHAgPSBNb2RlbFNlcnZpY2VNZXNzYWdlcwotCQkJLmdldFN0cmluZygiV2ViQnJvd3Nlci5SZWZyZXNoX3RwIik7Ci0KLQlwcml2YXRlIElXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50TGlzdGVuZXIgZGVmYXVsdExpc3RlbmVyID0gbmV3IERlZmF1bHRXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50TGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIG9mIHRoZSBhY3Rpb24gd2l0aCBpbWFnZSBpY29uLgotCSAqLwotCXB1YmxpYyBSZWZyZXNoQWN0aW9uKCkgewotCQl0aGlzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIG9mIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGZsYWcKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHNldCBpbWFnZSBpY29uIHRvIHRoZSBBY3Rpb24KLQkgKi8KLQlwdWJsaWMgUmVmcmVzaEFjdGlvbihib29sZWFuIGZsYWcpIHsKLQkJc2V0VGV4dChtZXNzYWdlKTsKLQkJc2V0VG9vbFRpcFRleHQobWVzc2FnZV90cCk7Ci0JCWlmIChmbGFnKQotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKE1vZGVsVUlQbHVnaW4KLQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvdG9vbGJhci9yZWxvYWQucG5nIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSU1vZGVsU2VydmljZSBtb2RlbFNlcnZpY2UgPSBNb2RlbFNlcnZpY2VVdGlscy5nZXRBY3RpdmVNb2RlbFNlcnZpY2UoKTsKLQkJaWYgKG1vZGVsU2VydmljZSAhPSBudWxsICYmIG1vZGVsU2VydmljZSBpbnN0YW5jZW9mIElXZWJCcm93c2VyQUNURikgewotCQkJV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudCBldmVudCA9IG5ldyBXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50KAotCQkJCQl0aGlzLCAoKElXZWJCcm93c2VyQUNURikgbW9kZWxTZXJ2aWNlKSk7Ci0JCQlpZiAoSVdlYkJyb3dzZXJBQ1RGLldlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0bmVySG9sZGVyLkxJU1RFTkVSICE9IG51bGwpIHsKLQkJCQlJV2ViQnJvd3NlckFDVEYuV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudExpc3RuZXJIb2xkZXIuTElTVEVORVIKLQkJCQkJCS5yZWZyZXNoKGV2ZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVmYXVsdExpc3RlbmVyLnJlZnJlc2goZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvci9hY3Rpb25zL1N0b3BBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYWN0aW9ucy9TdG9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZDMxMTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvci9hY3Rpb25zL1N0b3BBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5Nb2RlbFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuSU1vZGVsU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5icm93c2VyLkRlZmF1bHRXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5JV2ViQnJvd3NlckFDVEY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5JV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLnV0aWwuTW9kZWxTZXJ2aWNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS51dGlsLk1vZGVsU2VydmljZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci0KLS8qKgotICogQWN0aW9uIHRvIGludm9rZSBzdG9wIG1ldGhvZCBvZiB0aGUgY3VycmVudCBhY3RpdmUge0BsaW5rIElXZWJCcm93c2VyQUNURn0KLSAqLwotcHVibGljIGNsYXNzIFN0b3BBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2UgPSBNb2RlbFNlcnZpY2VNZXNzYWdlcy5nZXRTdHJpbmcoIldlYkJyb3dzZXIuU3RvcCIpOwotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2VfdHAgPSBNb2RlbFNlcnZpY2VNZXNzYWdlcwotCQkJLmdldFN0cmluZygiV2ViQnJvd3Nlci5TdG9wX3RwIik7Ci0KLQlwcml2YXRlIElXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50TGlzdGVuZXIgZGVmYXVsdExpc3RlbmVyID0gbmV3IERlZmF1bHRXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50TGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIG9mIHRoZSBhY3Rpb24gd2l0aCBpbWFnZSBpY29uLgotCSAqLwotCXB1YmxpYyBTdG9wQWN0aW9uKCkgewotCQl0aGlzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIG9mIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGZsYWcKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHNldCBpbWFnZSBpY29uIHRvIHRoZSBBY3Rpb24KLQkgKi8KLQlwdWJsaWMgU3RvcEFjdGlvbihib29sZWFuIGZsYWcpIHsKLQkJc2V0VGV4dChtZXNzYWdlKTsKLQkJc2V0VG9vbFRpcFRleHQobWVzc2FnZV90cCk7Ci0JCWlmIChmbGFnKQotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKE1vZGVsVUlQbHVnaW4KLQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvdG9vbGJhci9zdG9wLnBuZyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUlNb2RlbFNlcnZpY2UgbW9kZWxTZXJ2aWNlID0gTW9kZWxTZXJ2aWNlVXRpbHMuZ2V0QWN0aXZlTW9kZWxTZXJ2aWNlKCk7Ci0JCWlmIChtb2RlbFNlcnZpY2UgIT0gbnVsbCAmJiBtb2RlbFNlcnZpY2UgaW5zdGFuY2VvZiBJV2ViQnJvd3NlckFDVEYpIHsKLQkJCVdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnQgZXZlbnQgPSBuZXcgV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudCgKLQkJCQkJdGhpcywgKChJV2ViQnJvd3NlckFDVEYpIG1vZGVsU2VydmljZSkpOwotCQkJaWYgKElXZWJCcm93c2VyQUNURi5XZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50TGlzdG5lckhvbGRlci5MSVNURU5FUiAhPSBudWxsKSB7Ci0JCQkJSVdlYkJyb3dzZXJBQ1RGLldlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0bmVySG9sZGVyLkxJU1RFTkVSCi0JCQkJCQkuc3RvcChldmVudCk7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRMaXN0ZW5lci5zdG9wKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYWN0aW9ucy9UZXh0U2l6ZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvci9hY3Rpb25zL1RleHRTaXplQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViODk2MGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvci9hY3Rpb25zL1RleHRTaXplQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLklNb2RlbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5JV2ViQnJvd3NlckFDVEY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS51dGlsLk1vZGVsU2VydmljZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotLyoqCi0gKiBBY3Rpb24gdG8gaW52b2tlIHNldEZvbnRTaXplIG1ldGhvZCBvZiB0aGUgY3VycmVudCBhY3RpdmUKLSAqIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0U2l6ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IFRleHRTaXplQWN0aW9uLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgaW50IF9mb250U2l6ZSA9IDI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBvZiB0aGUgYWN0aW9uIHdpdGggaW1hZ2UgaWNvbi4KLQkgKi8KLQlwdWJsaWMgVGV4dFNpemVBY3Rpb24oSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJc3VwZXIoSUQsIEFjdGlvbi5BU19SQURJT19CVVRUT04pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSU1vZGVsU2VydmljZSBtb2RlbFNlcnZpY2UgPSBNb2RlbFNlcnZpY2VVdGlscy5nZXRBY3RpdmVNb2RlbFNlcnZpY2UoKTsKLQkJaWYgKG1vZGVsU2VydmljZSAhPSBudWxsICYmIG1vZGVsU2VydmljZSBpbnN0YW5jZW9mIElXZWJCcm93c2VyQUNURikgewotCQkJKChJV2ViQnJvd3NlckFDVEYpIG1vZGVsU2VydmljZSkuc2V0Rm9udFNpemUodGhpcy5fZm9udFNpemUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRhcmdldCBmb250IHNpemUKLQkgKiAKLQkgKiBAcGFyYW0gZm9udFNpemUKLQkgKiAgICAgICAgICAgIHRhcmdldCBmb250IHNpemUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250U2l6ZShpbnQgZm9udFNpemUpIHsKLQkJdGhpcy5fZm9udFNpemUgPSBmb250U2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGFyZ2V0IGZvbnQgc2l6ZQotCSAqIAotCSAqIEByZXR1cm4gZm9udCBzaXplCi0JICovCi0JcHVibGljIGludCBnZXRGb250U2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuX2ZvbnRTaXplOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYWN0aW9ucy9UZXh0U2l6ZU1lbnUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYWN0aW9ucy9UZXh0U2l6ZU1lbnUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxMzk5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2FjdGlvbnMvVGV4dFNpemVNZW51LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLnV0aWwuTW9kZWxTZXJ2aWNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLS8qKgotICogTWVudU1hbmFnZXIgZm9yIHRleHQgc2l6ZSBjb250cm9sCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0U2l6ZU1lbnUgZXh0ZW5kcyBNZW51TWFuYWdlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNRU5VVEVYVFMgPSB7Ci0JCQlNb2RlbFNlcnZpY2VNZXNzYWdlcy5nZXRTdHJpbmcoIk1lbnVDb25zdC5MYXJnZXN0XzMiKSwKLQkJCU1vZGVsU2VydmljZU1lc3NhZ2VzLmdldFN0cmluZygiTWVudUNvbnN0LkxhcmdlXzQiKSwKLQkJCU1vZGVsU2VydmljZU1lc3NhZ2VzLmdldFN0cmluZygiTWVudUNvbnN0Lk1lZGl1bV81IiksCi0JCQlNb2RlbFNlcnZpY2VNZXNzYWdlcy5nZXRTdHJpbmcoIk1lbnVDb25zdC5TbWFsbF82IiksCi0JCQlNb2RlbFNlcnZpY2VNZXNzYWdlcy5nZXRTdHJpbmcoIk1lbnVDb25zdC5TbWFsbGVzdF83IikgfTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIG9mIHRoZSBjbGFzcwotCSAqIAotCSAqIEBwYXJhbSB3aW5kb3cKLQkgKiAgICAgICAgICAgIHRhcmdldCB7QGxpbmsgSVdvcmtiZW5jaFdpbmRvd30KLQkgKi8KLQlwdWJsaWMgVGV4dFNpemVNZW51KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXN1cGVyKE1vZGVsU2VydmljZU1lc3NhZ2VzLmdldFN0cmluZygiTWVudUNvbnN0LiZGb250XzIiKSk7Ci0KLQkJaW50IG1lbnVOdW0gPSA1OwotCQlUZXh0U2l6ZUFjdGlvbltdIGRpc3BsYXlUZXh0U2l6ZUFjdGlvbiA9IG5ldyBUZXh0U2l6ZUFjdGlvblttZW51TnVtXTsKLQotCQlpbnQgZm9udFNpemUgPSA1OwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbnVOdW07IGkrKykgewotCQkJZGlzcGxheVRleHRTaXplQWN0aW9uW2ldID0gbmV3IFRleHRTaXplQWN0aW9uKHdpbmRvdyk7Ci0JCQlkaXNwbGF5VGV4dFNpemVBY3Rpb25baV0uc2V0VGV4dChNRU5VVEVYVFNbaV0pOwotCQkJYWRkKGRpc3BsYXlUZXh0U2l6ZUFjdGlvbltpXSk7Ci0JCQlmb250U2l6ZS0tOwotCQkJZGlzcGxheVRleHRTaXplQWN0aW9uW2ldLnNldEZvbnRTaXplKGZvbnRTaXplKTsKLQkJCS8vIGlmKGN1cnJGb250U2l6ZSA9PSBmb250U2l6ZSl7Ci0JCQkvLyB9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2Jyb3dzZXIvRGVmYXVsdFdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvci9icm93c2VyL0RlZmF1bHRXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmMzJhYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2Jyb3dzZXIvRGVmYXVsdFdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXI7Ci0KLS8qKgotICogRGVmYXVsdCBldmVudCBoYW5kbGVyIHRvIGRpc3BhdGNoIG5hdmlnYXRpb24gZXZlbnQgdG8gdGhlIGN1cnJlbnQgYWN0aXZlCi0gKiB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGfS4KLSAqIAotICogQHNlZSB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGRXZlbnRMaXN0ZW5lcn0KLSAqIEBzZWUge0BsaW5rIFdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnR9Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0V2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudExpc3RlbmVyIGltcGxlbWVudHMKLQkJSVdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0ZW5lciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSVdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0ZW5lciNnb0JhY2sob3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5XZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGdvQmFjayhXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50IGUpIHsKLQkJSVdlYkJyb3dzZXJBQ1RGIGJyb3dzZXIgPSBlLmdldEJyb3dzZXIoKTsKLQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJYnJvd3Nlci5nb0JhY2t3YXJkKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSVdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0ZW5lciNnb0ZvcndhcmQob3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5XZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGdvRm9yd2FyZChXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50IGUpIHsKLQkJSVdlYkJyb3dzZXJBQ1RGIGJyb3dzZXIgPSBlLmdldEJyb3dzZXIoKTsKLQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJYnJvd3Nlci5nb0ZvcndhcmQoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5JV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudExpc3RlbmVyI3JlZnJlc2gob3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3Nlci5XZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudCBlKSB7Ci0JCUlXZWJCcm93c2VyQUNURiBicm93c2VyID0gZS5nZXRCcm93c2VyKCk7Ci0JCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCWJyb3dzZXIubmF2aWdhdGVSZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuSVdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0ZW5lciNzdG9wKG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXIuV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKFdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnQgZSkgewotCQlJV2ViQnJvd3NlckFDVEYgYnJvd3NlciA9IGUuZ2V0QnJvd3NlcigpOwotCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQlicm93c2VyLm5hdmlnYXRlU3RvcCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2Jyb3dzZXIvSUN1cnJlbnRTdHlsZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYnJvd3Nlci9JQ3VycmVudFN0eWxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTU3NWU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYnJvd3Nlci9JQ3VycmVudFN0eWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBjdXJyZW50IHN0eWxlIGluZm9ybWF0aW9uIG9mIHRoZSBFbGVtZW50Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUN1cnJlbnRTdHlsZXMgewotCi0JLyoqCi0JICogQHJldHVybiBYUGF0aCAoY2hpbGQgcGF0aCBzZXF1ZW5jZSkgb2YgdGhlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFhQYXRoKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRhZyBuYW1lIG9mIHRoZSBlbGVtZW50Ci0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUYWdOYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGdldCB7QGxpbmsgUmVjdGFuZ2xlfSBvZiB0aGUgZWxlbWVudAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBSZWN0YW5nbGUgZ2V0UmVjdGFuZ2xlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgbGluawotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzTGluaygpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgZGVzdGluYXRpb24gVVJMIG9mIHRoZSBsaW5rCi0JICovCi0JcHVibGljIGFic3RyYWN0IFVSTCBnZXRMaW5rVVJMKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJhY2tncm91bmQgY29sb3IKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEJhY2tncm91bmRDb2xvcigpOwotCi0JLyoqCi0JICogQHJldHVybiBiYWNrZ3JvdW5kIHJlcGVhdAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0QmFja2dyb3VuZFJlcGVhdCgpOwotCi0JLyoqCi0JICogQHJldHVybiBmb3JlZ3JvdW5kIGNvbG9yCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRDb2xvcigpOwotCi0JLy8gLyoqCi0JLy8gKiBAcmV0dXJuCi0JLy8gKi8KLQkvLyBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldENzc1RleHQoKTsgLy9zdHlsZQotCS8vCQotCS8vIC8qKgotCS8vICogQHJldHVybgotCS8vICovCi0JLy8gcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRGb250V2VpZ2h0KCk7IC8vc3R5bGUKLQotCS8qKgotCSAqIEByZXR1cm4gZGlzcGxheQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlzcGxheSgpOwotCi0JLyoqCi0JICogQHJldHVybiBmb250IGZhbWlseQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Rm9udEZhbWlseSgpOwotCi0JLyoqCi0JICogQHJldHVybiBmb250IHNpemUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEZvbnRTaXplKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGZvbnQgc3R5bGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEZvbnRTdHlsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBmb250IHZhcmlhbnQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEZvbnRWYXJpYW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGxldHRlciBzcGFjaW5nCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRMZXR0ZXJTcGFjaW5nKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGxpbmUgaGVpZ2h0Ci0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRMaW5lSGVpZ2h0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHBvc2l0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQb3NpdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybiB0ZXh0IGFsaWduCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUZXh0QWxpZ24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGV4dCBkZWNvcmF0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUZXh0RGVjb3JhdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybiB2aXNpYmlsaXR5Ci0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRWaXNpYmlsaXR5KCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2Jyb3dzZXIvSVdlYkJyb3dzZXJBQ1RGLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2Jyb3dzZXIvSVdlYkJyb3dzZXJBQ1RGLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTNiMGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvci9icm93c2VyL0lXZWJCcm93c2VyQUNURi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuSU1vZGVsU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLklNb2RlbFNlcnZpY2VIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHByb3ZpZGUgYWNjZXNzIHRvIG1vZGVsIG9mIHRoZSBXZWIgY29udGVudCBhcyB7QGxpbmsgRG9jdW1lbnR9LgotICogVGhpcyBpbnRlcmZhY2UgZXh0ZW5kcyB7QGxpbmsgSU1vZGVsU2VydmljZX0gdG8gZW5hYmxlIHRvIGNvbnRyb2wgV2ViCi0gKiBCcm93c2VyLgotICogCi0gKiBVc2VycyBjYW4gZ2V0IHRoaXMge0BsaW5rIElNb2RlbFNlcnZpY2V9IHRocm91Z2gge0BsaW5rIElNb2RlbFNlcnZpY2VIb2xkZXJ9Ci0gKiB0aGF0IGlzIGltcGxlbWVudGVkIHdpdGgge0BsaW5rIElFZGl0b3JQYXJ0fS4KLSAqIAotICogQHNlZSBJTW9kZWxTZXJ2aWNlCi0gKiBAc2VlIElNb2RlbFNlcnZpY2VIb2xkZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2ViQnJvd3NlckFDVEYgZXh0ZW5kcyBJTW9kZWxTZXJ2aWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfVU5JTklUSUFMSVpFRCA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX0xPQURJTkcgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9MT0FERUQgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9JTlRFUkFDVElWRSA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX0NPTVBMRVRFID0gNDsKLQotCS8qKgotCSAqIFRvIHNldCB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGRXZlbnRMaXN0ZW5lcn0gdG8gb3ZlcnJpZGUKLQkgKiB7QGxpbmsgRGVmYXVsdFdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0ZW5lcn0KLQkgKi8KLQlwdWJsaWMgY2xhc3MgV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudExpc3RuZXJIb2xkZXIgewotCQlwdWJsaWMgc3RhdGljIElXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50TGlzdGVuZXIgTElTVEVORVIgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEZvY3VzIGFkZHJlc3MgdGV4dCBhcmVhCi0JICogCi0JICogQHBhcmFtIHNlbGVjdEFsbAotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgc2VsZWN0IGFsbCB0ZXh0IGluIHRoZSBhZGRyZXNzIHRleHQgYXJlYQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZvY3VzQWRkcmVzc1RleHQoYm9vbGVhbiBzZWxlY3RBbGwpOwotCi0JLyoqCi0JICogU2hvdy9oaWRlIGFkZHJlc3MgdGV4dCBhcmVhCi0JICogCi0JICogQHBhcmFtIGZsYWcKLQkgKiAgICAgICAgICAgIHRydWUgdG8gc2hvdyBhZGRyZXNzIHRleHQgYXJlYQotCSAqLwotCXZvaWQgc2hvd0FkZHJlc3NUZXh0KGJvb2xlYW4gZmxhZyk7Ci0KLQkvKgotCSAqIGJyb3dzZSBjb21tYW5kcwotCSAqLwotCS8qKgotCSAqIE5hdmlnYXRlIHRvIFVSTAotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIHRhcmdldCBVUkwKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBuYXZpZ2F0ZShTdHJpbmcgdXJsKTsKLQotCS8qKgotCSAqIE5hdmlnYXRlIHRvIGEgYmFja3dhcmQgcGFnZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdvQmFja3dhcmQoKTsKLQotCS8qKgotCSAqIE5hdmlnYXRlIHRvIGEgZm9yd2FyZCBwYWdlCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZ29Gb3J3YXJkKCk7Ci0KLQkvKioKLQkgKiBTdG9wIG5hdmlnYXRpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBuYXZpZ2F0ZVN0b3AoKTsKLQotCS8qKgotCSAqIFJlZnJlc2gKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBuYXZpZ2F0ZVJlZnJlc2goKTsKLQotCS8qCi0JICogbmF2aWdhdGlvbiByZXN1bHQKLQkgKi8KLQotCS8qKgotCSAqIEdldCByZWFkeSBzdGF0ZSBvZiB0aGUgYnJvd3NlcgotCSAqIAotCSAqIEByZXR1cm4gcmVhZHkgc3RhdGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldFJlYWR5U3RhdGUoKTsKLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlIGJyb3dzZXIgaXMgcmVhZHkKLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGJyb3dzZXIgaXMgcmVhZHkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1JlYWR5KCk7Ci0KLQkvKioKLQkgKiBHZXQgY3VycmVudCBsb2NhdGlvbiBuYW1lCi0JICogCi0JICogQHJldHVybiBsb2NhdGlvbiBuYW1lCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRMb2NhdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlIG5hdmlnYXRlZCBVUkwgZXhpc3RzCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBuYXZpZ2F0ZWQgVVJMIGV4aXN0cwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzVXJsRXhpc3RzKCk7Ci0KLQkvKioKLQkgKiBHZXQgbmF2aWdhdGlvbiBlcnJvciBjb2RlCi0JICogCi0JICogQHJldHVybiBlcnJvciBjb2RlCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXROYXZpZ2F0ZUVycm9yQ29kZSgpOwotCi0JLyoKLQkgKiBicm93c2VyIHByb3BlcnR5Ci0JICovCi0JLy8gLyoqIFRPRE8KLQkvLyAqIERpc2FibGUgbGluayBuYXZpZ2F0aW9uCi0JLy8gKiBAcGFyYW0gYlN0b3AgdHJ1ZSB0byBkaXNhYmxlIGxpbmsgbmF2aWdhdGlvbgotCS8vICovCi0JLy8gcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SGxpbmtTdG9wKGJvb2xlYW4gYlN0b3ApOwotCS8qKgotCSAqIFNldCBzaWxlbnQgcHJvcGVydHkKLQkgKiAKLQkgKiBAcGFyYW0gYlNpbGVudAotCSAqICAgICAgICAgICAgc2lsZW50IHByb3BlcnR5Ci0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0V2ViQnJvd3NlclNpbGVudChib29sZWFuIGJTaWxlbnQpOwotCi0JLyoqCi0JICogRGlzYWJsZSBzY3JpcHQgZGVidWdnZXIKLQkgKiAKLQkgKiBAcGFyYW0gYkRpc2FibGUKLQkgKiAgICAgICAgICAgIHRydWUgdG8gZGlzYWJsZSBzY3JpcHQgZGVidWdnZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXREaXNhYmxlU2NyaXB0RGVidWdnZXIoYm9vbGVhbiBiRGlzYWJsZSk7Ci0KLQkvLyAvKiogVE9ETwotCS8vICoKLQkvLyAqIFNldCB0byBzaG93L2hpZGUgaW1hZ2VzIGluIHRoZSBXZWIgcGFnZQotCS8vICogQHBhcmFtIGRpc3BsYXkgdHJ1ZSB0byBzaG93IGltYWdlcwotCS8vICovCi0JLy8gcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RGlzcGxheUltYWdlKGJvb2xlYW4gZGlzcGxheSk7Ci0KLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZSBzY3JpcHQgZGVidWdnZXIgaXMgZGlzYWJsZWQKLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHNjcmlwdCBkZWJ1Z2dlciBpcyBkaXNhYmxlZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRGlzYWJsZVNjcmlwdERlYnVnZ2VyKCk7Ci0KLQkvKgotCSAqIGhpZ2hsaWd0IGVsZW1lbnQKLQkgKiAKLQkgKi8KLQkvKioKLQkgKiBIaWdobGlnaHQgZWxlbWVudCB0aGF0IGhhcyBzcGVjaWZpZWQgSUQKLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRhcmdldCBJRAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGhpZ2hsaWdodEVsZW1lbnRCeUlkKFN0cmluZyBpZCk7Ci0KLQkvKioKLQkgKiBIaWdobGlnaHQgZWxlbWVudHMgdGhhdCBoYXZlIHNwZWNpZmllZCBhdHRyaWJ1dGUvdmFsdWUgc2V0Ci0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRhcmdldCBhdHRyaWJ1dGUgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGFyZ2V0IGF0dHJpYnV0ZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGhpZ2h0bGlnaHRFbGVtZW50QnlBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBDbGVhciBoaWdobGlnaHQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjbGVhckhpZ2hsaWdodCgpOwotCi0JLyoKLQkgKiBmb250IHNpemUsIGNvbG9yLCBldGMuCi0JICogCi0JICovCi0JLyoqCi0JICogU2V0IGZvbnQgc2l6ZQotCSAqIAotCSAqIEBwYXJhbSBmb250U2l6ZQotCSAqICAgICAgICAgICAgZm9udCBzaXplCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Rm9udFNpemUoaW50IGZvbnRTaXplKTsKLQotCS8qKgotCSAqIEdldCBmb250IHNpemUKLQkgKiAKLQkgKiBAcmV0dXJuIGZvbnQgc2l6ZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Rm9udFNpemUoKTsKLQotCS8qKgotCSAqIEdldCBjdXJyZW50IHN0eWxlIGluZm9ybWF0aW9uIG9mIHRoZSBicm93c2VyCi0JICogCi0JICogQHJldHVybiBjdXJyZW50IHN0eWxlIGluZm9ybWF0aW9uCi0JICogQHNlZSBJV2ViQnJvd3NlclN0eWxlSW5mbwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJV2ViQnJvd3NlclN0eWxlSW5mbyBnZXRTdHlsZUluZm8oKTsKLQotCS8qKgotCSAqIEdldCBuYXRpdmUgcG9pbnRlciBvZiB0aGUgYnJvd3Nlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHBvaW50ZXIKLQkgKi8KLQlpbnQgZ2V0QnJvd3NlckFkZHJlc3MoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvci9icm93c2VyL0lXZWJCcm93c2VyQUNURkV2ZW50TGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYnJvd3Nlci9JV2ViQnJvd3NlckFDVEZFdmVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMTI5MTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvci9icm93c2VyL0lXZWJCcm93c2VyQUNURkV2ZW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5icm93c2VyOwotCi0vKioKLSAqIEludGVyZmFjZSB0byBsaXN0ZW4gZXZlbnRzIGZyb20ge0BsaW5rIElXZWJCcm93c2VyQUNURn0KLSAqLwotcHVibGljIGludGVyZmFjZSBJV2ViQnJvd3NlckFDVEZFdmVudExpc3RlbmVyIHsKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgbmF2aWdhdGlvbiB3YXMgY29tcGxldGVkCi0JICogCi0JICogQHBhcmFtIHdlYkJyb3dzZXIKLQkgKiAgICAgICAgICAgIGV2ZW50IHNvdXJjZSB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGfQotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIHRhcmdldCBVUkwKLQkgKi8KLQl2b2lkIG5hdmlnYXRlQ29tcGxldGUoSVdlYkJyb3dzZXJBQ1RGIHdlYkJyb3dzZXIsIFN0cmluZyB1cmwpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHRpdGxlIHdhcyBjaGFuZ2VkCi0JICogCi0JICogQHBhcmFtIHdlYkJyb3dzZXIKLQkgKiAgICAgICAgICAgIGV2ZW50IHNvdXJjZSB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGfQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgbmV3IHRpdGxlCi0JICovCi0Jdm9pZCB0aXRsZUNoYW5nZShJV2ViQnJvd3NlckFDVEYgd2ViQnJvd3NlciwgU3RyaW5nIHRpdGxlKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwcm9ncmVzcyBzdGF0dXMgd2FzIGNoYW5nZWQKLQkgKiAKLQkgKiBAcGFyYW0gd2ViQnJvd3NlcgotCSAqICAgICAgICAgICAgZXZlbnQgc291cmNlIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0JICogQHBhcmFtIHByb2dyZXNzCi0JICogICAgICAgICAgICBjdXJyZW50IHByb2dyZXNzCi0JICogQHBhcmFtIHByb2dyZXNzTWF4Ci0JICogICAgICAgICAgICBnb2FsIHZhbHVlIG9mIHByb2dyZXNzCi0JICovCi0Jdm9pZCBwcm9ncmVzc0NoYW5nZShJV2ViQnJvd3NlckFDVEYgd2ViQnJvd3NlciwgaW50IHByb2dyZXNzLAotCQkJaW50IHByb2dyZXNzTWF4KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBuYXZpZ2F0aW9uIG9mIHJvb3QgZG9jdW1lbnQgd2FzIGNvbXBsZXRlZAotCSAqIAotCSAqIEBwYXJhbSB3ZWJCcm93c2VyCi0JICogICAgICAgICAgICBldmVudCBzb3VyY2Uge0BsaW5rIElXZWJCcm93c2VyQUNURn0KLQkgKi8KLQl2b2lkIHJvb3REb2N1bWVudENvbXBsZXRlKElXZWJCcm93c2VyQUNURiB3ZWJCcm93c2VyKTsKLQotCS8qKgotCSAqIERpc3Bvc2UgdGhlIGluc3RhbmNlCi0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgYnJvd3NlciBnb3QgZm9jdXMKLQkgKiAKLQkgKiBAcGFyYW0gd2ViQnJvd3NlcgotCSAqICAgICAgICAgICAgZXZlbnQgc291cmNlIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0JICovCi0Jdm9pZCBnZXRGb2N1cyhJV2ViQnJvd3NlckFDVEYgd2ViQnJvd3Nlcik7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgYnJvd3NlciBpcyBkaXNwb3NlZAotCSAqIAotCSAqIEBwYXJhbSB3ZWJCcm93c2VyCi0JICogICAgICAgICAgICBldmVudCBzb3VyY2Uge0BsaW5rIElXZWJCcm93c2VyQUNURn0KLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRpdGxlIG9mIHRoZSBjdXJyZW50IHBhZ2UKLQkgKi8KLQl2b2lkIGJyb3dzZXJEaXNwb3NlZChJV2ViQnJvd3NlckFDVEYgd2ViQnJvd3NlciwgU3RyaW5nIHRpdGxlKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIG5hdmlnYXRpb24gc3RhcnQKLQkgKiAKLQkgKiBAcGFyYW0gd2ViQnJvd3NlcgotCSAqICAgICAgICAgICAgZXZlbnQgc291cmNlIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgdGFyZ2V0IFVSTAotCSAqIEBwYXJhbSB0YXJnZXRGcmFtZU5hbWUKLQkgKiAgICAgICAgICAgIHRhcmdldCBmcmFtZSBuYW1lLCBpZiBhdmFpbGFibGUKLQkgKiBAcGFyYW0gaXNJbk5hdmlnYXRpb24KLQkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIG5hdmlnYXRpb24gaXMgY2hpbGQgb2Ygb3RoZXIgbmF2aWdhdGlvbgotCSAqLwotCXZvaWQgYmVmb3JlTmF2aWdhdGUoSVdlYkJyb3dzZXJBQ1RGIHdlYkJyb3dzZXIsIFN0cmluZyB1cmwsCi0JCQlTdHJpbmcgdGFyZ2V0RnJhbWVOYW1lLCBib29sZWFuIGlzSW5OYXZpZ2F0aW9uKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSByZWZyZXNoIHdhcyBzdGFydGVkCi0JICogCi0JICogQHBhcmFtIHdlYkJyb3dzZXIKLQkgKiAgICAgICAgICAgIGV2ZW50IHNvdXJjZSB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGfQotCSAqLwotCXZvaWQgcmVmcmVzaFN0YXJ0KElXZWJCcm93c2VyQUNURiB3ZWJCcm93c2VyKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSByZWZyZXNoIHdhcyBjb21wbGV0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gd2ViQnJvd3NlcgotCSAqICAgICAgICAgICAgZXZlbnQgc291cmNlIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0JICovCi0Jdm9pZCByZWZyZXNoQ29tcGxldGUoSVdlYkJyb3dzZXJBQ1RGIHdlYkJyb3dzZXIpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIG5hdmlnYXRpb24gd2FzIHN0b3BwZWQKLQkgKiAKLQkgKiBAcGFyYW0gd2ViQnJvd3NlcgotCSAqICAgICAgICAgICAgZXZlbnQgc291cmNlIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0JICovCi0Jdm9pZCBuYXZpZ2F0ZVN0b3AoSVdlYkJyb3dzZXJBQ1RGIHdlYkJyb3dzZXIpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIGFkZHJlc3MgYmFyIGFyZWEgb2YgdGhlIGJyb3dzZXIgZ2FpbmVkIHRoZQotCSAqIGZvY3VzCi0JICogCi0JICogQHBhcmFtIHdlYkJyb3dzZXIKLQkgKiAgICAgICAgICAgIGV2ZW50IHNvdXJjZSB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGfQotCSAqLwotCXZvaWQgZm9jdXNHYWluZWRPZkFkZHJlc3NUZXh0KElXZWJCcm93c2VyQUNURiB3ZWJCcm93c2VyKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBhZGRyZXNzIGJhciBhcmVhIG9mIHRoZSBicm93c2VyIGxvc3QgdGhlCi0JICogZm9jdXMKLQkgKiAKLQkgKiBAcGFyYW0gd2ViQnJvd3NlcgotCSAqICAgICAgICAgICAgZXZlbnQgc291cmNlIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0JICovCi0Jdm9pZCBmb2N1c0xvc3RPZkFkZHJlc3NUZXh0KElXZWJCcm93c2VyQUNURiB3ZWJCcm93c2VyKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIElXZWJCcm93c2VyQUNURn0KLQkgKiB3YXMgY3JlYXRlZAotCSAqIAotCSAqIEBwYXJhbSB3ZWJCcm93c2VyCi0JICogICAgICAgICAgICBldmVudCBzb3VyY2Uge0BsaW5rIElXZWJCcm93c2VyQUNURn0KLQkgKi8KLQl2b2lkIG5ld1dpbmRvdyhJV2ViQnJvd3NlckFDVEYgd2ViQnJvd3Nlcik7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2Jyb3dzZXIvSVdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvci9icm93c2VyL0lXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiNTFiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2Jyb3dzZXIvSVdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXI7Ci0KLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gaGFuZGxlIHtAbGluayBXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50fS4KLSAqIAotICogQHNlZSBXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50Ci0gKiBAc2VlIERlZmF1bHRXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50TGlzdGVuZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudExpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHVzZXIgc2VsZWN0cyBnb0JhY2sgbmF2aWdhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBldmVudCBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgdGFyZ2V0IHtAbGluayBJV2ViQnJvd3NlckFDVEZ9IHRvCi0JICogICAgICAgICAgICBoYW5kbGUgdGhpcyBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGdvQmFjayhXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50IGUpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdXNlciBzZWxlY3RzIGdvRm9yd2FyZCBuYXZpZ2F0aW9uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGV2ZW50IGluZm9ybWF0aW9uIGluY2x1ZGluZyB0YXJnZXQge0BsaW5rIElXZWJCcm93c2VyQUNURn0gdG8KLQkgKiAgICAgICAgICAgIGhhbmRsZSB0aGlzIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgZ29Gb3J3YXJkKFdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnQgZSk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB1c2VyIHNlbGVjdHMgcmVmcmVzaCBuYXZpZ2F0aW9uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGV2ZW50IGluZm9ybWF0aW9uIGluY2x1ZGluZyB0YXJnZXQge0BsaW5rIElXZWJCcm93c2VyQUNURn0gdG8KLQkgKiAgICAgICAgICAgIGhhbmRsZSB0aGlzIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50IGUpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdXNlciBzZWxlY3RzIHN0b3AgbmF2aWdhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBldmVudCBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgdGFyZ2V0IHtAbGluayBJV2ViQnJvd3NlckFDVEZ9IHRvCi0JICogICAgICAgICAgICBoYW5kbGUgdGhpcyBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudCBlKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvci9icm93c2VyL0lXZWJCcm93c2VyU3R5bGVJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2Jyb3dzZXIvSVdlYkJyb3dzZXJTdHlsZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MyMDA5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2Jyb3dzZXIvSVdlYkJyb3dzZXJTdHlsZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLk1vZGVsU2VydmljZVNpemVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBzdHlsZSBpbmZvcm1hdGlvbiBvZiBjb250ZW50IGFuZCB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGfQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJCcm93c2VyU3R5bGVJbmZvIHsKLQotCS8qKgotCSAqIEdldCBjdXJyZW50IHN0eWxlIGluZm9ybWF0aW9uIG9mIHRoZSBjb250ZW50IGluIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBNYXAgYmV0d2VlbiBFbGVtZW50cyAoWFBhdGgpIGFuZCBpdCdzIGN1cnJlbnQgc3R5bGVzLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBNYXA8U3RyaW5nLCBJQ3VycmVudFN0eWxlcz4gZ2V0Q3VycmVudFN0eWxlcygpOwotCi0JLyoqCi0JICogR2V0IGN1cnJlbnQgc2l6ZSBpbmZvcm1hdGlvbiBvZiB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGfQotCSAqIAotCSAqIEBwYXJhbSBpc1dob2xlCi0JICogICAgICAgICAgICBpZiB0cnVlIHJldHVybnMgd2hvbGUgcGFnZSBzaXplLCBpZiBmYWxzZSByZXR1cm5zIHZpc2libGUgYXJlYQotCSAqICAgICAgICAgICAgc2l6ZQotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgQnJvd3NlcidzIHNpemUgaW5mb3JtYXRpb24uCi0JICovCi0JcHVibGljIGFic3RyYWN0IE1vZGVsU2VydmljZVNpemVJbmZvIGdldFNpemVJbmZvKGJvb2xlYW4gaXNXaG9sZSk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHVudmlzaXRlZCBsaW5rIGNvbG9yIGluIFJHQiBmb3JtYXQuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB1bnZpc2l0ZWQgbGluayBjb2xvciBpbiBSR0IgZm9ybWF0LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBSR0IgZ2V0VW52aXNpdGVkTGlua0NvbG9yKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZpc2l0ZWQgbGluayBjb2xvciBpbiBSR0IgZm9ybWF0LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmlzaXRlZCBsaW5rIGNvbG9yIGluIFJHQiBmb3JtYXQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFJHQiBnZXRWaXNpdGVkTGlua0NvbG9yKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2Jyb3dzZXIvV2FpdEZvckJyb3dzZXJSZWFkeUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYnJvd3Nlci9XYWl0Rm9yQnJvd3NlclJlYWR5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzg1MTlmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYnJvd3Nlci9XYWl0Rm9yQnJvd3NlclJlYWR5SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnVpLnV0aWwudGltZXIuV2FpdEV4ZWNTeW5jRXZlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byByZWdpc3RlciB7QGxpbmsgUnVubmFibGV9IHRvIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9LiBUaGUKLSAqIHtAbGluayBSdW5uYWJsZX0gd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9IGJlY29tZXMKLSAqIHJlYWR5LgotICovCi1wdWJsaWMgY2xhc3MgV2FpdEZvckJyb3dzZXJSZWFkeUhhbmRsZXIgaW1wbGVtZW50cyBXYWl0RXhlY1N5bmNFdmVudEhhbmRsZXIgewotCXB1YmxpYyBzdGF0aWMgZG91YmxlIElOVEVSVkFMID0gMC41OwotCi0JcHJpdmF0ZSBJV2ViQnJvd3NlckFDVEYgYnJvd3NlcjsKLQotCXByaXZhdGUgUnVubmFibGUgcnVubmFibGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gd2FpdEFjdGl2ZTsKLQotCXByaXZhdGUgZG91YmxlIHRpbWVvdXQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBvZiB0aGUgY2xhc3MKLQkgKiAKLQkgKiBAcGFyYW0gYnJvd3NlcgotCSAqICAgICAgICAgICAgdGFyZ2V0IHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0JICogQHBhcmFtIHRpbWVvdXQKLQkgKiAgICAgICAgICAgIHRpbWVvdXQgdmFsdWUKLQkgKiBAcGFyYW0gd2FpdEFjdGl2ZQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgd2FpdCB7QGxpbmsgU2hlbGx9IGJlY29tZXMgYWN0aXZlCi0JICogQHBhcmFtIHJ1bm5hYmxlCi0JICogICAgICAgICAgICB0YXJnZXQge0BsaW5rIFJ1bm5hYmxlfSB0byBpbnZva2UKLQkgKi8KLQlwdWJsaWMgV2FpdEZvckJyb3dzZXJSZWFkeUhhbmRsZXIoSVdlYkJyb3dzZXJBQ1RGIGJyb3dzZXIsIGRvdWJsZSB0aW1lb3V0LAotCQkJYm9vbGVhbiB3YWl0QWN0aXZlLCBSdW5uYWJsZSBydW5uYWJsZSkgewotCQl0aGlzLmJyb3dzZXIgPSBicm93c2VyOwotCQl0aGlzLnJ1bm5hYmxlID0gcnVubmFibGU7Ci0JCXRoaXMud2FpdEFjdGl2ZSA9IHdhaXRBY3RpdmU7Ci0JCXRoaXMudGltZW91dCA9IHRpbWVvdXQ7Ci0JfQotCi0JcHVibGljIGRvdWJsZSBnZXRJbnRlcnZhbCgpIHsKLQkJcmV0dXJuIElOVEVSVkFMOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJ1bihkb3VibGUgZWxhcHNlZCkgewotCQl0cnkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludCgiWyIgKyBicm93c2VyLmdldFJlYWR5U3RhdGUoKSArICJdIik7Ci0JCQlpZiAoYnJvd3Nlci5pc1JlYWR5KCkgfHwgZWxhcHNlZCA+IHRpbWVvdXQpIHsKLQkJCQlyZXR1cm4gIXdhaXRBY3RpdmUKLQkJCQkJCXx8IG51bGwgIT0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlydW5uYWJsZS5ydW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2Jyb3dzZXIvV2ViQnJvd3NlckV2ZW50VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL2VkaXRvci9icm93c2VyL1dlYkJyb3dzZXJFdmVudFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0YmI2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2Jyb3dzZXIvV2ViQnJvd3NlckV2ZW50VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuZWRpdG9yLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC5pbnRlcm5hbC51aS5Nb2RlbFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gZGlzcGF0Y2ggV2ViIEJyb3dzZXIgZXZlbnQgdG8gcmVnaXN0ZXJlZAotICoge0BsaW5rIElXZWJCcm93c2VyQUNURkV2ZW50TGlzdGVuZXJ9Ci0gKi8KLXB1YmxpYyBjbGFzcyBXZWJCcm93c2VyRXZlbnRVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0xJU1RFTkVSID0gImxpc3RlbmVyIjsKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOwotCi0JcHJpdmF0ZSBzdGF0aWMgV2ViQnJvd3NlckV2ZW50VXRpbFtdIGNhY2hlZEV4dGVuc2lvbnM7Ci0KLQlwcml2YXRlIHN0YXRpYyBXZWJCcm93c2VyRXZlbnRVdGlsW10gZ2V0RXh0ZW5zaW9ucygpIHsKLQkJaWYgKGNhY2hlZEV4dGVuc2lvbnMgIT0gbnVsbCkKLQkJCXJldHVybiBjYWNoZWRFeHRlbnNpb25zOwotCi0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKQotCQkJCS5nZXRFeHRlbnNpb25Qb2ludChNb2RlbFVJUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCSJ3ZWJCcm93c2VyRXZlbnRMaXN0ZW5lciIpLmdldEV4dGVuc2lvbnMoKTsKLQkJTGlzdDxXZWJCcm93c2VyRXZlbnRVdGlsPiBsID0gbmV3IEFycmF5TGlzdDxXZWJCcm93c2VyRXZlbnRVdGlsPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uc1tpXQotCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJV2ViQnJvd3NlckV2ZW50VXRpbCBleCA9IHBhcnNlRXh0ZW5zaW9uKGNvbmZpZ0VsZW1lbnRzW2pdLCBsCi0JCQkJCQkuc2l6ZSgpKTsKLQkJCQlpZiAoZXggIT0gbnVsbCkKLQkJCQkJbC5hZGQoZXgpOwotCQkJfQotCQl9Ci0JCWNhY2hlZEV4dGVuc2lvbnMgPSAoV2ViQnJvd3NlckV2ZW50VXRpbFtdKSBsCi0JCQkJLnRvQXJyYXkobmV3IFdlYkJyb3dzZXJFdmVudFV0aWxbbC5zaXplKCldKTsKLQkJcmV0dXJuIGNhY2hlZEV4dGVuc2lvbnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgV2ViQnJvd3NlckV2ZW50VXRpbCBwYXJzZUV4dGVuc2lvbigKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50LCBpbnQgaWR4KSB7Ci0JCWlmICghY29uZmlnRWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19MSVNURU5FUikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgV2ViQnJvd3NlckV2ZW50VXRpbChjb25maWdFbGVtZW50LCBpZHgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UgYWxsIGV4dGVuc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpc3Bvc2VFeHRlbnNpb25zKCkgewotCQlpZiAoY2FjaGVkRXh0ZW5zaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZEV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWNhY2hlZEV4dGVuc2lvbnNbaV0uZGlzcG9zZSgpOwotCQl9Ci0JCWNhY2hlZEV4dGVuc2lvbnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIERpc3BhdGNoIG5hdmlnYXRlIGNvbXBsZXRlIGV2ZW50Ci0JICogCi0JICogQHBhcmFtIGlXZWJCcm93c2VyCi0JICogICAgICAgICAgICBldmVudCBzb3VyY2Uge0BsaW5rIElXZWJCcm93c2VyQUNURn0KLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICB0YXJnZXQgVVJMCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG5hdmlnYXRlQ29tcGxldGUoSVdlYkJyb3dzZXJBQ1RGIGlXZWJCcm93c2VyLCBTdHJpbmcgdXJsKSB7Ci0JCVdlYkJyb3dzZXJFdmVudFV0aWxbXSBleHMgPSBnZXRFeHRlbnNpb25zKCk7Ci0JCWlmIChleHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHMubGVuZ3RoOyBpKyspIHsKLQkJCWV4c1tpXS5nZXRMaXN0ZW5lcigpLm5hdmlnYXRlQ29tcGxldGUoaVdlYkJyb3dzZXIsIHVybCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBESXNwYXRjaCB0aXRsZSBjaGFuZ2UgZXZlbnQKLQkgKiAKLQkgKiBAcGFyYW0gaVdlYkJyb3dzZXIKLQkgKiAgICAgICAgICAgIGV2ZW50IHNvdXJjZSB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGfQotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgbmV3IHRpdGxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRpdGxlQ2hhbmdlKElXZWJCcm93c2VyQUNURiBpV2ViQnJvd3NlciwgU3RyaW5nIHRpdGxlKSB7Ci0JCVdlYkJyb3dzZXJFdmVudFV0aWxbXSBleHMgPSBnZXRFeHRlbnNpb25zKCk7Ci0JCWlmIChleHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHMubGVuZ3RoOyBpKyspIHsKLQkJCWV4c1tpXS5nZXRMaXN0ZW5lcigpLnRpdGxlQ2hhbmdlKGlXZWJCcm93c2VyLCB0aXRsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwYXRjaCBwcm9ncmVzcyBjaGFuZ2UgZXZlbnQKLQkgKiAKLQkgKiBAcGFyYW0gaVdlYkJyb3dzZXIKLQkgKiAgICAgICAgICAgIGV2ZW50IHNvdXJjZSB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGfQotCSAqIEBwYXJhbSBwcm9ncmVzcwotCSAqICAgICAgICAgICAgY3VycmVudCBwcm9ncmVzcwotCSAqIEBwYXJhbSBwcm9ncmVzc01heAotCSAqICAgICAgICAgICAgZ29hbCB2YWx1ZSBvZiBwcm9ncmVzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcm9ncmVzc0NoYW5nZShJV2ViQnJvd3NlckFDVEYgaVdlYkJyb3dzZXIsCi0JCQlpbnQgcHJvZ3Jlc3MsIGludCBwcm9ncmVzc01heCkgewotCQlXZWJCcm93c2VyRXZlbnRVdGlsW10gZXhzID0gZ2V0RXh0ZW5zaW9ucygpOwotCQlpZiAoZXhzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlleHNbaV0uZ2V0TGlzdGVuZXIoKS5wcm9ncmVzc0NoYW5nZShpV2ViQnJvd3NlciwgcHJvZ3Jlc3MsCi0JCQkJCXByb2dyZXNzTWF4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BhdGNoIHJvb3QgZG9jdW1lbnQgY29tcGxldGUgZXZlbnQKLQkgKiAKLQkgKiBAcGFyYW0gaVdlYkJyb3dzZXIKLQkgKiAgICAgICAgICAgIGV2ZW50IHNvdXJjZSB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByb290RG9jdW1lbnRDb21wbGV0ZShJV2ViQnJvd3NlckFDVEYgaVdlYkJyb3dzZXIpIHsKLQkJV2ViQnJvd3NlckV2ZW50VXRpbFtdIGV4cyA9IGdldEV4dGVuc2lvbnMoKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm15RG9jdW1lbnRDb21wbGV0ZSIpOwotCi0JCWlmIChleHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHMubGVuZ3RoOyBpKyspIHsKLQkJCWV4c1tpXS5nZXRMaXN0ZW5lcigpLnJvb3REb2N1bWVudENvbXBsZXRlKGlXZWJCcm93c2VyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BhdGNoIGdldCBmb2N1cyBldmVudAotCSAqIAotCSAqIEBwYXJhbSBpV2ViQnJvd3NlcgotCSAqICAgICAgICAgICAgZXZlbnQgc291cmNlIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEZvY3VzKElXZWJCcm93c2VyQUNURiBpV2ViQnJvd3NlcikgewotCQlXZWJCcm93c2VyRXZlbnRVdGlsW10gZXhzID0gZ2V0RXh0ZW5zaW9ucygpOwotCQlpZiAoZXhzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlleHNbaV0uZ2V0TGlzdGVuZXIoKS5nZXRGb2N1cyhpV2ViQnJvd3Nlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwYXRjaCBicm93c2VyIGRpc3Bvc2VkIGV2ZW50Ci0JICogCi0JICogQHBhcmFtIGlXZWJCcm93c2VyCi0JICogICAgICAgICAgICBldmVudCBzb3VyY2Uge0BsaW5rIElXZWJCcm93c2VyQUNURn0KLQkgKiBAcGFyYW0gdGl0bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYnJvd3NlckRpc3Bvc2VkKElXZWJCcm93c2VyQUNURiBpV2ViQnJvd3NlciwgU3RyaW5nIHRpdGxlKSB7Ci0JCVdlYkJyb3dzZXJFdmVudFV0aWxbXSBleHMgPSBnZXRFeHRlbnNpb25zKCk7Ci0JCWlmIChleHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHMubGVuZ3RoOyBpKyspIHsKLQkJCWV4c1tpXS5nZXRMaXN0ZW5lcigpLmJyb3dzZXJEaXNwb3NlZChpV2ViQnJvd3NlciwgdGl0bGUpOwotCQl9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2xvc2U6IitpV2ViQnJvd3Nlcik7Ci0JfQotCi0JLyoqCi0JICogRGlzcGF0Y2ggYmVmb3JlIG5hdmlnYXRlIGV2ZW50Ci0JICogCi0JICogQHBhcmFtIGlXZWJCcm93c2VyCi0JICogICAgICAgICAgICBldmVudCBzb3VyY2Uge0BsaW5rIElXZWJCcm93c2VyQUNURn0KLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICB0YXJnZXQgVVJMCi0JICogQHBhcmFtIHRhcmdldEZyYW1lTmFtZQotCSAqICAgICAgICAgICAgdGFyZ2V0IGZyYW1lIG5hbWUsIGlmIGF2YWlsYWJsZQotCSAqIEBwYXJhbSBpc0luTmF2aWdhdGlvbgotCSAqICAgICAgICAgICAgdHJ1ZSwgaWYgdGhlIG5hdmlnYXRpb24gaXMgY2hpbGQgb2Ygb3RoZXIgbmF2aWdhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVOYXZpZ2F0ZShJV2ViQnJvd3NlckFDVEYgaVdlYkJyb3dzZXIsIFN0cmluZyB1cmwsCi0JCQlTdHJpbmcgdGFyZ2V0RnJhbWVOYW1lLCBib29sZWFuIGlzSW5OYXZpZ2F0aW9uKSB7Ci0JCVdlYkJyb3dzZXJFdmVudFV0aWxbXSBleHMgPSBnZXRFeHRlbnNpb25zKCk7Ci0JCWlmIChleHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHMubGVuZ3RoOyBpKyspIHsKLQkJCWV4c1tpXS5nZXRMaXN0ZW5lcigpLmJlZm9yZU5hdmlnYXRlKGlXZWJCcm93c2VyLCB1cmwsCi0JCQkJCXRhcmdldEZyYW1lTmFtZSwgaXNJbk5hdmlnYXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcGF0Y2ggcmVmcmVzaCBldmVudAotCSAqIAotCSAqIEBwYXJhbSB3ZWJCcm93c2VyCi0JICogICAgICAgICAgICBldmVudCBzb3VyY2Uge0BsaW5rIElXZWJCcm93c2VyQUNURn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFN0YXJ0KElXZWJCcm93c2VyQUNURiB3ZWJCcm93c2VyKSB7Ci0JCVdlYkJyb3dzZXJFdmVudFV0aWxbXSBleHMgPSBnZXRFeHRlbnNpb25zKCk7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJteVJlZnJlc2giKTsKLQotCQlpZiAoZXhzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlleHNbaV0uZ2V0TGlzdGVuZXIoKS5yZWZyZXNoU3RhcnQod2ViQnJvd3Nlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwYXRjaCByZWZyZXNoIGNvbXBsZXRlIGV2ZW50Ci0JICogCi0JICogQHBhcmFtIHdlYkJyb3dzZXIKLQkgKiAgICAgICAgICAgIGV2ZW50IHNvdXJjZSB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoQ29tcGxldGUoSVdlYkJyb3dzZXJBQ1RGIHdlYkJyb3dzZXIpIHsKLQkJV2ViQnJvd3NlckV2ZW50VXRpbFtdIGV4cyA9IGdldEV4dGVuc2lvbnMoKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm15UmVmcmVzaENvbXBsZXRlIik7Ci0KLQkJaWYgKGV4cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cy5sZW5ndGg7IGkrKykgewotCQkJZXhzW2ldLmdldExpc3RlbmVyKCkucmVmcmVzaENvbXBsZXRlKHdlYkJyb3dzZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcGF0Y2ggbmF2aWdhdGUgc3RvcCBldmVudAotCSAqIAotCSAqIEBwYXJhbSB3ZWJCcm93c2VyCi0JICogICAgICAgICAgICBldmVudCBzb3VyY2Uge0BsaW5rIElXZWJCcm93c2VyQUNURn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbmF2aWdhdGVTdG9wKElXZWJCcm93c2VyQUNURiB3ZWJCcm93c2VyKSB7Ci0JCVdlYkJyb3dzZXJFdmVudFV0aWxbXSBleHMgPSBnZXRFeHRlbnNpb25zKCk7Ci0JCWlmIChleHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHMubGVuZ3RoOyBpKyspIHsKLQkJCWV4c1tpXS5nZXRMaXN0ZW5lcigpLm5hdmlnYXRlU3RvcCh3ZWJCcm93c2VyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BhdGNoIGV2ZW50IHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIGFkZHJlc3MgYXJlYSBvZiB0aGUgYnJvd3NlciBnYWluZWQKLQkgKiB0aGUgZm9jdXMKLQkgKiAKLQkgKiBAcGFyYW0gd2ViQnJvd3NlcgotCSAqICAgICAgICAgICAgZXZlbnQgc291cmNlIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZvY3VzR2FpbmVkT2ZBZGRyZXNzVGV4dChJV2ViQnJvd3NlckFDVEYgd2ViQnJvd3NlcikgewotCQlXZWJCcm93c2VyRXZlbnRVdGlsW10gZXhzID0gZ2V0RXh0ZW5zaW9ucygpOwotCQlpZiAoZXhzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlleHNbaV0uZ2V0TGlzdGVuZXIoKS5mb2N1c0dhaW5lZE9mQWRkcmVzc1RleHQod2ViQnJvd3Nlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwYXRjaCBldmVudCB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBhZGRyZXNzIGFyZWEgb2YgdGhlIGJyb3dzZXIgbG9zdAotCSAqIHRoZSBmb2N1cwotCSAqIAotCSAqIEBwYXJhbSB3ZWJCcm93c2VyCi0JICogICAgICAgICAgICBldmVudCBzb3VyY2Uge0BsaW5rIElXZWJCcm93c2VyQUNURn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZm9jdXNMb3N0T2ZBZGRyZXNzVGV4dChJV2ViQnJvd3NlckFDVEYgd2ViQnJvd3NlcikgewotCQlXZWJCcm93c2VyRXZlbnRVdGlsW10gZXhzID0gZ2V0RXh0ZW5zaW9ucygpOwotCQlpZiAoZXhzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlleHNbaV0uZ2V0TGlzdGVuZXIoKS5mb2N1c0xvc3RPZkFkZHJlc3NUZXh0KHdlYkJyb3dzZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcGF0Y2ggZXZlbnQgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgbmV3IGluc3RhbmNlIG9mCi0JICoge0BsaW5rIElXZWJCcm93c2VyQUNURn0gd2FzIGNyZWF0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gd2ViQnJvd3NlcgotCSAqICAgICAgICAgICAgZXZlbnQgc291cmNlIHtAbGluayBJV2ViQnJvd3NlckFDVEZ9Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG5ld1dpbmRvdyhJV2ViQnJvd3NlckFDVEYgd2ViQnJvd3NlcikgewotCQlXZWJCcm93c2VyRXZlbnRVdGlsW10gZXhzID0gZ2V0RXh0ZW5zaW9ucygpOwotCQlpZiAoZXhzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlleHNbaV0uZ2V0TGlzdGVuZXIoKS5uZXdXaW5kb3cod2ViQnJvd3Nlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50OwotCXByaXZhdGUgSVdlYkJyb3dzZXJBQ1RGRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXByaXZhdGUgV2ViQnJvd3NlckV2ZW50VXRpbChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgaW50IGlkeCkgewotCQl0aGlzLmNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50OwotCX0KLQotCXByaXZhdGUgSVdlYkJyb3dzZXJBQ1RGRXZlbnRMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQlyZXR1cm4gbGlzdGVuZXI7Ci0JCXRyeSB7Ci0JCQlsaXN0ZW5lciA9IChJV2ViQnJvd3NlckFDVEZFdmVudExpc3RlbmVyKSBjb25maWdFbGVtZW50Ci0JCQkJCS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVFJfQ0xBU1MpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBsaXN0ZW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWxpc3RlbmVyLmRpc3Bvc2UoKTsKLQkJbGlzdGVuZXIgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYnJvd3Nlci9XZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvZWRpdG9yL2Jyb3dzZXIvV2ViQnJvd3Nlck5hdmlnYXRpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjVlNDc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS9lZGl0b3IvYnJvd3Nlci9XZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotLyoqCi0gKiBBIFdlYkJyb3dzZXJOYXZpZ2F0aW9uRXZlbnQgaW5jbHVkZXMgdGFyZ2V0IHtAbGluayBJV2ViQnJvd3NlckFDVEZ9IHRvIGhhbmRsZQotICogdXNlciBuYXZpZ2F0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDY1OTQxOTExOTAxMjAwMzg0MEw7Ci0KLQlwcml2YXRlIElXZWJCcm93c2VyQUNURiBicm93c2VyOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgdGhlIGNsYXNzCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgZXZlbnQgc291cmNlCi0JICogQHBhcmFtIGJyb3dzZXIKLQkgKiAgICAgICAgICAgIHRhcmdldCB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGfQotCSAqLwotCXB1YmxpYyBXZWJCcm93c2VyTmF2aWdhdGlvbkV2ZW50KE9iamVjdCBzb3VyY2UsIElXZWJCcm93c2VyQUNURiBicm93c2VyKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCXRoaXMuYnJvd3NlciA9IGJyb3dzZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRhcmdldCB7QGxpbmsgSVdlYkJyb3dzZXJBQ1RGfQotCSAqIEByZXR1cm4ge0BsaW5rIElXZWJCcm93c2VyQUNURn0KLQkgKi8KLQlwdWJsaWMgSVdlYkJyb3dzZXJBQ1RGIGdldEJyb3dzZXIoKSB7Ci0JCXJldHVybiBicm93c2VyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL3V0aWwvTW9kZWxTZXJ2aWNlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS91dGlsL01vZGVsU2VydmljZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YjFkMjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL3V0aWwvTW9kZWxTZXJ2aWNlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIG9idGFpbiBjb21tb25seSB1c2VkIG1lc3NhZ2VzIGZvciBBQ1RGIE1vZGVsIFNlcnZpY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFNlcnZpY2VNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUKLQkJCS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNb2RlbFNlcnZpY2VNZXNzYWdlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIGZvciB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBvZiB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0YXJnZXQga2V5Ci0JICogCi0JICogQHJldHVybiB0aGUgc3RyaW5nIGZvciB0aGUgZ2l2ZW4ga2V5LCBvciAnIScra2V5KychJyBpZiBub3QgYXZhaWxhYmxlCi0JICogQHNlZSBSZXNvdXJjZUJ1bmRsZSNnZXRTdHJpbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS91dGlsL01vZGVsU2VydmljZVV0aWxzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvdXRpbC9Nb2RlbFNlcnZpY2VVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmUyNTU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi9tb2RlbC91aS91dGlsL01vZGVsU2VydmljZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkuSU1vZGVsU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLklNb2RlbFNlcnZpY2VIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi5tb2RlbC51aS5lZGl0b3IuRHVtbXlFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLmVkaXRvci5icm93c2VyLklXZWJCcm93c2VyQUNURjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnVpLnV0aWwuUGxhdGZvcm1VSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmxvZ2dpbmcuRGVidWdQcmludFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIG1hbmFnZSBBQ1RGIG1vZGVsIHNlcnZpY2VzIChpbXBsZW1lbnRhdGlvbiBvZgotICoge0BsaW5rIElNb2RlbFNlcnZpY2V9KQotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxTZXJ2aWNlVXRpbHMgewotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRWRpdG9yTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTc2MDEyNzA3NzEwNzE2NDExMkw7Ci0KLQl9Ci0KLQkvKioKLQkgKiBGaW5kIGFuZCBsYXVuY2ggYW4gRWRpdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFyZ2V0IFVSTAotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXRVcmwKLQkgKiAgICAgICAgICAgIHRhcmdldCBVUkwKLQkgKiBAcmV0dXJuIHtAbGluayBJRWRpdG9yUGFydH0gaW1wbGVtZW50cyB7QGxpbmsgSU1vZGVsU2VydmljZUhvbGRlcn0sIG9yCi0JICogICAgICAgICBudWxsIGlmIG5vdCBhdmFpbGFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IGxhdW5jaChTdHJpbmcgdGFyZ2V0VXJsKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJVXRpbC5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChhY3RpdmVQYWdlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHRhcmdldFVybCAhPSBudWxsICYmIHRhcmdldFVybC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IGFjdGl2ZVBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IGVkaXRvclJlZnNbaV0uZ2V0UGFydChmYWxzZSk7Ci0JCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJTW9kZWxTZXJ2aWNlSG9sZGVyKSB7Ci0JCQkJCUlNb2RlbFNlcnZpY2UgbW9kZWxTZXJ2aWNlID0gKChJTW9kZWxTZXJ2aWNlSG9sZGVyKSBwYXJ0KQotCQkJCQkJCS5nZXRNb2RlbFNlcnZpY2UoKTsKLQkJCQkJaWYgKHRhcmdldFVybC5lcXVhbHMobW9kZWxTZXJ2aWNlLmdldFVSTCgpKSkgewotCQkJCQkJYWN0aXZlUGFnZS5hY3RpdmF0ZShwYXJ0KTsKLQkJCQkJCS8vIHJlbG9hZD8KLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQl0YXJnZXRVcmwgPSB0YXJnZXRVcmwudHJpbSgpOwotCi0JCQl0cnkgewotCQkJCXJldHVybiAobGF1bmNoKHRhcmdldFVybCwgZ2V0RWRpdG9ySWQodGFyZ2V0VXJsKSkpOwotCQkJfSBjYXRjaCAoRWRpdG9yTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRWRpdG9yIG5vdCBmb3VuZDogIiArIHRhcmdldFVybCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEVkaXRvcklkKFN0cmluZyB0YXJnZXRVcmwpCi0JCQl0aHJvd3MgRWRpdG9yTm90Rm91bmRFeGNlcHRpb24gewotCQkvLyBUT0RPIHN1cHBvcnQgbXVsdGlwbGUgZWRpdG9yLCBkaWFsb2csIHByZWZlcmVuY2UKLQkJSUVkaXRvclJlZ2lzdHJ5IGVkaXRvcnMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCUlFZGl0b3JEZXNjcmlwdG9yIGVkaXRvcjsKLQotCQlpZiAoIXRhcmdldFVybC5zdGFydHNXaXRoKCJodHRwOi8vIikKLQkJCQkmJiAhdGFyZ2V0VXJsLnN0YXJ0c1dpdGgoImh0dHBzOi8vIikpIHsKLQkJCWVkaXRvciA9IGVkaXRvcnMuZ2V0RGVmYXVsdEVkaXRvcih0YXJnZXRVcmwpOwotCQkJaWYgKGVkaXRvciA9PSBudWxsKSB7Ci0JCQkJZWRpdG9yID0gZWRpdG9ycy5nZXREZWZhdWx0RWRpdG9yKCJkZWZhdWx0Lmh0bWwiKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWVkaXRvciA9IGVkaXRvcnMuZ2V0RGVmYXVsdEVkaXRvcigiZGVmYXVsdC5odG1sIik7Ci0KLQkJfQotCQlpZiAoZWRpdG9yID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBFZGl0b3JOb3RGb3VuZEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcmV0dXJuIChlZGl0b3IuZ2V0SWQoKSk7Ci0JfQotCi0JLyoqCi0JICogTGF1bmNoIGFuIEVkaXRvcgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXRVcmwKLQkgKiAgICAgICAgICAgIHRhcmdldCBVUkwKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIElEIG9mIHRhcmdldCBFZGl0b3IKLQkgKiBAcmV0dXJuIHtAbGluayBJRWRpdG9yUGFydH0sIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgbGF1bmNoKFN0cmluZyB0YXJnZXRVcmwsIFN0cmluZyBpZCkgewotCi0JCS8vIFRPRE8gY2hlY2sgY3VycmVudCB1cmwKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUlVdGlsLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGFjdGl2ZVBhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHRhcmdldFVybCAhPSBudWxsKSB7Ci0JCQl0YXJnZXRVcmwgPSB0YXJnZXRVcmwudHJpbSgpOwotCQl9IGVsc2UgewotCQkJdGFyZ2V0VXJsID0gIiI7Ci0JCX0KLQotCQlJRWRpdG9yUGFydCBibGFua0VkaXRvclBhcnQgPSBnZXRCbGFua0Jyb3dzZXJFZGl0b3JQYXJ0KGlkKTsKLQkJaWYgKGJsYW5rRWRpdG9yUGFydCAhPSBudWxsKSB7Ci0JCQlhY3RpdmVQYWdlLmFjdGl2YXRlKGJsYW5rRWRpdG9yUGFydCk7Ci0JCQlpZiAodGFyZ2V0VXJsICE9IG51bGwpIHsKLQkJCQkoKElNb2RlbFNlcnZpY2VIb2xkZXIpIGJsYW5rRWRpdG9yUGFydCkuZ2V0TW9kZWxTZXJ2aWNlKCkub3BlbigKLQkJCQkJCXRhcmdldFVybCk7Ci0JCQkJcmV0dXJuIGJsYW5rRWRpdG9yUGFydDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZzID0gYWN0aXZlUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWRpdG9yUmVmc1tpXS5nZXRJZCgpLmVxdWFscyhpZCkpIHsKLQkJCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IGVkaXRvclJlZnNbaV0uZ2V0UGFydChmYWxzZSk7Ci0JCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSU1vZGVsU2VydmljZUhvbGRlcikgewotCQkJCQkJSU1vZGVsU2VydmljZSBtb2RlbFNlcnZpY2UgPSAoKElNb2RlbFNlcnZpY2VIb2xkZXIpIHBhcnQpCi0JCQkJCQkJCS5nZXRNb2RlbFNlcnZpY2UoKTsKLQkJCQkJCWlmICh0YXJnZXRVcmwuZXF1YWxzKG1vZGVsU2VydmljZS5nZXRVUkwoKSkpIHsKLQkJCQkJCQlhY3RpdmVQYWdlLmFjdGl2YXRlKHBhcnQpOwotCQkJCQkJCXJldHVybiAoSUVkaXRvclBhcnQpIHBhcnQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGVkaXRvck5hbWUgPSAiIjsKLQkJCQlJRWRpdG9yUmVnaXN0cnkgZWRpdG9ycyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQkJCUlFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2MgPSBlZGl0b3JzLmZpbmRFZGl0b3IoaWQpOwotCQkJCWlmIChlZGl0b3JEZXNjICE9IG51bGwpIHsKLQkJCQkJZWRpdG9yTmFtZSA9IGVkaXRvckRlc2MuZ2V0TGFiZWwoKTsKLQkJCQkJcmV0dXJuIGFjdGl2ZVBhZ2Uub3BlbkVkaXRvcihuZXcgRHVtbXlFZGl0b3JJbnB1dCgKLQkJCQkJCQl0YXJnZXRVcmwsIGVkaXRvck5hbWUpLCBpZCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJFZGl0b3Igbm90IGZvdW5kOiAiICsgaWQpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElFZGl0b3JQYXJ0IGdldEJsYW5rQnJvd3NlckVkaXRvclBhcnQoU3RyaW5nIGlkKSB7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JzID0gUGxhdGZvcm1VSVV0aWwuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWRpdG9yc1tpXS5nZXRJZCgpLmVxdWFscyhpZCkpIHsKLQkJCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gZWRpdG9yc1tpXS5nZXRQYXJ0KGZhbHNlKTsKLQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIElNb2RlbFNlcnZpY2VIb2xkZXIpIHsKLQkJCQkJSU1vZGVsU2VydmljZSBtb2RlbFNlcnZpY2UgPSAoKElNb2RlbFNlcnZpY2VIb2xkZXIpIHBhcnQpCi0JCQkJCQkJLmdldE1vZGVsU2VydmljZSgpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obW9kZWxTZXJ2aWNlLmdldFVSTCgpKTsKLQkJCQkJaWYgKG1vZGVsU2VydmljZS5nZXRVUkwoKSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIChJRWRpdG9yUGFydCkgcGFydDsKLQkJCQkJaWYgKG1vZGVsU2VydmljZSBpbnN0YW5jZW9mIElXZWJCcm93c2VyQUNURgotCQkJCQkJCSYmICgiYWJvdXQ6YmxhbmsiLmVxdWFscyhtb2RlbFNlcnZpY2UuZ2V0VVJMKCkpIHx8ICgiIgotCQkJCQkJCQkJLmVxdWFscyhtb2RlbFNlcnZpY2UuZ2V0VVJMKCkpKSkpCi0JCQkJCQlyZXR1cm4gKElFZGl0b3JQYXJ0KSBwYXJ0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUcnkgdG8gb3BlbiB0aGUgdGFyZ2V0IFVSTCBpbiBleGlzdGluZyB7QGxpbmsgSUVkaXRvclBhcnR9LiBJZgotCSAqIGFwcHJvcHJpYXRlIEVkaXRvciBpcyBub3QgYXZhaWxhYmxlLCBsYXVuY2ggbmV3IHtAbGluayBJRWRpdG9yUGFydH0uCi0JICogCi0JICogQHBhcmFtIHRhcmdldFVybAotCSAqICAgICAgICAgICAgdGFyZ2V0IFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuSW5FeGlzdGluZ0VkaXRvcihTdHJpbmcgdGFyZ2V0VXJsKSB7Ci0JCXRhcmdldFVybCA9IHRhcmdldFVybC50cmltKCk7Ci0JCVN0cmluZyBlZGl0b3JJZDsKLQotCQl0cnkgewotCQkJZWRpdG9ySWQgPSBnZXRFZGl0b3JJZCh0YXJnZXRVcmwpOwotCQl9IGNhdGNoIChFZGl0b3JOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVkaXRvciBub3QgZm91bmQ6ICIgKyB0YXJnZXRVcmwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJVXRpbC5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChhY3RpdmVQYWdlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoYWN0aXZhdGVFZGl0b3JQYXJ0KGVkaXRvcklkKSkgewotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gYWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJTW9kZWxTZXJ2aWNlSG9sZGVyKSB7Ci0JCQkJKChJTW9kZWxTZXJ2aWNlSG9sZGVyKSBlZGl0b3IpLmdldE1vZGVsU2VydmljZSgpCi0JCQkJCQkub3Blbih0YXJnZXRVcmwpOwotCQkJfSBlbHNlIHsKLQkJCQlsYXVuY2godGFyZ2V0VXJsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWxhdW5jaCh0YXJnZXRVcmwpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBBY3RpdmF0ZSB7QGxpbmsgSUVkaXRvclBhcnR9Ci0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBJRCBvZiB0YXJnZXQge0BsaW5rIElFZGl0b3JQYXJ0fQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhY3RpdmF0aW9uIGlzIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhY3RpdmF0ZUVkaXRvclBhcnQoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSVV0aWwuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgZWRpdG9yLmdldFNpdGUoKS5nZXRJZCgpLmVxdWFscyhpZCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvcnMgPSBhY3RpdmVQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlZGl0b3JzW2ldLmdldElkKCkpOwotCQkJCWlmIChlZGl0b3JzW2ldLmdldElkKCkuZXF1YWxzKGlkKSkgewotCQkJCQllZGl0b3IgPSBlZGl0b3JzW2ldLmdldEVkaXRvcihmYWxzZSk7Ci0JCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQkJYWN0aXZlUGFnZS5hY3RpdmF0ZShlZGl0b3IpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IHtAbGluayBJTW9kZWxTZXJ2aWNlSG9sZGVyfSBmcm9tIHRoZSBjdXJyZW50IGFjdGl2ZQotCSAqIHtAbGluayBJRWRpdG9yUGFydH0KLQkgKiAKLQkgKiBAcmV0dXJuIGFjdGl2ZSB7QGxpbmsgSU1vZGVsU2VydmljZUhvbGRlcn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNb2RlbFNlcnZpY2VIb2xkZXIgZ2V0QWN0aXZlTW9kZWxTZXJ2aWNlSG9sZGVyKCkgewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJVXRpbC5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJaWYgKGVkaXRvciAhPSBudWxsICYmIGVkaXRvciBpbnN0YW5jZW9mIElNb2RlbFNlcnZpY2VIb2xkZXIpIHsKLQkJCXJldHVybiAoSU1vZGVsU2VydmljZUhvbGRlcikgZWRpdG9yOwotCQl9Ci0KLQkJRGVidWdQcmludFV0aWwuZGV2T3JEZWJ1Z1ByaW50bG4oImVkaXRvcjogIiArIGVkaXRvcgotCQkJCSsgIiBpc24ndCBJTW9kZWxTZXJ2aWNlSG9sZGVyIik7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHtAbGluayBJTW9kZWxTZXJ2aWNlfSBmcm9tIHRoZSBjdXJyZW50IGFjdGl2ZSB7QGxpbmsgSUVkaXRvclBhcnR9Ci0JICogCi0JICogQHJldHVybiBhY3RpdmUge0BsaW5rIElNb2RlbFNlcnZpY2V9Ci0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kZWxTZXJ2aWNlIGdldEFjdGl2ZU1vZGVsU2VydmljZSgpIHsKLQkJSU1vZGVsU2VydmljZUhvbGRlciBob2xkZXIgPSBnZXRBY3RpdmVNb2RlbFNlcnZpY2VIb2xkZXIoKTsKLQkJaWYgKGhvbGRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKGhvbGRlci5nZXRNb2RlbFNlcnZpY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvdXRpbC9TY3JvbGxCYXJTaXplVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpL3NyYy9vcmcvZWNsaXBzZS9hY3RmL21vZGVsL3VpL3V0aWwvU2Nyb2xsQmFyU2l6ZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhOGE0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYubW9kZWwudWkvc3JjL29yZy9lY2xpcHNlL2FjdGYvbW9kZWwvdWkvdXRpbC9TY3JvbGxCYXJTaXplVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLm1vZGVsLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gb2J0YWluIHNjcm9sbCBiYXIgc2l6ZQotICovCi1wdWJsaWMgY2xhc3MgU2Nyb2xsQmFyU2l6ZVV0aWwgewotCXByaXZhdGUgc3RhdGljIGludCBIT1JJWk9OVEFMQkFSX0hFSUdIVCA9IDE1OwotCXByaXZhdGUgc3RhdGljIGludCBWRVJUSUNBTEJBUl9XSURUSCA9IDE1OwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXQoKSB7Ci0JCS8vIHRvIGF2b2lkIHRvIHVzZSBzd3QuaW50ZXJuYWwKLQkJaWYgKCFpc0luaXQpIHsKLQkJCXRyeSB7Ci0JCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQkJaWYgKG51bGwgIT0gZGlzcGxheSkgewotCQkJCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5KTsKLQkJCQkJc2hlbGwuc2V0Qm91bmRzKDAsIDAsIDEsIDEpOwotCQkJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzaGVsbCwgU1dULlZfU0NST0xMCi0JCQkJCQkJfCBTV1QuSF9TQ1JPTEwpOwotCQkJCQkvLyBzaGVsbC5vcGVuKCk7Ci0JCQkJCUhPUklaT05UQUxCQVJfSEVJR0hUID0gY29tcG9zaXRlLmdldEhvcml6b250YWxCYXIoKQotCQkJCQkJCS5nZXRTaXplKCkueTsKLQkJCQkJVkVSVElDQUxCQVJfV0lEVEggPSBjb21wb3NpdGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCkueDsKLQkJCQkJY29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJCQkJc2hlbGwuZGlzcG9zZSgpOwotCi0JCQkJCWlmIChIT1JJWk9OVEFMQkFSX0hFSUdIVCA8IDApIHsKLQkJCQkJCUhPUklaT05UQUxCQVJfSEVJR0hUID0gMTU7Ci0JCQkJCX0KLQkJCQkJaWYgKFZFUlRJQ0FMQkFSX1dJRFRIIDwgMCkgewotCQkJCQkJVkVSVElDQUxCQVJfV0lEVEggPSAxNTsKLQkJCQkJfQotCi0JCQkJCWlzSW5pdCA9IHRydWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBoZWlnaHQgb2YgaG9yaXpvbnRhbCBzY3JvbGwgYmFyCi0JICogCi0JICogQHJldHVybiBoZWlnaHQgb2YgaG9yaXpvbnRhbCBzY3JvbGwgYmFyCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SG9yaXpvbnRhbEJhckhlaWdodCgpIHsKLQkJaW5pdCgpOwotCQlyZXR1cm4gSE9SSVpPTlRBTEJBUl9IRUlHSFQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHdpZHRoIG9mIHZlcnRpY2FsIHNjcm9sbCBiYXIKLQkgKiAKLQkgKiBAcmV0dXJuIHdpZHRoIG9mIHZlcnRpY2FsIHNjcm9sbCBiYXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRWZXJ0aWNhbEJhcldpZHRoKCkgewotCQlpbml0KCk7Ci0JCXJldHVybiBWRVJUSUNBTEJBUl9XSURUSDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MTFlZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eTI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWU5NDE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVjbGlwc2UgQUNURiBIdHRwcHJveHkgUGx1Zy1pbiAoSW5jdWJhdGlvbikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjAucXVhbGlmaWVyCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lCi1FY2xpcHNlLUxhenlTdGFydDogZmFsc2UKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LAotIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZSwKLSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LAotIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbAotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MWRiY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSAKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NWRhMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L0V4dGVybmFsUHJveHlDb25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9FeHRlcm5hbFByb3h5Q29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YmM5YTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L0V4dGVybmFsUHJveHlDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHk7Ci0KLS8qKgotICogRXh0ZXJuYWxQcm94eUNvbmZpZyBpcyBjbGFzcyB0byBjb25maWd1cmUgYW4gZXh0ZXJuYWwgUHJveHkgdGhhdCB1c2VkIGJ5Ci0gKiBJSFRUUFByb3h5LgotICogCi0gKiBAc2VlIElIVFRQUHJveHkKLSAqIEBzZWUgSFRUUFByb3h5RmFjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgRXh0ZXJuYWxQcm94eUNvbmZpZyB7Ci0JcHJpdmF0ZSBib29sZWFuIGV4dGVybmFsUHJveHlGbGFnID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZXh0ZXJuYWxQcm94eUhvc3QgPSAibG9jYWxob3N0IjsKLQlwcml2YXRlIGludCBleHRlcm5hbFByb3h5UG9ydCA9IDgwODA7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBvZiB0aGUgY2xhc3MKLQkgKi8KLQlwdWJsaWMgRXh0ZXJuYWxQcm94eUNvbmZpZygpIHsKLQotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIGFuIGV4dGVybmFsIHByb3h5IGlzIHVzZWQgZm9yIEhUVFBQcm94eQotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBuZWVkIHRvIHVzZSBleHRlcm5hbCBwcm94eS4gRGVmYXVsdCB2YWx1ZSBpcyBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEV4dGVybmFsUHJveHlGbGFnKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxQcm94eUZsYWc7Ci0JfQotCi0JLyoqCi0JICogU2V0IGJvb2xlYW4gdmFsdWUgdG8gc3BlY2lmeSBpZiBIVFRQUHJveHkgbmVlZHMgdG8gdXNlIGFuIGV4dGVybmFsIHByb3h5Ci0JICogCi0JICogQHBhcmFtIGZsYWcKLQkgKiAgICAgICAgICAgIHRydWUgaWYgbmVlZCB0byB1c2UgZXh0ZXJuYWwgcHJveHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbFByb3h5RmxhZyhib29sZWFuIGZsYWcpIHsKLQkJdGhpcy5leHRlcm5hbFByb3h5RmxhZyA9IGZsYWc7Ci0JfQotCi0JLyoqCi0JICogR2V0IGV4dGVybmFsIHByb3h5IGhvc3QgVVJMIGluIFN0cmluZwotCSAqIAotCSAqIEByZXR1cm4gZXh0ZXJuYWwgcHJveHkgaG9zdCBVUkwuIERlZmF1bHQgdmFsdWUgaXMgImxvY2FsaG9zdCIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsUHJveHlIb3N0KCkgewotCQlyZXR1cm4gZXh0ZXJuYWxQcm94eUhvc3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0IGV4dGVybmFsIHByb3h5IHBvcnQgbnVtYmVyCi0JICogCi0JICogQHJldHVybiBleHRlcm5hbCBwcm94eSBwb3J0IG51bWJlci4gRGVmYXVsdCB2YWx1ZSBpcyAiODA4MCIKLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4dGVybmFsUHJveHlQb3J0KCkgewotCQlyZXR1cm4gZXh0ZXJuYWxQcm94eVBvcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IGV4dGVybmFsIHByb3h5IGhvc3QgYW5kIHBvcnQKLQkgKiAKLQkgKiBAcGFyYW0gaG9zdAotCSAqICAgICAgICAgICAgVVJMIG9mIHRhcmdldCBleHRlcm5hbCBwcm94eSBob3N0Ci0JICogQHBhcmFtIHBvcnQKLQkgKiAgICAgICAgICAgIHBvcnQgbnVtYmVyIG9mIHRhcmdldCBleHRlcm5hbCBwcm94eQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsUHJveHkoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB7Ci0JCXRoaXMuZXh0ZXJuYWxQcm94eUhvc3QgPSBob3N0OwotCQl0aGlzLmV4dGVybmFsUHJveHlQb3J0ID0gcG9ydDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9IVFRQUHJveHlGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvSFRUUFByb3h5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGQzYTY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9IVFRQUHJveHlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuSFRUUFByb3h5OwotCi0vKioKLSAqIEZhY3RvcnkgY2xhc3MgZm9yIHtAbGluayBJSFRUUFByb3h5fQotICogCi0gKiBAc2VlIElIVFRQUHJveHkKLSAqIEBzZWUgUHJveHlDb25maWcKLSAqIEBzZWUgRXh0ZXJuYWxQcm94eUNvbmZpZwotICovCi1wdWJsaWMgY2xhc3MgSFRUUFByb3h5RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIElIVFRQUHJveHkuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBmb3IgdGhlIGluc3RhbmNlCi0JICogQHBhcmFtIGV4dGVybmFsUHJveHlDb25maWcKLQkgKiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gb2YgYW4gZXh0ZXJuYWwgUHJveHkgdGhhdCB1c2VkIGJ5IHRoaXMgaW5zdGFuY2UuCi0JICogQHJldHVybiBpbnN0YW5jZSBvZiBIVFRQUHJveHksIG9yIG51bGwgaWYgY29uZmlndXJhdGlvbnMgYXJlIGludmFsaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElIVFRQUHJveHkgbmV3UHJveHkoUHJveHlDb25maWcgY29uZmlnLAotCQkJRXh0ZXJuYWxQcm94eUNvbmZpZyBleHRlcm5hbFByb3h5Q29uZmlnKSB7Ci0JCXRyeSB7Ci0JCQlJSFRUUFByb3h5IHByb3h5ID0gbmV3IEhUVFBQcm94eShjb25maWcsIGV4dGVybmFsUHJveHlDb25maWcpOwotCQkJcmV0dXJuIHByb3h5OwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L0lIVFRQUHJveHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9JSFRUUFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NmI0ZWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L0lIVFRQUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklTZWNyZXRNYW5hZ2VyOwotCi0vKioKLSAqIElIVFRQUHJveHkgaXMgdGhlIGludGVyZmFjZSBmb3IgdGhlIEhUVFAgcHJveHkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhUVFBQcm94eSB7Ci0KLQkvKioKLQkgKiBHZXQgbGlzdGVuIHBvcnQgb2YgdGhlIHByb3h5Ci0JICogCi0JICogQHJldHVybiBsaXN0ZW4gcG9ydAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGlzdGVuUG9ydCgpOwotCi0JLyoqCi0JICogR2V0IHNlY3JldCBTdHJpbmcgdGhhdCBpcyB1c2VkIGZvciBjb25maXJtYXRpb24gb2YgY29ycmVjdCBzZXJ2ZXItY2xpZW50Ci0JICogY29tYmluYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRhcmdldCBrZXkgdG8gb2J0YWluIHRoZSBzZWNyZXQKLQkgKiBAcGFyYW0gcmVtb3ZlCi0JICogICAgICAgICAgICBpZiB0cnVlLCB0aGUgc2VjcmV0IHdpbGwgYmUgcmVtb3ZlZCBhZnRlciBpbnZva2luZyB0aGlzIG1ldGhvZAotCSAqIEByZXR1cm4gc2VjcmV0LCBvciBudWxsIGlmIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIG5vdCBhdmFpbGFibGUgZm9yCi0JICogICAgICAgICB0aGUgdGFyZ2V0IGtleQotCSAqIEBzZWUgSVNlY3JldE1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFNlY3JldChTdHJpbmcgaWQsIGJvb2xlYW4gcmVtb3ZlKTsKLQotCS8qKgotCSAqIFN0YXJ0IHRoZSBwcm94eS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydFRocmVhZCgpOwotCi0JLyoqCi0JICogU3RvcCB0aGUgcHJveHkuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc3RvcFRocmVhZCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L1Byb3h5Q29uZmlnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvUHJveHlDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYxMWM3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvUHJveHlDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQTG9jYWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUExvY2FsU2VydmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQUHJveHlUcmFuc2NvZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBQcm94eVRyYW5zY29kZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBTZXNzaW9uT3ZlcnJpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklTZWNyZXRNYW5hZ2VyOwotCi0vKioKLSAqIFByb3h5Q29uZmlnIGlzIGNsYXNzIHRvIGNvbmZpZ3VyZSBhbiBJSFRUUFByb3h5LgotICogCi0gKiBAc2VlIElIVFRQUHJveHkKLSAqIEBzZWUgSFRUUFByb3h5RmFjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgUHJveHlDb25maWcgewotCXByaXZhdGUgaW50IHBvcnQgPSAwOwotCi0JcHJpdmF0ZSBpbnQgbWF4Q29ubmVjdGlvbiA9IDIwOwotCi0JcHJpdmF0ZSBpbnQgdGltZW91dCA9IDMwMDAwOwotCi0JcHJpdmF0ZSBpbnQga2VlcEFsaXZlSW50ZXJ2YWwgPSAxMDAwOwotCi0JcHJpdmF0ZSBpbnQgbWF4UXVldWVTaXplID0gMTAwOwotCi0JcHJpdmF0ZSBpbnQga2VlcEFsaXZlVGltZW91dFdpdGhvdXRDb250ZW50TGVuZ3RoID0gMTA7Ci0KLQlwcml2YXRlIElIVFRQUHJveHlUcmFuc2NvZGVyRmFjdG9yeSBwcm94eVRyYW5zY29kZXJGYWN0b3J5ID0gbnVsbDsKLQotCXByaXZhdGUgSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeSBzZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeSA9IG51bGw7Ci0KLQlwcml2YXRlIElIVFRQTG9jYWxTZXJ2ZXJGYWN0b3J5IGxvY2FsU2VydmVyRmFjdG9yeSA9IG51bGw7Ci0KLQlwcml2YXRlIElTZWNyZXRNYW5hZ2VyIHNlY3JldE1hbmFnZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgUHJveHlDb25maWcKLQkgKi8KLQlwdWJsaWMgUHJveHlDb25maWcoKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0IHBvcnQgbnVtYmVyIG9mIHByb3h5Ci0JICogCi0JICogQHJldHVybiBwb3J0IG51bWJlcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLQkJcmV0dXJuIHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHBvcnQgbnVtYmVyIGZvciB0aGUgcHJveHkKLQkgKiAKLQkgKiBAcGFyYW0gcG9ydAotCSAqICAgICAgICAgICAgcG9ydCBudW1iZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3J0KGludCBwb3J0KSB7Ci0JCXRoaXMucG9ydCA9IHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG1heGltdW0gY29ubmVjdGlvbiBudW1iZXIgb2YgdGhlIHByb3h5Ci0JICogCi0JICogQHJldHVybiBtYXhpbXVtIGNvbm5lY3Rpb24gbnVtYmVyCi0JICovCi0JcHVibGljIGludCBnZXRNYXhDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gbWF4Q29ubmVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbWF4aW11bSBjb25uZWN0aW9uIG51bWJlciBvZiB0aGUgcHJveHkKLQkgKiAKLQkgKiBAcGFyYW0gbWF4Q29ubmVjdGlvbgotCSAqICAgICAgICAgICAgbWF4aW11bSBjb25uZWN0aW9uIG51bWJlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heENvbm5lY3Rpb24oaW50IG1heENvbm5lY3Rpb24pIHsKLQkJdGhpcy5tYXhDb25uZWN0aW9uID0gbWF4Q29ubmVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGltZSBvdXQgdmFsdWUKLQkgKiAKLQkgKiBAcmV0dXJuIHRpbWUgb3V0IHZhbHVlCi0JICovCi0JcHVibGljIGludCBnZXRUaW1lb3V0KCkgewotCQlyZXR1cm4gdGltZW91dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGltZSBvdXQgdmFsdWUgb2YgdGhlIHByb3h5Ci0JICogCi0JICogQHBhcmFtIHRpbWVvdXQKLQkgKiAgICAgICAgICAgIHRpbWUgb3V0IHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCkgewotCQl0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotCX0KLQotCS8qKgotCSAqIEdldCBrZWVwIGFsaXZlIGludGVydmFsIHZhbHVlCi0JICogCi0JICogQHJldHVybiBrZWVwIGFsaXZlIGludGVydmFsCi0JICovCi0JcHVibGljIGludCBnZXRLZWVwQWxpdmVJbnRlcnZhbCgpIHsKLQkJcmV0dXJuIGtlZXBBbGl2ZUludGVydmFsOwotCX0KLQotCS8qKgotCSAqIEdldCBtYXhpbXVtIHF1ZXVlIHNpemUKLQkgKiAKLQkgKiBAcmV0dXJuIG1heGltdW0gcXVldWUgc2l6ZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4UXVldWVTaXplKCkgewotCQlyZXR1cm4gbWF4UXVldWVTaXplOwotCX0KLQotCS8qKgotCSAqIEdldCBrZWVwIGFsaXZlIGludGVydmFsIHZhbHVlIGZvciBhIGNvbnRlbnQgd2l0aG91dCBjb250ZW50IGxlbmd0aAotCSAqIGluZm9ybWF0aW9uCi0JICogCi0JICogQHJldHVybiBrZWVwIGFsaXZlIGludGVydmFsCi0JICovCi0JcHVibGljIGludCBnZXRLZWVwQWxpdmVUaW1lb3V0V2l0aG91dENvbnRlbnRMZW5ndGgoKSB7Ci0JCXJldHVybiBrZWVwQWxpdmVUaW1lb3V0V2l0aG91dENvbnRlbnRMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogR2V0IEZhY3Rvcnkgb2Yge0BsaW5rIElIVFRQUHJveHlUcmFuc2NvZGVyfSB0aGF0IGlzIHVzZWQgdG8gdHJhbnNjb2RlCi0JICogSFRUUCBSZXNwb25zZSBtZXNzYWdlCi0JICogCi0JICogQHJldHVybiBmYWN0b3J5IG9mIHtAbGluayBJSFRUUFByb3h5VHJhbnNjb2Rlcn0KLQkgKiBAc2VlIElIVFRQUHJveHlUcmFuc2NvZGVyCi0JICovCi0JcHVibGljIElIVFRQUHJveHlUcmFuc2NvZGVyRmFjdG9yeSBnZXRQcm94eVRyYW5zY29kZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gcHJveHlUcmFuc2NvZGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgRmFjdG9yeSBvZiB7QGxpbmsgSUhUVFBQcm94eVRyYW5zY29kZXJ9IHRoYXQgaXMgdXNlZCB0byB0cmFuc2NvZGUKLQkgKiBIVFRQIFJlc3BvbnNlIG1lc3NhZ2UgaW4gdGhlIHByb3h5Ci0JICogCi0JICogQHBhcmFtIHByb3h5VHJhbnNjb2RlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIHRhcmdldCB7QGxpbmsgSUhUVFBQcm94eVRyYW5zY29kZXJGYWN0b3J5fQotCSAqIEBzZWUgSUhUVFBQcm94eVRyYW5zY29kZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm94eVRyYW5zY29kZXJGYWN0b3J5KAotCQkJSUhUVFBQcm94eVRyYW5zY29kZXJGYWN0b3J5IHByb3h5VHJhbnNjb2RlckZhY3RvcnkpIHsKLQkJdGhpcy5wcm94eVRyYW5zY29kZXJGYWN0b3J5ID0gcHJveHlUcmFuc2NvZGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgRmFjdG9yeSBvZiB7QGxpbmsgSUhUVFBTZXNzaW9uT3ZlcnJpZGVyfSB0aGF0IGlzIHVzZWQgdG8gb3ZlcnJpZGUKLQkgKiBIVFRQIFNlc3Npb24gaW4gdGhlIHByb3h5Ci0JICogCi0JICogQHJldHVybiBmYWN0b3J5IG9mIHtAbGluayBJSFRUUFNlc3Npb25PdmVycmlkZXJ9Ci0JICogQHNlZSBJSFRUUFNlc3Npb25PdmVycmlkZXIKLQkgKi8KLQlwdWJsaWMgSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeSBnZXRTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHNlc3Npb25PdmVycmlkZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIFNldCBGYWN0b3J5IG9mIHtAbGluayBJSFRUUFNlc3Npb25PdmVycmlkZXJ9IHRoYXQgaXMgdXNlZCB0byBvdmVycmlkZQotCSAqIEhUVFAgU2Vzc2lvbiBpbiB0aGUgcHJveHkKLQkgKiAKLQkgKiBAcGFyYW0gc2Vzc2lvbk92ZXJyaWRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIHRhcmdldCB7QGxpbmsgSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeX0KLQkgKiBAc2VlIElIVFRQU2Vzc2lvbk92ZXJyaWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlc3Npb25PdmVycmlkZXJGYWN0b3J5KAotCQkJSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeSBzZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeSkgewotCQl0aGlzLnNlc3Npb25PdmVycmlkZXJGYWN0b3J5ID0gc2Vzc2lvbk92ZXJyaWRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogR2V0IEZhY3Rvcnkgb2Yge0BsaW5rIElIVFRQTG9jYWxTZXJ2ZXJ9IHRoYXQgZW5hYmxlcyB0byByZXR1cm4gSFRUUAotCSAqIFJlc3BvbnNlIGZvciBzcGVjaWZpZWQgcmVxdWVzdCBkaXJlY3RseSBmcm9tIHRoZSBwcm94eS4KLQkgKiAKLQkgKiBAcmV0dXJuIGZhY3Rvcnkgb2Yge0BsaW5rIElIVFRQTG9jYWxTZXJ2ZXJ9Ci0JICogQHNlZSBJSFRUUExvY2FsU2VydmVyCi0JICovCi0JcHVibGljIElIVFRQTG9jYWxTZXJ2ZXJGYWN0b3J5IGdldExvY2FsU2VydmVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGxvY2FsU2VydmVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgRmFjdG9yeSBvZiB7QGxpbmsgSUhUVFBMb2NhbFNlcnZlcn0gdGhhdCBlbmFibGVzIHRvIHJldHVybiBIVFRQCi0JICogUmVzcG9uc2UgZm9yIHNwZWNpZmllZCByZXF1ZXN0IGRpcmVjdGx5IGZyb20gdGhlIHByb3h5LgotCSAqIAotCSAqIEBwYXJhbSBsb2NhbFNlcnZlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIHRhcmdldCB7QGxpbmsgSUhUVFBMb2NhbFNlcnZlckZhY3Rvcnl9Ci0JICogQHNlZSBJSFRUUExvY2FsU2VydmVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYWxTZXJ2ZXJGYWN0b3J5KElIVFRQTG9jYWxTZXJ2ZXJGYWN0b3J5IGxvY2FsU2VydmVyRmFjdG9yeSkgewotCQl0aGlzLmxvY2FsU2VydmVyRmFjdG9yeSA9IGxvY2FsU2VydmVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQge0BsaW5rIElTZWNyZXRNYW5hZ2VyfSB0aGF0IGlzIHVzZWQgZm9yIGNvbmZpcm1hdGlvbiBvZiBjb3JyZWN0Ci0JICogc2VydmVyLWNsaWVudCBjb21iaW5hdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHNlY3JldCBtYW5hZ2VyCi0JICovCi0JcHVibGljIElTZWNyZXRNYW5hZ2VyIGdldFNlY3JldE1hbmFnZXIoKSB7Ci0JCXJldHVybiBzZWNyZXRNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFNldCB7QGxpbmsgSVNlY3JldE1hbmFnZXJ9IHRoYXQgaXMgdXNlZCBmb3IgY29uZmlybWF0aW9uIG9mIGNvcnJlY3QKLQkgKiBzZXJ2ZXItY2xpZW50IGNvbWJpbmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzZWNyZXRNYW5hZ2VyCi0JICogICAgICAgICAgICB0YXJnZXQgc2VjcmV0IG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWNyZXRNYW5hZ2VyKElTZWNyZXRNYW5hZ2VyIHNlY3JldE1hbmFnZXIpIHsKLQkJdGhpcy5zZWNyZXRNYW5hZ2VyID0gc2VjcmV0TWFuYWdlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lCdWZmZXJSYW5nZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUJ1ZmZlclJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MWFkZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUJ1ZmZlclJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGtlZXBpbmcgc3RhcnQgcG9zaXRpb24gYW5kIGxlbmd0aCBvZiB0YXJnZXQgY29udGVudAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCdWZmZXJSYW5nZSB7Ci0KLQkvKioKLQkgKiBSZXNldCBzdGFydCBwb3NpdGlvbiBhbmQgbGVuZ3RoIHRvIHplcm8uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVzZXQoKTsKLQotCS8qKgotCSAqIFNldCBzdGFydCBwb3NpdGlvbiBvZiB0aGUgdGFyZ2V0IGNvbnRlbnQgaW4gdGhlIGJ1ZmZlci4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHN0YXJ0IHBvc2l0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U3RhcnQoaW50IHN0YXJ0KTsKLQotCS8qKgotCSAqIFNldCBsZW5ndGggb2YgdGhlIHRhcmdldCBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIGxlbmd0aAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIEdldCBzdGFydCBwb3NpdGlvbiBvZiB0aGUgdGFyZ2V0IGNvbnRlbnQgaW4gYnVmZmVyLgotCSAqIAotCSAqIEByZXR1cm4gc3RhcnQgcG9zaXRpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBHZXQgbGVuZ3RoIG9mIHRoZSB0YXJnZXQgY29udGVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGxlbmd0aAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TGVuZ3RoKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JQ2xpZW50Q29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUNsaWVudENvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViNzJkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JQ2xpZW50Q29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlkZWtpIFRBSSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlLlNlcnZlckNvbm5lY3Rpb247Ci0KLS8qKgotICogQSBjb25uZWN0aW9uIHdpdGggY2xpZW50LiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2xpZW50Q29ubmVjdGlvbiB7Ci0KLQkvKioKLQkgKiBSZXNldCB0aGUgY29ubmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZXNldENvbm5lY3Rpb24oKTsKLQotCS8qKgotCSAqIENsb3NlIHRoZSBjb25uZWN0aW9uLgotCSAqIEByZXR1cm4gbmFtZSBvZiB0aGlzIGNvbm5lY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGRlYnVnIG1lc3NhZ2VzCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBjbG9zZSgpOwotCi0JLyoqCi0JICogR2V0IGEgc29ja2V0IG9iamVjdCBmb3IgY29ubmVjdGluZyB3aXRoIHRoZSBjbGllbnQuCi0JICogQHJldHVybiBhIFNvY2tldCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU29ja2V0IGdldENsaWVudFNvY2tldCgpOwotCi0JLyoqCi0JICogR2V0cyBpbmRleCBvZiB0aGUgY3VycmVudCBzZXJ2ZXIgZ3JvdXAuCi0JICogQHJldHVybiBpbmRleCBvZiB0aGUgY3VycmVudCBzZXJ2ZXIgZ3JvdXAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldEN1cnJlbnRTZXJ2ZXJHcm91cEluZGV4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjb25uZWN0aW9uIGlzIGhhbmRsaW5nIGEgcmVxdWVzdCBidXQgYSByZXNwb25zZSBpcyBub3Qgc2VudCB5ZXQuCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgY29ubmVjdGlvbiBpcyBoYW5kbGluZyBhIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0hhbmRsaW5nUmVxdWVzdCgpOwotCi0JLyoqCi0JICogU2VuZCBhIEhUVFAgcmVzcG9uc2UgbWVzc2FnZSB0byB0aGUgY2xpZW50LgotCSAqIEBwYXJhbSB0aW1lb3V0IE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGUgcmVzcG9uc2UgaXMgc2VudCB0byB0aGUgY2xpZW50LCBvciAwIGlmIGl0IGRvZXMgbm90IG5lZWQgdG8gdGltZW91dCAKLQkgKiBAcGFyYW0gcmVzcG9uc2UgYSBIVFRQIHJlc3BvbnNlIG1lc3NhZ2UKLQkgKiBAcGFyYW0gcmVhZHlUb0hhbmRsZVJlcXVlc3QgdHJ1ZSBpZiAiaGFuZGxpbmdSZXF1ZXN0IiBzdGF0dXMgbmVlZHMgdG8gYmUgc2V0IHRvIGZhbHNlIGFmdGVyIHRoZSByZXNwb25zZSBpcyBzZW50IHN1Y2Nlc3NmdWxseQotCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGlmIGl0IGZhaWxlZCB0byBzZW5kIHRoZSByZXNwb25zZSB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lCi0JICogQHNlZSAjaXNIYW5kbGluZ1JlcXVlc3QoKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlbmRSZXNwb25zZShsb25nIHRpbWVvdXQsCi0JCQlJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSwgYm9vbGVhbiByZWFkeVRvSGFuZGxlUmVxdWVzdCkKLQkJCXRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZW5kIGEgSFRUUCByZXNwb25zZSBtZXNzYWdlIHRvIHRoZSBjbGllbnQuCi0JICogVGhlICJpc0hhbmRsaW5nUmVxdWVzdCIgc3RhdHVzIHdpbGwgYmUgc2V0IHRvIGZhbHNlIGFmdGVyIHRoZSByZXNwb25zZSBpcyBzZW50IHN1Y2Nlc3NmdWxseS4KLQkgKiBAcGFyYW0gdGltZW91dCBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlIHJlc3BvbnNlIGlzIHNlbnQgdG8gdGhlIGNsaWVudCwgb3IgMCBpZiBpdCBkb2VzIG5vdCBuZWVkIHRvIHRpbWVvdXQgCi0JICogQHBhcmFtIHJlc3BvbnNlIGEgSFRUUCByZXNwb25zZSBtZXNzYWdlCi0JICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24gaWYgaXQgZmFpbGVkIHRvIHNlbmQgdGhlIHJlc3BvbnNlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUKLQkgKiBAc2VlICNpc0hhbmRsaW5nUmVxdWVzdCgpCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2VuZFJlc3BvbnNlKGxvbmcgdGltZW91dCwgSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UpCi0JCQl0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uOyAKLQotCS8qKgotCSAqIFNlbmQgYSBIVFRQIHJlc3BvbnNlIG1lc3NhZ2UgdG8gdGhlIGNsaWVudC4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGJsb2NrZWQgdW50aWwgaXQgc2VuZHMgdGhlIHJlc3BvbnNlIChubyB0aW1lb3V0KS4KLQkgKiBUaGUgImlzSGFuZGxlUmVxdWVzdCIgc3RhdHVzIHdpbGwgYmUgc2V0IHRvIGZhbHNlIGFmdGVyIHRoZSByZXNwb25zZSBpcyBzZW50IHN1Y2Nlc3NmdWxseS4KLQkgKiBAcGFyYW0gcmVzcG9uc2UgYSBIVFRQIHJlc3BvbnNlIG1lc3NhZ2UKLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEBzZWUgI2lzSGFuZGxpbmdSZXF1ZXN0KCkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZW5kUmVzcG9uc2UoSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UpCi0JCQl0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQWxsb3cgdG8gZXN0YWJsaXNoIHR1bm5lbCBmb3IgY29ubmVjdCByZXF1ZXN0Ci0JICogQHBhcmFtIHJlcQotCSAqIEBwYXJhbSBzYwotCSAqIEBwYXJhbSB0aW1lb3V0Ci0JICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhbGxvd1R1bm5lbChJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcSwKLQkJCVNlcnZlckNvbm5lY3Rpb24gc2MsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLAotCQkJVGltZW91dEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZWplY3QgdG8gZXN0YWJsaXNoIHR1bm5lbCBmb3IgY29ubmVjdCByZXF1ZXN0Ci0JICogQHBhcmFtIHJlcQotCSAqIEBwYXJhbSB0aW1lb3V0Ci0JICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWplY3RUdW5uZWwoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXEsIGxvbmcgdGltZW91dCkKLQkJCXRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDb250aW51b3VzbHkgcmVhZCByZXF1ZXN0cyBmcm9tIHRoZSBjbGllbnQgYW5kIHB1dCB0aGVtIGludG8gdGhlIHNlbmQKLQkgKiBxdWV1ZSBvZiB0aGUgZGlzcGF0Y2hlci4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBydW4oKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lIVFRQSGVhZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JSFRUUEhlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWVjYjBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lIVFRQSGVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIEhUVFAgaGVhZGVyIGluZm9ybWF0aW9uIG9mIGEgSFRUUCByZXF1ZXN0L3JlcXVlc3QgbWVzc2FnZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSFRUUEhlYWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfT1BUSU9OUyA9ICJPUFRJT05TIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfR0VUID0gIkdFVCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0hFQUQgPSAiSEVBRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1BPU1QgPSAiUE9TVCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1BVVCA9ICJQVVQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9ERUxFVEUgPSAiREVMRVRFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfVFJBQ0UgPSAiVFJBQ0UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9DT05ORUNUID0gIkNPTk5FQ1QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VQVCA9ICJBY2NlcHQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VQVF9DSEFSU0VUID0gIkFjY2VwdC1DaGFyc2V0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFUFRfTEFOR1VBR0UgPSAiQWNjZXB0LUxhbmd1YWdlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFUFRfRU5DT0RJTkcgPSAiQWNjZXB0LUVuY29kaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBR0UgPSAiQWdlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExPVyA9ICJBbGxvdyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVpBVElPTiA9ICJBdXRob3JpemF0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9DT05UUk9MID0gIkNhY2hlLUNvbnRyb2wiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT04gPSAiQ29ubmVjdGlvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9FTkNPRElORyA9ICJDb250ZW50LUVuY29kaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0xBTkdVQUdFID0gIkNvbnRlbnQtTGFuZ3VhZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTEVOR1RIID0gIkNvbnRlbnQtTGVuZ3RoIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX01ENSA9ICJDb250ZW50LU1ENSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9SQU5HRSA9ICJDb250ZW50LVJhbmdlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAiQ29udGVudC1UeXBlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFID0gIkRhdGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVCA9ICJFeHBlY3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUElSRVMgPSAiRXhwaXJlcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJPTSA9ICJGcm9tIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUID0gIkhvc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElGX01PRElGSUVEX1NJTkNFID0gIklmLU1vZGlmaWVkLVNpbmNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRl9VTk1PRElGSUVEX1NJTkNFID0gIklmLVVubW9kaWZpZWQtU2luY2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfTU9ESUZJRUQgPSAiTGFzdC1Nb2RpZmllZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT04gPSAiTG9jYXRpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9GT1JXQVJEUyA9ICJNYXgtRm9yd2FyZHMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSQUdNQSA9ICJQcmFnbWEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0NPTk5FQ1RJT04gPSAiUHJveHktQ29ubmVjdGlvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOR0UgPSAiUmFuZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRVIgPSAiUmVmZXJlciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUUllfQUZURVIgPSAiUmV0cnktQWZ0ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUiA9ICJTZXJ2ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIFNFUlZFUl9BID0gU0VSVkVSLmdldEJ5dGVzKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNGRVJfRU5DT0RJTkcgPSAiVHJhbnNmZXItRW5jb2RpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVQR1JBREUgPSAiVXBncmFkZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9BR0VOVCA9ICJVc2VyLUFnZW50IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBVU0VSX0FHRU5UX0EgPSBVU0VSX0FHRU5ULmdldEJ5dGVzKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSWSA9ICJWYXJ5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUEgPSAiVmlhIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXV1dfQVVUSEVOVElDQVRFID0gIldXVy1BdXRoZW50aWNhdGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfVkVSU0lPTl8xXzAgPSAiSFRUUC8xLjAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIEhUVFBfVkVSU0lPTl8xXzBfQSA9IEhUVFBfVkVSU0lPTl8xXzAuZ2V0Qnl0ZXMoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1ZFUlNJT05fMV8xID0gIkhUVFAvMS4xIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBIVFRQX1ZFUlNJT05fMV8xX0EgPSBIVFRQX1ZFUlNJT05fMV8xLmdldEJ5dGVzKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVNQT1NJVElPTiA9ICJDb250ZW50LURpc3Bvc2l0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT09LSUUgPSAiQ29va2llIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfQ09PS0lFID0gIlNldC1Db29raWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIENPTlRFTlRfTEVOR1RIX0EgPSBDT05URU5UX0xFTkdUSC5nZXRCeXRlcygpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIFRSQU5TRkVSX0VOQ09ESU5HX0EgPSBUUkFOU0ZFUl9FTkNPRElORwotCQkJLmdldEJ5dGVzKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gQ0hVTktFRF9BID0gImNodW5rZWQiLmdldEJ5dGVzKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gSE9TVF9BID0gSE9TVC5nZXRCeXRlcygpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIFBST1hZX0NPTk5FQ1RJT05fQSA9IFBST1hZX0NPTk5FQ1RJT04uZ2V0Qnl0ZXMoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT05URU5UX1RZUEVfQSA9IENPTlRFTlRfVFlQRS5nZXRCeXRlcygpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIENPTk5FQ1RJT05fQSA9IENPTk5FQ1RJT04uZ2V0Qnl0ZXMoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBDQUNIRV9DT05UUk9MX0EgPSBDQUNIRV9DT05UUk9MLmdldEJ5dGVzKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gRVhQSVJFU19BID0gRVhQSVJFUy5nZXRCeXRlcygpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIFBSQUdNQV9BID0gUFJBR01BLmdldEJ5dGVzKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gUkVGRVJFUl9BID0gUkVGRVJFUi5nZXRCeXRlcygpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIElGX01PRElGSUVEX1NJTkNFX0EgPSBJRl9NT0RJRklFRF9TSU5DRQotCQkJLmdldEJ5dGVzKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gQUNDRVBUX0VOQ09ESU5HX0EgPSBBQ0NFUFRfRU5DT0RJTkcuZ2V0Qnl0ZXMoKTsKLQotCS8qKgotCSAqIE1hcmtzIHdoZXRoZXIgdGhpcyBoZWFkZXIgZW50cnkgaXMgcmVtb3ZlZCBvciBub3QuCi0JICogVGhlIHJlbW92ZWQgaGVhZGVyIGVudHJ5IHdpbGwgbm90IGJlIHdyaXR0ZW4gYnkge0BsaW5rICN3cml0ZUxpbmUoT3V0cHV0U3RyZWFtKX0uCi0JICogQHBhcmFtIHJlbW92ZWQgdHJ1ZSB3aGVuIHRvIG1hcmsgcmVtb3ZlZCwgZmFsc2UgaWYgbm90LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFJlbW92ZWQoYm9vbGVhbiByZW1vdmVkKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGhlYWRlciBlbnRyeSBpcyBtYXJrZWQgYXMgcmVtb3ZlZC4KLQkgKiBUaGUgcmVtb3ZlZCBoZWFkZXIgZW50cnkgd2lsbCBub3QgYmUgd3JpdHRlbiBieSB7QGxpbmsgI3dyaXRlTGluZShPdXRwdXRTdHJlYW0pfS4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBoZWFkZXIgZW50cnkgaXMgbWFya2VkIGFzIHJlbW92ZWQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1JlbW92ZWQoKTsKLQotCS8qKgotCSAqIENvbXBhcmVzIGZpZWxkIG5hbWUuCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbGVkIG5hbWUgZXF1YWxzIHRvIHRoZSBzcGVjaWZpZWQgbmFtZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRmllbGROYW1lRXF1YWxzVG8oYnl0ZVtdIG5hbWUpOwotCi0JLyoqCi0JICogQ29tcGFyZXMgZmllbGQgdmFsdWUuCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWVsZCB2YWx1ZSBlcXVhbHMgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRmllbGRWYWx1ZUVxdWFsc1RvKGJ5dGVbXSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXQgbmFtZSBvZiB0aGlzIGhlYWRlci4gCi0JICogQHJldHVybiBuYW1lIG9mIHRoaXMgaGVhZGVyIGFzIGFuIGFycmF5IG9mIGJ5dGVzCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJ5dGVbXSBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBHZXQgdmFsdWUgb2YgdGhpcyBoZWFkZXIuCi0JICogQHJldHVybiB2YWx1ZSBvZiB0aGlzIGhlYWRlciBhcyBhbiBhcnJheSBvZiBieXRlcwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldCB2YWx1ZSBvZiB0aGlzIGhlYWRlci4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRWYWx1ZShieXRlW10gdmFsdWUpOwotCi0JLyoqCi0JICogQ29tcGFyZXMgdmFsdWUgb2YgdGhpcyBoZWFkZXIuCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGhlYWRlciBlcXVhbHMgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbXBhcmVWYWx1ZShieXRlW10gdmFsdWUpOwotCi0JLyoqCi0JICogQ29tcGFyZXMgdmFsdWUgb2YgdGhpcyBoZWFkZXIgaWdub3JpbmcgY2FzZS4gCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGhlYWRlciBlcXVhbHMgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSAoY2FzZSBpZ25vcmVkKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbXBhcmVWYWx1ZUlnbm9yZUNhc2UoYnl0ZVtdIHZhbHVlKTsKLQotCS8qKgotCSAqIFdyaXRlcyBhbiBIVFRQIGhlYWRlciBsaW5lIGZvciB0aGlzIGVudHJ5LgotCSAqIE5vdGhpbmcgd2lsbCBiZSB3cml0dGVuIGlmIHRoZSByZW1vdmVkIGZsYWcgaXMgc2V0IHRvIHRydWUuCi0JICogQHBhcmFtIG91dAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUxpbmUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUhUVFBNZXNzYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JSFRUUE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5YWRlZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JSFRUUE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBBIEhUVFAgcmVxdWVzdC9yZXNwb25zZSBtZXNzYWdlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIVFRQTWVzc2FnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUX05VTV9IRUFERVJTID0gNTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFID0gMTAyNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ1IgPSAweDBkOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBMRiA9IDB4MGE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFNQID0gMHgyMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSFQgPSAweDA5OwotCi0JcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0U2VyaWFsKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB2YWx1ZSBvZiBIVFRQIHZlcnNpb24gYXMgYSBTdHJpbmcuCi0JICogQHJldHVybiBIVFRQIHZlcnNpb24gb2YgdGhpcyBIVFRQIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEhUVFBWZXJzaW9uQXNTdHJpbmcoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHZhbHVlIG9mIEhUVFAgdmVyc2lvbiBhcyBhbiBhcnJheSBvZiBieXRlcy4KLQkgKiBAcmV0dXJuIEhUVFAgdmVyc2lvbiBvZiB0aGlzIEhUVFAgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0SFRUUFZlcnNpb25Bc0J5dGVzKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBib2R5IG9mIHRoaXMgSFRUUCBtZXNzYWdlLgotCSAqIEByZXR1cm4gYm9keSBvZiB0aGlzIEhUVFAgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJTWVzc2FnZUJvZHkgZ2V0TWVzc2FnZUJvZHkoKTsKLQotCS8qKgotCSAqIEdldHMgYWxsIEhUVFAgaGVhZGVycyBkZWZpbmVkIGluIHRoaXMgSFRUUCBtZXNzYWdlLgotCSAqIEByZXR1cm4gbGlzdCBvZiBIVFRQIGhlYWRlciBvYmplY3RzCi0JICovCi0JcHVibGljIGFic3RyYWN0IExpc3Q8SUhUVFBIZWFkZXI+IGdldEhlYWRlcnMoKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgYSBIVFRQIGhlYWRlciBvZiB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogQHBhcmFtIG5hbWUgbmFtZSBvZiBhIEhUVFAgaGVhZGVyCi0JICogQHJldHVybiB0aGUgcmVtb3ZlZCBIVFRQIGhlYWRlciwgb3IgbnVsbCBpZiBubyBzdWNoIEhUVFAgaGVhZGVyIHdhcyBkZWZpbmVkCi0JICovCi0JcHVibGljIGFic3RyYWN0IElIVFRQSGVhZGVyIHJlbW92ZUhlYWRlcihieXRlW10gbmFtZSk7Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHZhbHVlIG9mIGEgSFRUUCBoZWFkZXIsIG9yIGEgSFRUUCBoZWFkZXIgaXMgYWRkZWQgaWYgbm8gSFRUUCBoZWFkZXIgb2YgdGhlIHNwZWNpZmllZCBuYW1lIGlzIGRlZmluZWQuIAotCSAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgSFRUUCBoZWFkZXIKLQkgKiBAcGFyYW0gdmFsdWUgdmFsdWUgb2YgSFRUUCBoZWFkZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRIZWFkZXIoYnl0ZVtdIG5hbWUsIGJ5dGVbXSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBBZGRzIGEgSFRUUCB0cmFpbGluZyBoZWFkZXIuCi0JICogQHBhcmFtIHRyYWlsZXIgYSBIVFRQIHRyYWlsaW5nIGhlYWRlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZFRyYWlsaW5nSGVhZGVyKElIVFRQSGVhZGVyIHRyYWlsZXIpOwotCi0JLyoqCi0JICogR2V0cyBhIEhUVFAgaGVhZGVyIG9mIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIGEgSFRUUCBoZWFkZXIgCi0JICogQHJldHVybiBIVFRQIGhlYWRlciBvZiB0aGUgc3BlY2lmaWVkIG5hbWUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUhUVFBIZWFkZXIgZ2V0SGVhZGVyKGJ5dGVbXSBuYW1lKTsKLQotCS8qKgotCSAqIEdldHMgdmFsdWUgb2YgYSBIVFRQIGhlYWRlciBhcyBhbiBhcnJheSBvZiBieXRlcy4KLQkgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIGEgSFRUUCBoZWFkZXIKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHRoZSBIVFRQIGhlYWRlciBhcyBhbiBhcnJheSBvZiBieXRlcwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0SGVhZGVyQXNCeXRlcyhieXRlW10gbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGVuY29kaW5nIG9mIHRoaXMgbWVzc2FnZSBpcyBjaHVua2VkIG9yIG5vdC4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVuY29kaW5nIG9mIHRoaXMgbWVzc2FnZSBpcyBjaHVua2VkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ2h1bmtlZEVuY29kaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgdGhpcyBtZXNzYWdlIGlzIGluIGNodW5rZWQgZW5jb2RpbmcuCi0JICogQHBhcmFtIGlzQ2h1bmtlZCB3aGV0aGVyIHRoaXMgbWVzc2FnZSBpcyBpbiBjaHVua2VkIGVuY29kaW5nCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q2h1bmtlZEVuY29kaW5nKGJvb2xlYW4gaXNDaHVua2VkKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIFRJRCBmb3IgdGhpcyBtZXNzYWdlLiBUSUQgaXMgdW5pcXVlIGxvbmcgdmFsdWUgYXNzaWduZWQgdG8gZWFjaCBIVFRQIHJlcXVlc3QuCi0JICogQHBhcmFtIHRpZCBUSUQgYXMgYSBsb25nIHZhbHVlCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGlkKGxvbmcgdGlkKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIFRJRCBhc3NpZ25lZCB0byB0aGlzIG1lc3NhZ2UuCi0JICogQHJldHVybiBUSUQgYXMgYSBsb25nIHZhbHVlCi0JICovCi0JcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0VGlkKCk7Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgYm9keSB0byB0aGUgc3BlY2lmaWVkIG91dHB1dCBzdHJlYW0uCi0JICogQHBhcmFtIHRpbWVvdXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZSB3cml0ZSBvcGVyYXRpb24gaXMgZG9uZSwgb3IgMCBpZiBpdCBkb2VzIG5vdCBuZWVkIHRvIHRpbWVvdXQgCi0JICogQHBhcmFtIG1zZ0JvZHkgbWVzc2FnZSBib2R5IHRvIGJlIHdyaXR0ZW4KLQkgKiBAcGFyYW0gb3V0IGFuIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdGhlIG1lc3NhZ2UgYm9keSBpcyB3cml0dGVuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiBpZiBpdCBmYWlsZWQgdG8gd3JpdGUgdGhlIG1lc3NhZ2UgYm9keSB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVCb2R5KGxvbmcgdGltZW91dCwgSU1lc3NhZ2VCb2R5IG1zZ0JvZHksCi0JCQlPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhpcyBtZXNzYWdlIChoZWFkZXJzIGFuZCBtZXNzYWdlIGJvZHkpIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHN0cmVhbS4KLQkgKiBAcGFyYW0gdGltZW91dCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlIHdyaXRlIG9wZXJhdGlvbiBpcyBkb25lLCBvciAwIGlmIGl0IGRvZXMgbm90IG5lZWQgdG8gdGltZW91dAotCSAqIEBwYXJhbSBvdXQgYW4gb3V0cHV0IHN0cmVhbSB0byB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgd3JpdHRlbiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIGlmIGl0IGZhaWxlZCB0byB3cml0ZSB0aGlzIG1lc3NhZ2Ugd2l0aGluIHRoZSBzcGVjaWZpZWQgdGltZSAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZShsb25nIHRpbWVvdXQsIE91dHB1dFN0cmVhbSBvdXQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEhUVFAgcHJvdG9jb2wgdmVyc2lvbiBvZiB0aGlzIG1lc3NhZ2UgaXMgMS4xIG9yIG5vdC4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEhUVFAgcHJvdG9jb2wgdmVyc2lvbiBvZiB0aGlzIG1lc3NhZ2UgaXMgMS4xCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNIVFRQVmVyc2lvbjFfMSgpOwotCi0JLyoqCi0JICogU2V0cyAiQ29ubmVjdGlvbiIgSFRUUCBoZWFkZXIgZm9yIHRoaXMgbWVzc2FnZS4gCi0JICogQHBhcmFtIGtlZXBhbGl2ZSB0cnVlIHRvIHNldCB0aGUgdmFsdWUgb2YgIkNvbm5lY3Rpb24iIGhlYWRlciB0byAiS2VlcC1BbGl2ZSIsIGZhbHNlIHRvIHNldCB0aGUgdmFsdWUgb2YgIkNvbm5lY3Rpb24gaGVhZGVyIHRvICJjbG9zZSIgIAotCSAqIEBzZWUgSUhUVFBIZWFkZXIjQ09OTkVDVElPTgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENvbm5lY3Rpb25IZWFkZXIoYm9vbGVhbiBrZWVwYWxpdmUpOwotCi0JLyoqCi0JICogVGVsbHMgdGhhdCB0aGUgY29ubmVjdGlvbiBmb3IgZXhjaGFuZ2luZyB0aGlzIG1lc3NhZ2UgbmVlZHMgdG8gYmUgY2xvc2VkIG9yIG5vdC4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gbmVlZHMgdG8gYmUgY2xvc2VkLCBvciBmYWxzZSBpZiBpdCBjYW4gYmUgcmV1c2VkIGZvciB0aGUgZm9sbG93aW5nIG1lc3NhZ2VzCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb25uZWN0aW9uVG9CZUNsb3NlZCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUhUVFBSZXF1ZXN0TWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvSUhUVFBSZXF1ZXN0TWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzllYWZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lIVFRQUmVxdWVzdE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlOwotCi0KLS8qKgotICogQSBIVFRQIHJlcXVlc3QgbWVzc2FnZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSFRUUFJlcXVlc3RNZXNzYWdlIGV4dGVuZHMgSUhUVFBNZXNzYWdlIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIEhUVFAgbWV0aG9kIGZpZWxkIG9mIHRoaXMgcmVxdWVzdCBtZXNzYWdlLgotCSAqIEByZXR1cm4gYnVmZmVyIHJhbmdlIHRoYXQgaW5kaWNhdGVzIHRoZSBIVFRQIG1ldGhvZCBmaWVsZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJQnVmZmVyUmFuZ2UgZ2V0TWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBIVFRQIG1ldGhvZCBmaWVsZCBvZiB0aGlzIHJlcXVlc3QgbWVzc2FnZS4KLQkgKiBAcmV0dXJuIHZhbHVlIG9mIEhUVFAgbWV0aG9kIGZpZWxkIGFzIGFuIGFycmF5IG9mIGJ5dGVzIAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0TWV0aG9kQXNCeXRlcygpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgSFRUUCBtZXRob2QgZmllbGQgb2YgdGhpcyByZXF1ZXN0IG1lc3NhZ2UuCi0JICogQHJldHVybiB2YWx1ZSBvZiBIVFRQIG1ldGhvZCBmaWVsZCBhcyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TWV0aG9kQXNTdHJpbmcoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHJlcXVlc3QgVVJJIGZpZWxkIG9mIHRoaXMgcmVxdWVzdCBtZXNzYWdlLgotCSAqIEByZXR1cm4gYnVmZmVyIHJhbmdlIHRoYXQgaW5kaWNhdGVzIHRoZSBSZXF1ZXN0IFVSSSBmaWVsZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJQnVmZmVyUmFuZ2UgZ2V0UmVxdWVzdFVSSSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVxdWVzdCBVUkkgZmllbGQgb2YgdGhpcyByZXF1ZXN0IG1lc3NhZ2UuCi0JICogQHBhcmFtIG5ld1JlcXVlc3RVUkkgcmVxdWVzdCBVUkkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSZXF1ZXN0VVJJU3RyaW5nKFN0cmluZyBuZXdSZXF1ZXN0VVJJKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIG9yaWdpbmFsIHJlcXVlc3QgVVJJIGZpZWxkIG9mIHRoaXMgcmVxdWVzdCBtZXNzYWdlLgotCSAqIEByZXR1cm4gdmFsdWUgb2Ygb3JpZ2luYWwgcmVxdWVzdCBVUkkgZmllbGQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE9yaWdpbmFsUmVxdWVzdFVSSVN0cmluZygpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVxdWVzdCBVUkkgZmllbGQgb2YgdGhpcyByZXF1ZXN0IG1lc3NhZ2UuCi0JICogQHJldHVybiB2YWx1ZSBvZiByZXF1ZXN0IFVSSSBmaWVsZCBhcyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UmVxdWVzdFVSSVN0cmluZygpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgSFRUUCB2ZXJzaW9uIGZpZWxkIG9mIHRoaXMgcmVxdWVzdCBtZXNzYWdlLgotCSAqIEByZXR1cm4gYnVmZmVyIHJhbmdlIHRoYXQgaW5kaWNhdGVzIHRoZSBIVFRQIHZlcnNpb24gZmllbGQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUJ1ZmZlclJhbmdlIGdldEhUVFBWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBDb21wYXJlcyB0aGUgbWV0aG9kIGZpZWxkIG9mIHRoaXMgcmVxdWVzdCBtZXNzYWdlIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBAcGFyYW0gbWV0aG9kIHZhbHVlIHRvIGNvbXBhcmUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1ldGhvZCBmaWVsZCBpcyBlcXVhbHMgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc01ldGhvZEVxdWFsc1RvKGJ5dGVbXSBtZXRob2QpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBib2R5IG9mIHRoaXMgcmVxdWVzdCBtZXNzYWdlIGlzIGVtcHR5IG9yIG5vdC4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJvZHkgb2YgdGhpcyByZXF1ZXN0IG1lc3NhZ2UgaXMgZW1wdHksIG9yIGZhbHNlIGlmIGl0IGlzIG5vdCBlbXB0eQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUmVzcG9uc2VCb2R5RW1wdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29ubmVjdGlvbiBmb3IgZXhjaGFuZ2luZyB0aGlzIHJlcXVlc3QgbWVzc2FnZSBuZWVkcyB0byBiZSBzaHV0ZG93biBvciBub3QuIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBuZWVkcyB0byBiZSBzaHV0ZG93bgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQ29ubmVjdGlvblNodXRkb3duUmVxdWlyZWQoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lIVFRQUmVzcG9uc2VNZXNzYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JSFRUUFJlc3BvbnNlTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzljMDU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lIVFRQUmVzcG9uc2VNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmU7Ci0KLS8qKgotICogQSBIVFRQIHJlc3BvbnNlIG1lc3NhZ2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhUVFBSZXNwb25zZU1lc3NhZ2UgZXh0ZW5kcyBJSFRUUE1lc3NhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gRU1QVFlfQk9EWSA9IG5ldyBieXRlWzBdOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc3RhdHVzIGNvZGUgb2YgdGhpcyByZXNwb25zZSBtZXNzYWdlLgotCSAqIEByZXR1cm4gc3RhdHVzIGNvZGUgYXMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXR1c0NvZGVBc1N0cmluZygpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc3RhdHVzIGNvZGUgb2YgdGhpcyByZXNwb25zZSBtZXNzYWdlLgotCSAqIEByZXR1cm4gc3RhdHVzIGNvZGUgYXMgYW4gYXJyYXkgb2YgYnl0ZXMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldFN0YXR1c0NvZGVBc0J5dGVzKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWFzb24gcGhyYXNlIG9mIHRoaXMgcmVzcG9uc2UgbWVzc2FnZS4KLQkgKiBAcmV0dXJuIHJlYXNvbiBwaHJhc2UgYXMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFJlYXNvblBocmFzZUFzU3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWFzb24gcGhyYXNlIG9mIHRoaXMgcmVzcG9uc2UgbWVzc2FnZS4KLQkgKiBAcmV0dXJuIHJlYXNvbiBwaHJhc2UgYXMgYW4gYXJyYXkgb2YgYnl0ZXMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIGdldFJlYXNvblBocmFzZUFzQnl0ZXMoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3YzU4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoaW4gU0FJVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtOwotCi0KLS8qKgotICogQSBIVFRQIHJlc3BvbnNlIG1lc3NhZ2Ugd2hpY2ggY2FuIHByb3ZpZGUge0BsaW5rIElQdXNoYmFja01lc3NhZ2VCb2R5fS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlIGV4dGVuZHMgSUhUVFBSZXNwb25zZU1lc3NhZ2V7Ci0KLQkvKioKLQkgKiBSZWFkcyB0aGUgYm9keSBvZiB0aGlzIG1lc3NhZ2UgYW5kIHJldHVybnMgaXQgYXMgYW4gYXJyYXkgb2YgYnl0ZXMuCi0JICogTm90ZSB0aGF0IHRoZSBtZXNzYWdlIGJvZHkgY2Fubm90IGJlIHJlYWQgbGF0ZXIgaWYgZmFsc2UgaXMgc3BlY2lmaWVkIGZvciAncHVzaGJhY2snIHBhcmFtZXRlciBvciBpZgotCSAqIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogQHBhcmFtIHRpbWVvdXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB1bnRpbCB3aGVuIHRoZSBtZXNzYWdlIGJvZHkgaXMgcmVhZCwgb3IgMCBpZiBpdCBkb2VzIG5vdCBuZWVkIHRvIHRpbWVvdXQKLQkgKiBAcGFyYW0gcHVzaGJhY2sgdHJ1ZSBpZiB0aGUgcmVhZCBieXRlcyBuZWVkIHRvIGJlIHB1c2hlZCBiYWNrIHRvIHRoZSBpbnB1dCBzdHJlYW0KLQkgKiBAcmV0dXJuIGJvZHkgb2YgdGhpcyBtZXNzYWdlIGFzIGFuIGFycmF5IG9mIGJ5dGVzCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbgotCSAqLwotCS8vIENhdXRpb24hISEhIFdpdGhvdXQgcHVzaGJhY2sgb3B0aW9uLCBib2R5IHdpbGwgYmUgaW52YWxpZGF0ZWQuCi0JcHVibGljIGFic3RyYWN0IGJ5dGVbXSByZWFkQm9keShsb25nIHRpbWVvdXQsIGJvb2xlYW4gcHVzaGJhY2spCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIG1lc3NhZ2UgYm9keSB0aGF0IGNhbiBwcm92aWRlIHtAbGluayBQdXNoYmFja0lucHV0U3RyZWFtfSBmb3IgcmVhZGluZyB0aGUgYm9keS4KLQkgKiBAcmV0dXJuIGEgbWVzc2FnZSBib2R5IHRoYXQgY2FuIHByb3ZpZGUge0BsaW5rIFB1c2hiYWNrSW5wdXRTdHJlYW19IGZvciByZWFkaW5nIHRoZSBib2R5LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJUHVzaGJhY2tNZXNzYWdlQm9keSBnZXRQdXNoYmFja01lc3NhZ2VCb2R5KCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JTWVzc2FnZUJvZHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lNZXNzYWdlQm9keS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2RkNzJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lNZXNzYWdlQm9keS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBCb2R5IG9mIGEgSFRUUCByZXF1ZXN0L3Jlc3BvbnNlIG1lc3NhZ2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1lc3NhZ2VCb2R5IHsKLQotCS8qKgotCSAqIFJldHVybnMgY29udGVudCBsZW5ndGggb2YgdGhpcyBtZXNzYWdlIGJvZHkuIElmIG5vIGNvbnRlbnQgbGVuZ3RoIGlzCi0JICogc3BlY2lmaWVkIG9yIGl0IGlzIGNodW5rZWQgZW5jb2RpbmcsIC0xIGlzIHJldHVybmVkLgotCSAqIAotCSAqIEByZXR1cm4gY29udGVudCBsZW5ndGgsIG9yIC0xIGlmIG5vIGNvbnRlbnQgbGVuZ3RoIGlzIHNwZWNpZmllZC4KLQkgKi8JCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRDb250ZW50TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGVuY29kaW5nIG9mIHRoaXMgbWVzc2FnZSBib2R5IGlzIGNodW5rZWQgZW5jb2RpbmcuCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBlbmNvZGluZyBvZiB0aGlzIG1lc3NhZ2UgYm9keSBpcyBjaHVua2VkIGVuY29kaW5nCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDaHVua2VkRW5jb2RpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5wdXQgc3RyZWFtIGZvciB0aGlzIG1lc3NhZ2UgYm9keSB3aG9zZSByZWFkIG1ldGhvZHMgCi0JICoga2VlcCByZXRyeWluZyB0byByZWFkIGV2ZW4gd2hlbiBTb2NrZXRUaW1lb3V0RXhjZXB0aW9ucyBhcmUgdGhyb3duLiAgCi0JICogQHJldHVybiBpbnB1dCBzdHJlYW0gZm9yIHRoaXMgbWVzc2FnZSBib2R5Ci0JICovCi0JcHVibGljIGFic3RyYWN0IElucHV0U3RyZWFtIGdldE1lc3NhZ2VCb2R5VGltZW91dElucHV0U3RyZWFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGlucHV0IHN0cmVhbSBmb3IgdGhpcyBtZXNzYWdlIGJvZHkuCi0JICogQHJldHVybiBpbnB1dCBzdHJlYW0gZm9yIHRoaXMgbWVzc2FnZSBib2R5Ci0JICovCi0JcHVibGljIGFic3RyYWN0IElucHV0U3RyZWFtIGdldE1lc3NhZ2VCb2R5SW5wdXRTdHJlYW0oKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lQdXNoYmFja01lc3NhZ2VCb2R5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvY29yZS9JUHVzaGJhY2tNZXNzYWdlQm9keS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGRkMTM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL0lQdXNoYmFja01lc3NhZ2VCb2R5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIFNoaW4gU0FJVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW07Ci0KLS8qKgotICogQm9keSBvZiBhIEhUVFAgcmVxdWVzdC9yZXNwb25zZSBtZXNzYWdlIHdoaWNoIGNhbiBwcm92aWRlIHtAbGluayBQdXNoYmFja0lucHV0U3RyZWFtfS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUHVzaGJhY2tNZXNzYWdlQm9keSBleHRlbmRzIElNZXNzYWdlQm9keSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEge0BsaW5rIFB1c2hiYWNrSW5wdXRTdHJlYW19IGZvciB0aGlzIG1lc3NhZ2UgYm9keS4KLQkgKiBAcmV0dXJuIGEge0BsaW5rIFB1c2hiYWNrSW5wdXRTdHJlYW19IGZvciB0aGlzIG1lc3NhZ2UgYm9keS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgUHVzaGJhY2tJbnB1dFN0cmVhbSBnZXRNZXNzYWdlQm9keVB1c2hCYWNrSW5wdXRTdHJlYW0oKTsKLQkvLyBDYXV0aW9uISEhISBXaXRob3V0IHB1c2hiYWNrIG9wdGlvbiwgYm9keSB3aWxsIGJlIGludmFsaWRhdGVkLgotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvVGltZW91dEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L2NvcmUvVGltZW91dEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2NlZDk0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9jb3JlL1RpbWVvdXRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlkZWtpIFRBSSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZTsKLQotLyoqCi0gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gKGUuZy4gcmVhZCBhbmQgd3JpdGUpIGRpZCBub3QKLSAqIGNvbXBsZXRlcyB3aXRoaW4gYSBzcGVjaWZpYyB0aW1lLgotICovCi1wdWJsaWMgY2xhc3MgVGltZW91dEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjY5NzgzMjA0OTQ5NTMyNjM5Mkw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBvZiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBUaW1lb3V0RXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENPbnN0dWN0b3Igb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBleGNlcHRpb24gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBUaW1lb3V0RXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLQkJc3VwZXIobXNnKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUNsaWVudFN0YXRlTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lDbGllbnRTdGF0ZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1YjNhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUNsaWVudFN0YXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gaG9sZCBjbGllbnQgc3RhdGUgaW4ge0BsaW5rIElIVFRQUHJveHlDb25uZWN0aW9ufQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDbGllbnRTdGF0ZU1hbmFnZXIgewotCi0JLy8gV2Ugc2hvdWxkIHVzZSByZWFkLXdyaXRlIGxvY2sgaW5zdGVhZCBvZiBtdXRleC4KLQkvKioKLQkgKiBQdXQgY2xpZW50IHN0YXRlIGFzIGEgc2V0IG9mIGtleSBhbmQgdmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gc3RhdGVLZXkKLQkgKiAgICAgICAgICAgIGtleSBvZiB0aGUgc3RhdGUKLQkgKiBAcGFyYW0gc3RhdGVWYWx1ZQotCSAqICAgICAgICAgICAgdmFsdWUgb2YgdGhlIHN0YXRlCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcHV0KE9iamVjdCBzdGF0ZUtleSwgT2JqZWN0IHN0YXRlVmFsdWUpOwotCi0JLyoqCi0JICogR2V0IGNsaWVudCBzdGF0ZSB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBzdGF0ZUtleQotCSAqICAgICAgICAgICAga2V5IG9mIHRoZSB0YXJnZXQgc3RhdGUKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHRoZSB0YXJnZXQgc3RhdGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldChPYmplY3Qgc3RhdGVLZXkpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lIVFRQTG9jYWxTZXJ2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JSFRUUExvY2FsU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZTdlYTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lIVFRQTG9jYWxTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VNZXNzYWdlOwotCi0vKioKLSAqIEludGVyZmFjZSB0byByZXR1cm4gSFRUUCBSZXNwb25zZSBmb3Igc3BlY2lmaWVkIHJlcXVlc3QgZGlyZWN0bHkgZnJvbSB0aGUKLSAqIHByb3h5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIVFRQTG9jYWxTZXJ2ZXIgewotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgaXMgdGFyZ2V0IG9mIHRoaXMgaW1wbGVtZW50YXRpb24uIElmIHNvLCB0aGUKLQkgKiBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBjcmVhdGUge0BsaW5rIElIVFRQUmVzcG9uc2VNZXNzYWdlfSBhbmQgcmV0dXJuIGl0Ci0JICogYnkgdXNpbmcgc2VuZFJlc3BvbnNlIG1ldGhvZCBvZiB7QGxpbmsgSUhUVFBQcm94eUNvbm5lY3Rpb259LiBGdXJ0aGVyCi0JICogcHJvY2VzcyBvZiB0aGUgcHJveHkgd2lsbCBiZSBjYW5jZWxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIGlkIG9mIHJlcXVlc3QKLQkgKiBAcGFyYW0gY29ubmVjdGlvbgotCSAqICAgICAgICAgICAgdGFyZ2V0IHtAbGluayBJSFRUUFByb3h5Q29ubmVjdGlvbn0KLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqICAgICAgICAgICAgdGFyZ2V0IHtAbGluayBJSFRUUFJlcXVlc3RNZXNzYWdlfQotCSAqIEBwYXJhbSB0cmFuc2NvZGVyCi0JICogICAgICAgICAgICB0cmFuc2NvZGVyIHNldCB0byB0aGUgcHJveHkuIExvY2FsIHNlcnZlciBtYXkgdXNlIHRoaXMKLQkgKiAgICAgICAgICAgIHRyYW5zY29kZXIgdG8gcHJvY2VzcyB0aGUgcmVzdWx0aW5nIG1lc3NhZ2UuCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSByZXF1ZXN0IGlzIHRhcmdldCBvZiB0aGUge0BsaW5rIElIVFRQTG9jYWxTZXJ2ZXJ9Ci0JICogICAgICAgICBpbXBsZW1lbnRhdGlvbgotCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcHJvY2Vzc1JlcXVlc3QoaW50IGlkLAotCQkJSUhUVFBQcm94eUNvbm5lY3Rpb24gY29ubmVjdGlvbiwgSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0LAotCQkJSUhUVFBQcm94eVRyYW5zY29kZXIgdHJhbnNjb2RlcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLAotCQkJSU9FeGNlcHRpb247Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBMb2NhbFNlcnZlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JSFRUUExvY2FsU2VydmVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTk5NzNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JSFRUUExvY2FsU2VydmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5OwotCi0vKioKLSAqIEZhY3Rvcnkgb2YgSFRUUCBsb2NhbCBzZXJ2ZXIgb2JqZWN0cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSFRUUExvY2FsU2VydmVyRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBuZXcgaW5zdGFuY2Ugb2YgSFRUUCBsb2NhbCBzZXJ2ZXIuCi0JICogCi0JICogQHJldHVybiBhIEhUVFAgbG9jYWwgc2VydmVyIG9iamVjdAotCSAqIEBzZWUgSUhUVFBMb2NhbFNlcnZlcgotCSAqLwotCXB1YmxpYyBJSFRUUExvY2FsU2VydmVyIG5ld0luc3RhbmNlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBQcm94eUNvbm5lY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JSFRUUFByb3h5Q29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzhkNDc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JSFRUUFByb3h5Q29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklDbGllbnRDb25uZWN0aW9uOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgSFRUUCBjb25uZWN0aW9uIHdpdGggY2xpZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIVFRQUHJveHlDb25uZWN0aW9uIGV4dGVuZHMgSUNsaWVudENvbm5lY3Rpb24gewotCi0JLyoqCi0JICogR2V0cyB0aGUgc2VjcmV0IG1hbmFnZXIgZm9yIHRoaXMgcHJveHkgY29ubmVjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHNlY3JldCBtYW5hZ2VyIGZvciB0aGlzIHByb3h5IGNvbm5lY3Rpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSVNlY3JldE1hbmFnZXIgZ2V0U2VjcmV0TWFuYWdlcigpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgVENQIHBvcnQgbnVtYmVyIG9uIHdoaWNoIHRoaXMgcHJveHkgY29ubmVjdGlvbiBpcyBsaXN0ZW5pbmcuCi0JICogCi0JICogQHJldHVybiBsaXN0ZW5pbmcgVENQIHBvcnQgbnVtYmVyCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRMaXN0ZW5Qb3J0KCk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHByb3h5IGNvbm5lY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGNsaWVudFN0YXRlTWFuYWdlcgotCSAqICAgICAgICAgICAgY2xpZW50IHN0YXRlIG1hbmFnZXIKLQkgKiBAcGFyYW0gY2xpZW50U29jawotCSAqICAgICAgICAgICAgVENQIHNvY2tldCBmb3IgY2xpZW50IGNvbm5lY3Rpb24KLQkgKiBAcGFyYW0ga2VlcEFsaXZlCi0JICogICAgICAgICAgICBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHVudGlsIHRoZSB0aW1lb3V0IG9mIGVhY2ggbmV0d29yayBJL08KLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBpbml0U2VydmVyR3JvdXBJZHgKLQkgKiAgICAgICAgICAgIGluZGV4IG9mIGluaXRpYWwgc2VydmVyIGdyb3VwCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXQoSUNsaWVudFN0YXRlTWFuYWdlciBjbGllbnRTdGF0ZU1hbmFnZXIsCi0JCQlTb2NrZXQgY2xpZW50U29jaywgbG9uZyBrZWVwQWxpdmUsIGludCBpbml0U2VydmVyR3JvdXBJZHgpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb247Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBQcm94eVRyYW5zY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JSFRUUFByb3h5VHJhbnNjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTE5ODQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JSFRUUFByb3h5VHJhbnNjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VNZXNzYWdlOwotCi0vKioKLSAqIFRyYW5zY29kZXIgb2YgSFRUUCByZXNwb25zZSBtZXNzYWdlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIVFRQUHJveHlUcmFuc2NvZGVyIHsKLQkvKioKLQkgKiBUcmFuc2Zvcm1zIGFuIEhUVFAgcmVzcG9uc2UgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIGlkIG9mIHJlcXVlc3QKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqICAgICAgICAgICAgYW4gSFRUUCByZXF1ZXN0IG1lc3NhZ2UKLQkgKiBAcGFyYW0gcmVzcG9uc2UKLQkgKiAgICAgICAgICAgIGFuIEhUVFAgcmVzcG9uc2UgbWVzc2FnZQotCSAqIEByZXR1cm4gdHJhbnNjb2RlZCBIVFRQIHJlc3BvbnNlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgSUhUVFBSZXNwb25zZU1lc3NhZ2UgdHJhbnNjb2RlKGludCBpZCwgSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0LAotCQkJSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lIVFRQUHJveHlUcmFuc2NvZGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lIVFRQUHJveHlUcmFuc2NvZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjNlZTVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS9wcm94eS9JSFRUUFByb3h5VHJhbnNjb2RlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eTsKLQotLyoqCi0gKiBGYWN0b3J5IG9mIEhUVFAgcHJveHkgdHJhbnNjb2RlcnMuCi0gKiBAc2VlIElIVFRQUHJveHlUcmFuc2NvZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhUVFBQcm94eVRyYW5zY29kZXJGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIG5ldyBpbnN0YW5jZSBvZiBIVFRQIHByb3h5IHRyYW5zY29kZXIuCi0JICogQHBhcmFtIGlkIAotCSAqIEByZXR1cm4gYSBIVFRQIHByb3h5IHRyYW5zY29kZXIgb2JqZWN0Ci0JICogQHNlZSBJSFRUUFByb3h5VHJhbnNjb2RlcgotCSAqLwotCUlIVFRQUHJveHlUcmFuc2NvZGVyIG5ld0luc3RhbmNlKGludCBpZCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBTZXNzaW9uT3ZlcnJpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBTZXNzaW9uT3ZlcnJpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYjEzMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lIVFRQU2Vzc2lvbk92ZXJyaWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLlRpbWVvdXRFeGNlcHRpb247Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIG92ZXJyaWRlIEhUVFAgU2Vzc2lvbiBpbiB0aGUgcHJveHkKLSAqLwotcHVibGljIGludGVyZmFjZSBJSFRUUFNlc3Npb25PdmVycmlkZXIgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9jZXNzZWQge0BsaW5rIElIVFRQUmVxdWVzdE1lc3NhZ2V9Ci0JICogCi0JICogQHJldHVybiBwcm9jZXNzZWQge0BsaW5rIElIVFRQUmVxdWVzdE1lc3NhZ2V9Ci0JICovCi0JcHVibGljIGFic3RyYWN0IElIVFRQUmVxdWVzdE1lc3NhZ2UgZ2V0U2Vzc2lvblJlcXVlc3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvY2Vzc2VkIHtAbGluayBJSFRUUFJlc3BvbnNlTWVzc2FnZX0KLQkgKiBAcmV0dXJuIHByb2Nlc3NlZCB7QGxpbmsgSUhUVFBSZXNwb25zZU1lc3NhZ2V9Ci0JICovCi0JcHVibGljIGFic3RyYWN0IElIVFRQUmVzcG9uc2VNZXNzYWdlIGdldFNlc3Npb25SZXNwb25zZSgpOwotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgaXMgdGFyZ2V0IG9mIHRoaXMgb3ZlcnJpZGVyLgotCSAqIEBwYXJhbSBjc20gCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlcGxhY2VSZXF1ZXN0KElDbGllbnRTdGF0ZU1hbmFnZXIgY3NtLAotCQkJSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3NtCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcGFyYW0gcmVzcG9uc2UKLQkgKiBAcGFyYW0gdGltZW91dAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBUaW1lb3V0RXhjZXB0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVwbGFjZVJlc3BvbnNlKElDbGllbnRTdGF0ZU1hbmFnZXIgY3NtLAotCQkJSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0LCBJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSwKLQkJCWludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb247Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lIVFRQU2Vzc2lvbk92ZXJyaWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlNmMwZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5OwotCi0vKioKLSAqIEZhY3Rvcnkgb2Yge0BsaW5rIElIVFRQU2Vzc2lvbk92ZXJyaWRlcn0gdGhhdCBpcyB1c2VkIHRvIG92ZXJyaWRlIEhUVFAKLSAqIFNlc3Npb24gaW4gdGhlIHByb3h5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBuZXcgaW5zdGFuY2Ugb2YgSFRUUCBzZXNzaW9uIG92ZXJyaWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIElEIG9mIHRoZSBpbnN0YW5jZQotCSAqIEByZXR1cm4gYSBIVFRQIHNlc3Npb24gb3ZlcnJpZGVyIG9iamVjdAotCSAqIEBzZWUgSUhUVFBTZXNzaW9uT3ZlcnJpZGVyCi0JICovCi0JcHVibGljIElIVFRQU2Vzc2lvbk92ZXJyaWRlciBuZXdJbnN0YW5jZShpbnQgaWQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3Byb3h5L0lTZWNyZXRNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSVNlY3JldE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQyMGJkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvcHJveHkvSVNlY3JldE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHk7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB1c2VkIGZvciBjb25maXJtYXRpb24gb2YgY29ycmVjdCBzZXJ2ZXItY2xpZW50IGNvbWJpbmF0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZWNyZXRNYW5hZ2VyIHsKLQotCS8qKgotCSAqIEdldCBzZWNyZXQgU3RyaW5nIHRoYXQgaXMgdXNlZCBmb3IgY29uZmlybWF0aW9uIG9mIGNvcnJlY3Qgc2VydmVyLWNsaWVudAotCSAqIGNvbWJpbmF0aW9uCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICB0YXJnZXQga2V5IHRvIG9idGFpbiB0aGUgc2VjcmV0Ci0JICogQHBhcmFtIHJlbW92ZQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgdGhlIHNlY3JldCB3aWxsIGJlIHJlbW92ZWQgYWZ0ZXIgaW52b2tpbmcgdGhpcyBtZXRob2QKLQkgKiBAcmV0dXJuIHNlY3JldCwgb3IgbnVsbCBpZiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpcyBub3QgYXZhaWxhYmxlIGZvcgotCSAqICAgICAgICAgdGhlIHRhcmdldCBrZXkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFNlY3JldChTdHJpbmcgaWQsIGJvb2xlYW4gcmVtb3ZlKTsKLQotCS8qKgotCSAqIFJlcXVlc3QgdG8gZ2VuZXJhdGUgc2VjcmV0Ci0JICogCi0JICogQHJldHVybiBzZWNyZXQgYXMgYXJyYXkgb2YgYnl0ZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBieXRlW10gcmVxdWVzdFNlY3JldCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3V0aWwvQ2FjaGVNYXAuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS91dGlsL0NhY2hlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MjAzNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3V0aWwvQ2FjaGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGNhY2hlIG1hcC4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlTWFwIGV4dGVuZHMgVHJlZU1hcDxPYmplY3QsIE9iamVjdD4gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY2ODExMzE2NDc5MzE4MjEwNTJMOwotCi0JcHJpdmF0ZSBmaW5hbCBpbnQgbWF4U2l6ZTsKLQlwcml2YXRlIGZpbmFsIGludCBldmljdFNpemU7Ci0KLQlwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8T2JqZWN0PiBhY2Nlc3NMaXN0ID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgY2FjaGUgbWFwLiBJZiB0aGUgbWFwIGV4Y2VlZCB0aGUgbWF4aW11bSBzaXplLCB0aGUKLQkgKiBrZXkvdmFsdWUgc2V0cyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBtYXAgYmFzZWQgb24gc3BlY2lmaWVkIGV2aWN0IHNpemUuCi0JICogCi0JICogQHBhcmFtIG1heFNpemUKLQkgKiAgICAgICAgICAgIG1heGltdW0gc2l6ZSBvZiB0aGUgbWFwCi0JICogQHBhcmFtIGV2aWN0U2l6ZQotCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGV2aWN0IG9iamVjdAotCSAqLwotCXB1YmxpYyBDYWNoZU1hcChpbnQgbWF4U2l6ZSwgaW50IGV2aWN0U2l6ZSkgewotCQl0aGlzLm1heFNpemUgPSBtYXhTaXplOwotCQl0aGlzLmV2aWN0U2l6ZSA9IGV2aWN0U2l6ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXZpY3QoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gaXQgPSBhY2Nlc3NMaXN0Lml0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXZpY3RTaXplOyBpKyspIHsKLQkJCWlmICghaXQuaGFzTmV4dCgpKQotCQkJCXJldHVybjsKLQkJCU9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0JCQl0aGlzLnJlbW92ZShrZXkpOwotCQkJaXQucmVtb3ZlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBzZWFyY2hBY2Nlc3NMaXN0KE9iamVjdCBrZXkpIHsKLQkJcmV0dXJuIGFjY2Vzc0xpc3QuaW5kZXhPZihrZXkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhY2Nlc3NFbnRyeShPYmplY3Qga2V5KSB7Ci0JCWludCBpZHggPSBzZWFyY2hBY2Nlc3NMaXN0KGtleSk7Ci0JCWlmIChpZHggPj0gMCkgewotCQkJYWNjZXNzTGlzdC5yZW1vdmUoaWR4KTsKLQkJfQotCQlhY2Nlc3NMaXN0LmFkZChrZXkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWwpIHsKLQkJaWYgKHNpemUoKSA+PSBtYXhTaXplKQotCQkJZXZpY3QoKTsKLQkJYWNjZXNzRW50cnkoa2V5KTsKLQkJcmV0dXJuIHN1cGVyLnB1dChrZXksIHZhbCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotCQlhY2Nlc3NFbnRyeShrZXkpOwotCQlyZXR1cm4gc3VwZXIuZ2V0KGtleSk7Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoIGEga2V5IHRoYXQgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXggZnJvbSB0aGUgbWFwLCBhbmQKLQkgKiByZXR1cm4gdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZml4Ci0JICogICAgICAgICAgICB0YXJnZXQgcHJlZml4Ci0JICogQHJldHVybiB0aGUgdmFsdWUgd2hvc2Uga2V5IHN0YXJ0cyB3aXRoIHByZWZpeCwgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlCi0JICovCi0JcHVibGljIE9iamVjdCBtYXRjaFN0YXJ0c1dpdGgoU3RyaW5nIHByZWZpeCkgewotCQlTb3J0ZWRNYXA8T2JqZWN0LCBPYmplY3Q+IHNtYXAgPSBzdXBlci50YWlsTWFwKHByZWZpeCk7Ci0JCU9iamVjdCBva2V5OwotCQl0cnkgewotCQkJb2tleSA9IHNtYXAuZmlyc3RLZXkoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoIShva2V5IGluc3RhbmNlb2YgU3RyaW5nKSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcga2V5ID0gKFN0cmluZykgb2tleTsKLQkJLy8gU3lzdGVtLmVyci5wcmludGxuKCJNU1c6IiArIGtleSArICIgLyAiICsgcHJlZml4KTsKLQkJaWYgKCFrZXkuc3RhcnRzV2l0aChwcmVmaXgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBzdXBlci5nZXQoa2V5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9IVFRQVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3V0aWwvSFRUUFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY3OGI1Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9IVFRQVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5Q29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmUuSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZS5IVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2U7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgSFRUUCBzZXNzaW9uIGFuZCBtZXNzYWdlcwotICovCi1wdWJsaWMgY2xhc3MgSFRUUFV0aWwgewotCS8qKgotCSAqIFNlbmQgNDA0IChub3QgZm91bmQpIGVycm9yIHRvIGNsaWVudAotCSAqIAotCSAqIEBwYXJhbSBmQ2xpZW50Ci0JICogICAgICAgICAgICB0YXJnZXQge0BsaW5rIElIVFRQUHJveHlDb25uZWN0aW9ufQotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICogICAgICAgICAgICB0YXJnZXQge0BsaW5rIElIVFRQUmVxdWVzdE1lc3NhZ2V9Ci0JICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZEZhaWxlZFRvQ2xpZW50KElIVFRQUHJveHlDb25uZWN0aW9uIGZDbGllbnQsCi0JCQlJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uIHsKLQkJZkNsaWVudC5zZW5kUmVzcG9uc2UobmV3IEhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZShyZXF1ZXN0Ci0JCQkJLmdldFNlcmlhbCgpLCBJSFRUUEhlYWRlci5IVFRQX1ZFUlNJT05fMV8wX0EsICI0MDQiLmdldEJ5dGVzKCksCi0JCQkJIk5vdCBmb3VuZCIuZ2V0Qnl0ZXMoKSwgSUhUVFBSZXNwb25zZU1lc3NhZ2UuRU1QVFlfQk9EWSkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBuZXcge0BsaW5rIElIVFRQUmVzcG9uc2VNZXNzYWdlfSBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSBiYXNlCi0JICogICAgICAgICAgICB0aGUgYmFzZSB7QGxpbmsgSUhUVFBSZXNwb25zZU1lc3NhZ2V9LiBOZXcgaW5zdGFuY2Ugd2lsbCBiZQotCSAqICAgICAgICAgICAgZ2VuZXJhdGVkIGJ5IGNvcHlpbmcgdGhlIGJhc2UgbWVzc2FnZS4KLQkgKiBAcGFyYW0gYm9keQotCSAqICAgICAgICAgICAgbWVzc2FnZSBib2R5IG9mIHRoZSBuZXcgaW5zdGFuY2UKLQkgKiBAcmV0dXJuIG5ldyB7QGxpbmsgSUhUVFBSZXNwb25zZU1lc3NhZ2V9IGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBJSFRUUFJlc3BvbnNlTWVzc2FnZSBjcmVhdGVIVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UoCi0JCQlJSFRUUFJlc3BvbnNlTWVzc2FnZSBiYXNlLCBieXRlW10gYm9keSkgewotCQlyZXR1cm4gbmV3IEhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZShiYXNlLCBib2R5KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IHtAbGluayBJSFRUUFJlc3BvbnNlTWVzc2FnZX0gaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gc2VyaWFsCi0JICogICAgICAgICAgICBzZXJpYWwgb2YgdGhlIG1lc3NhZ2UKLQkgKiBAcGFyYW0gdmVyc2lvbgotCSAqICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgbWVzc2FnZQotCSAqIEBwYXJhbSBzdGF0dXNDb2RlCi0JICogICAgICAgICAgICBzdGF0dXMgY29kZSBvZiB0aGUgbWVzc2FnZQotCSAqIEBwYXJhbSByZWFzb25QaHJhc2UKLQkgKiAgICAgICAgICAgIHJlYXNvbiBwaHJhc2Ugb2YgdGhlIG1lc3NhZ2UKLQkgKiBAcGFyYW0gYm9keQotCSAqICAgICAgICAgICAgbWVzc2FnZSBib2R5Ci0JICogQHJldHVybiBuZXcge0BsaW5rIElIVFRQUmVzcG9uc2VNZXNzYWdlfSBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUhUVFBSZXNwb25zZU1lc3NhZ2UgY3JlYXRlSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKAotCQkJbG9uZyBzZXJpYWwsIGJ5dGVbXSB2ZXJzaW9uLCBieXRlW10gc3RhdHVzQ29kZSwKLQkJCWJ5dGVbXSByZWFzb25QaHJhc2UsIGJ5dGVbXSBib2R5KSB7Ci0JCXJldHVybiBuZXcgSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKHNlcmlhbCwgdmVyc2lvbiwgc3RhdHVzQ29kZSwKLQkJCQlyZWFzb25QaHJhc2UsIGJvZHkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBuZXcge0BsaW5rIElIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2V9IGluc3RhbmNlIGZyb20gYmFzZQotCSAqIG1lc3NhZ2UKLQkgKiAKLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgdGhlIGJhc2Uge0BsaW5rIElIVFRQUmVzcG9uc2VNZXNzYWdlfS4gTmV3IGluc3RhbmNlIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGdlbmVyYXRlZCBieSBjb3B5aW5nIHRoZSBiYXNlIG1lc3NhZ2UuCi0JICogQHBhcmFtIHB1c2hiYWNrQnVmZmVyU2l6ZQotCSAqICAgICAgICAgICAgcHVzaGJhY2sgYnVmZmVyIHNpemUgb2YgdGhlIG5ldwotCSAqICAgICAgICAgICAge0BsaW5rIElIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2V9IGluc3RhbmNlCi0JICogQHJldHVybiBuZXcge0BsaW5rIElIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2V9IGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBJSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlIGNyZWF0ZUhUVFBSZXNwb25zZVB1c2hiYWNrTWVzc2FnZSgKLQkJCUlIVFRQUmVzcG9uc2VNZXNzYWdlIGJhc2UsIGludCBwdXNoYmFja0J1ZmZlclNpemUpIHsKLQkJcmV0dXJuIG5ldyBIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2UoYmFzZSwgcHVzaGJhY2tCdWZmZXJTaXplKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2h0dHBwcm94eS91dGlsL0xvZ2dlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3V0aWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNWVkZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3V0aWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgbG9nZ2luZy4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29uZmlnUHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVBST1BfTE9HR0lOR19DT05GSUdVUkFUSU9OID0gbmFtZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJPUF9MT0dHSU5HX0NPTkZJR1VSQVRJT04gPSAiaHR0cHByb3h5LmNvbmYubG9nZ2luZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0dHSU5HX0NPTkZJR1VSQVRJT04gPSAibG9nZ2luZy5jb25mIjsKLQotCS8qKgotCSAqIEBwYXJhbSBjbGF6egotCSAqIEByZXR1cm4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIExvZ2dlciBnZXRMb2dnZXIoQ2xhc3MgY2xhenopIHsKLQkJcmV0dXJuIG5ldyBMb2dnZXIoY2xhenopOwotCX0KLQotCS8qKgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgY29uZmlnID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfTE9HR0lOR19DT05GSUdVUkFUSU9OLAotCQkJCURFRkFVTFRfTE9HR0lOR19DT05GSUdVUkFUSU9OKTsKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjb25maWcpOwotCQkJCWphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLnJlYWRDb25maWd1cmF0aW9uKAotCQkJCQkJaW4pOwotCi0JCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGNvbmZpZyk7Ci0JCQkJcHJvcHMubG9hZChpbik7Ci0KLQkJCQlleGNlcHRpb24gPSBudWxsOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oIldBUk5JTkc6IEZpbGUgbm90IGZvdW5kICIgKyBjb25maWcpOwotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiBDYW5ub3QgcmVhZCBmaWxlICIgKyBjb25maWcpOwotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9Ci0JCX0KLQotCQlqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgbCA9IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5nZXRMb2dnZXIoIiIpOwotCQlsLnNldExldmVsKExldmVsLkFMTCk7Ci0KLQkJLy8gU2V0IGEgRmlsZUhhbmRsZXIuLi4gZGlzYWJsZWQgbm93LiBXZSBjYW4gdXNlIENoYWluc2F3IG9yIHNvbWUgb3RoZXIKLQkJLy8gbG9nIHZpZXdlcnMgdmlhIG5ldHdvcmsuCi0JCS8vIHNldEZpbGVIYW5kbGVyKGwsIG5hbWUsIHByb3BzKTsKLQotCQlpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKLQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb25maWdJUwotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZShJbnB1dFN0cmVhbSBjb25maWdJUykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotCQlpZiAoY29uZmlnSVMgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlqYXZhLnV0aWwubG9nZ2luZy5Mb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKS5yZWFkQ29uZmlndXJhdGlvbigKLQkJCQkJCWNvbmZpZ0lTKTsKLQkJCQlleGNlcHRpb24gPSBudWxsOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oIldBUk5JTkc6IEZpbGUgbm90IGZvdW5kICIgKyBjb25maWcpOwotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiBDYW5ub3QgcmVhZCBmaWxlICIgKyBjb25maWcpOwotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9Ci0JCX0KLQotCQlqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXIgbCA9IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5nZXRMb2dnZXIoIiIpOwotCQlsLnNldExldmVsKExldmVsLkFMTCk7Ci0KLQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQl0aHJvdyBleGNlcHRpb247Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0RmlsZUhhbmRsZXIoamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyIGwsIFN0cmluZwotCSAqIG5hbWUsIFByb3BlcnRpZXMgcHJvcHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7IFN0cmluZyBwYXR0ZXJuID0KLQkgKiBwcm9wcy5nZXRQcm9wZXJ0eSgiamF2YS51dGlsLmxvZ2dpbmcuRmlsZUhhbmRsZXIucGF0dGVybiIsCi0JICogImxvZ3MvJXNfJXUubG9nIik7IHBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2VBbGwoIiVzIiwgbmFtZSk7IEhhbmRsZXIKLQkgKiBmaWxlSGFuZGxlciA9IG5ldyBGaWxlSGFuZGxlcihwYXR0ZXJuKTsgU3RyaW5nIGZvcm1hdHRlck5hbWUgPQotCSAqIHByb3BzLmdldFByb3BlcnR5KCJqYXZhLnV0aWwubG9nZ2luZy5GaWxlSGFuZGxlci5mb3JtYXR0ZXIiKTsgaWYKLQkgKiAoZm9ybWF0dGVyTmFtZSAhPSBudWxsKSB7IHRyeSB7IENsYXNzIGZvcm1hdHRlckNsYXNzID0KLQkgKiBDbGFzcy5mb3JOYW1lKGZvcm1hdHRlck5hbWUpOyBPYmplY3QgbyA9IGZvcm1hdHRlckNsYXNzLm5ld0luc3RhbmNlKCk7IGlmCi0JICogKG8gaW5zdGFuY2VvZiBGb3JtYXR0ZXIpIHsgZmlsZUhhbmRsZXIuc2V0Rm9ybWF0dGVyKChGb3JtYXR0ZXIpIG8pOyB9IH0KLQkgKiBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLy8gaWdub3JlIH0gfSAvL2ZpbGVIYW5kbGVyLnNldExldmVsKExldmVsLkFMTCk7Ci0JICogLy9sLmFkZEhhbmRsZXIoZmlsZUhhbmRsZXIpOyBmaW5hbCBNZW1vcnlIYW5kbGVyIG1oID0gbmV3Ci0JICogTWVtb3J5SGFuZGxlcihmaWxlSGFuZGxlciwgMTAwMCwgTGV2ZWwuQUxMKTsgbC5hZGRIYW5kbGVyKG1oKTsKLQkgKiAKLQkgKiBUaW1lciB0aW1lciA9IG5ldyBUaW1lcih0cnVlKTsgdGltZXIuc2NoZWR1bGUobmV3IFRpbWVyVGFzaygpIHsgcHVibGljCi0JICogdm9pZCBydW4oKSB7IG1oLnB1c2goKTsgbWguZmx1c2goKTsgfSB9LCAwLCAxMDAwTCk7IH0KLQkgKi8KLQotCXByaXZhdGUgZmluYWwgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyIGZEZWxlZ2F0ZTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTG9nZ2VyKENsYXNzIGNsYXp6KSB7Ci0JCWZEZWxlZ2F0ZSA9IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5nZXRMb2dnZXIoY2xhenouZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZWJ1Z0VuYWJsZWQoKSB7Ci0JCXJldHVybiBmRGVsZWdhdGUuaXNMb2dnYWJsZShMZXZlbC5GSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNNZXRob2RUcmFjaW5nRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZEZWxlZ2F0ZS5pc0xvZ2dhYmxlKExldmVsLkZJTkVSKTsKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBjcmVhdGVNZXNzYWdlKFN0cmluZyBtc2cpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyBzYi5hcHBlbmQoJ1snKTsKLQkJLy8gc2IuYXBwZW5kKGZOYW1lKTsKLQkJLy8gc2IuYXBwZW5kKCJdICIpOwotCQlzYi5hcHBlbmQobXNnKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgYSBsb2cgbWVzc2FnZSBmb3Igc2VyaW91cyBzaXR1YXRpb24uCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqLwotCXB1YmxpYyB2b2lkIGZhdGFsKFN0cmluZyBtc2cpIHsKLQkJZkRlbGVnYXRlLnNldmVyZShjcmVhdGVNZXNzYWdlKG1zZykpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyB2b2lkIGZhdGFsKFN0cmluZyBtc2csIFRocm93YWJsZSBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKG1zZyk7Ci0JCXNiLmFwcGVuZCgiLCAiKTsKLQkJc2IuYXBwZW5kKGR1bXBTdGFja1RyYWNlKGUpKTsKLQkJZkRlbGVnYXRlLnNldmVyZShzYi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSBhIGxvZyBtZXNzYWdlIG5vdGlmeWluZyBhIHBvdGVudGlhbCBwcm9ibGVtLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgdm9pZCB3YXJuaW5nKFN0cmluZyBtc2cpIHsKLQkJZkRlbGVnYXRlLndhcm5pbmcoY3JlYXRlTWVzc2FnZShtc2cpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB3YXJuaW5nKFN0cmluZyBtc2csIFRocm93YWJsZSBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKG1zZyk7Ci0JCXNiLmFwcGVuZCgiLCAiKTsKLQkJc2IuYXBwZW5kKGR1bXBTdGFja1RyYWNlKGUpKTsKLQkJZkRlbGVnYXRlLndhcm5pbmcoc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgYSBsb2cgbWVzc2FnZSBmb3IgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIHZvaWQgaW5mbyhTdHJpbmcgbXNnKSB7Ci0JCWZEZWxlZ2F0ZS5pbmZvKGNyZWF0ZU1lc3NhZ2UobXNnKSk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgYSBsb2cgbWVzc2FnZSBmb3IgZGVidWcuCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqLwotCXB1YmxpYyB2b2lkIGRlYnVnKFN0cmluZyBtc2cpIHsKLQkJZkRlbGVnYXRlLmZpbmUoY3JlYXRlTWVzc2FnZShtc2cpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWJ1ZyhTdHJpbmcgbXNnLCBUaHJvd2FibGUgZSkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZChtc2cpOwotCQlzYi5hcHBlbmQoIiwgIik7Ci0JCXNiLmFwcGVuZChkdW1wU3RhY2tUcmFjZShlKSk7Ci0JCWZEZWxlZ2F0ZS5maW5lKHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGR1bXBTdGFja1RyYWNlKFRocm93YWJsZSBlKSB7Ci0JCVN0cmluZ1dyaXRlciB3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcih3KTsKLQkJZS5wcmludFN0YWNrVHJhY2UocHcpOwotCQlwdy5mbHVzaCgpOwotCQlyZXR1cm4gdy5nZXRCdWZmZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9QYXJzZVVSSS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaHR0cHByb3h5L3V0aWwvUGFyc2VVUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY0NWEwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9odHRwcHJveHkvdXRpbC9QYXJzZVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbDsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZVVSSSB7Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRBdXRob3JpdHkoU3RyaW5nIHVyaSkgewotICAgICAgICBpbnQgcG9zID0gdXJpLmluZGV4T2YoJzonKTsKLSAgICAgICAgaWYgKHVyaS5sZW5ndGgoKSA8PSAocG9zICsgMykpIHsKLSAgICAgICAgICAgIC8vIEF1dGhvcml0eSBuZWVkcyAiOi8vIgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVyaS5jaGFyQXQocG9zICsgMSkgIT0gJy8nKSByZXR1cm4gbnVsbDsKLSAgICAgICAgaWYgKHVyaS5jaGFyQXQocG9zICsgMikgIT0gJy8nKSByZXR1cm4gbnVsbDsKLSAgICAgICAgcG9zICs9IDM7Ci0gICAgICAgIGludCBwb3NFbmQgPSB1cmkuaW5kZXhPZignLycsIHBvcyk7Ci0gICAgICAgIGlmIChwb3NFbmQgPj0gMCkgewotICAgICAgICAgICAgLy8gc2NoZW1lICI6Ly8iIGF1dGhvcml0eSBhYnMtcGF0aAotICAgICAgICAgICAgcmV0dXJuIHVyaS5zdWJzdHJpbmcocG9zLCBwb3NFbmQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc2NoZW1lICI6Ly8iIGF1dGhvcml0eQotICAgICAgICAgICAgcmV0dXJuIHVyaS5zdWJzdHJpbmcocG9zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKFN0cmluZyB1cmkpIHsKLSAgICAgICAgaW50IHBvcyA9IHVyaS5pbmRleE9mKCc6Jyk7Ci0gICAgICAgIGlmICh1cmkubGVuZ3RoKCkgPD0gKHBvcyArIDMpKSB7Ci0gICAgICAgICAgICAvLyBBdXRob3JpdHkgbmVlZHMgIjovLyIKLSAgICAgICAgICAgIHJldHVybiB1cmk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVyaS5jaGFyQXQocG9zICsgMSkgIT0gJy8nKSByZXR1cm4gdXJpOwotICAgICAgICBpZiAodXJpLmNoYXJBdChwb3MgKyAyKSAhPSAnLycpIHJldHVybiB1cmk7Ci0gICAgICAgIHBvcyArPSAzOwotICAgICAgICBpbnQgcG9zRW5kID0gdXJpLmluZGV4T2YoJy8nLCBwb3MpOwotICAgICAgICBpZiAocG9zRW5kID49IDApIHsKLSAgICAgICAgICAgIC8vIHNjaGVtZSAiOi8vIiBhdXRob3JpdHkgYWJzLXBhdGgKLSAgICAgICAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKHBvc0VuZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBzY2hlbWUgIjovLyIgYXV0aG9yaXR5Ci0gICAgICAgICAgICByZXR1cm4gIi8iOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGhvc3RTdHIKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgcGFyc2VIb3N0KFN0cmluZyBob3N0U3RyKSB7Ci0gICAgICAgIGludCBzZXBJZHggPSBob3N0U3RyLmluZGV4T2YoJzonKTsKLSAgICAgICAgaWYgKHNlcElkeCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBob3N0U3RyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGhvc3RTdHIuc3Vic3RyaW5nKDAsIHNlcElkeCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaG9zdFN0cgotICAgICAqIEBwYXJhbSBkZWZhdWx0UG9ydAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIGludCBwYXJzZVBvcnQoU3RyaW5nIGhvc3RTdHIsIGludCBkZWZhdWx0UG9ydCkgewotICAgICAgICBpbnQgc2VwSWR4ID0gaG9zdFN0ci5pbmRleE9mKCc6Jyk7Ci0gICAgICAgIGlmIChzZXBJZHggPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFBvcnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgcG9ydFN0ciA9IGhvc3RTdHIuc3Vic3RyaW5nKHNlcElkeCArIDEpLnRyaW0oKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocG9ydFN0cik7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0UG9ydDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZWxpbWluYXRlUXVlcnkoU3RyaW5nIHVyaSkgewotICAgICAgICBpbnQgaWR4ID0gdXJpLmluZGV4T2YoJz8nKTsKLSAgICAgICAgaWYgKGlkeCA8IDApIHJldHVybiB1cmk7Ci0gICAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKDAsIGlkeCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvSFRUUFByb3h5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvSFRUUFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkM2EwMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L0hUVFBQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LkV4dGVybmFsUHJveHlDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5JSFRUUFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuUHJveHlDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklDbGllbnRDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBMb2NhbFNlcnZlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5Q29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQUHJveHlUcmFuc2NvZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQU2Vzc2lvbk92ZXJyaWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JU2VjcmV0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZS5DbGllbnRDb25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5wcm94eS5DbGllbnRTdGF0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5wcm94eS5IVFRQUHJveHlDb25uZWN0aW9uOwotCi0vKioKLSAqIEhUVFBQcm94eSBpcyB0aGUgY2xhc3MgZm9yIHRoZSBzZXJ2ZXIgaW5zdGFuY2Ugb2YgSFRUUCBwcm94eS4KLSAqLwotcHVibGljIGNsYXNzIEhUVFBQcm94eSBpbXBsZW1lbnRzIENsaWVudENvbm5lY3Rpb25MaXN0ZW5lciwgSUhUVFBQcm94eSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSFRUUFByb3h5LmNsYXNzKTsKLQotCXByaXZhdGUgZmluYWwgSVdvcmtwaWxlQ29udHJvbGxlciB3cGM7Ci0KLQlwcml2YXRlIGZpbmFsIFNlcnZlclNvY2tldCBmU2VydmVyU29jazsKLQotCXByaXZhdGUgZmluYWwgbG9uZyBmS2VlcEFsaXZlOwotCi0JcHJpdmF0ZSBmaW5hbCBpbnQgZlF1ZXVlU2l6ZTsKLQotCS8vIHByaXZhdGUgZmluYWwgQXN5bmNXb3JrTWFuYWdlciBmRGlzcGF0Y2hXb3JrTWFuOwotCi0JcHJpdmF0ZSBmaW5hbCBJT2JqZWN0UG9vbCBjb25uZWN0aW9uUG9vbDsKLQotCXByaXZhdGUgZmluYWwgSVNlY3JldE1hbmFnZXIgc2VjcmV0TWFuYWdlcjsKLQotCXByaXZhdGUgZmluYWwgSUhUVFBTZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeSBzZXNzaW9uT3ZlcnJpZGVyRmFjdG9yeTsKLQotCXByaXZhdGUgZmluYWwgSUhUVFBQcm94eVRyYW5zY29kZXJGYWN0b3J5IHByb3h5VHJhbnNjb2RlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIGZpbmFsIElIVFRQTG9jYWxTZXJ2ZXJGYWN0b3J5IGxvY2FsU2VydmVyRmFjdG9yeTsKLQotCXByaXZhdGUgRXh0ZXJuYWxQcm94eUNvbmZpZyBleHRlcm5hbFByb3h5Q29uZmlnOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJU2VjcmV0TWFuYWdlciBnZXRTZWNyZXRNYW5hZ2VyKCkgewotCQlyZXR1cm4gc2VjcmV0TWFuYWdlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuSUhUVFBQcm94eSNnZXRMaXN0ZW5Qb3J0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpc3RlblBvcnQoKSB7Ci0JCXJldHVybiBmU2VydmVyU29jay5nZXRMb2NhbFBvcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEV4dGVybmFsUHJveHlDb25maWcgZ2V0RXh0ZXJuYWxQcm94eUNvbmZpZygpIHsKLQkJcmV0dXJuIGV4dGVybmFsUHJveHlDb25maWc7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJSFRUUFNlc3Npb25PdmVycmlkZXJGYWN0b3J5IGdldFNlc3Npb25PdmVycmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gc2Vzc2lvbk92ZXJyaWRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJSFRUUFByb3h5VHJhbnNjb2RlckZhY3RvcnkgZ2V0UHJveHlUcmFuc2NvZGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHByb3h5VHJhbnNjb2RlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJSFRUUExvY2FsU2VydmVyRmFjdG9yeSBnZXRMb2NhbFNlcnZlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBsb2NhbFNlcnZlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIEhUVFBQcm94eShQcm94eUNvbmZpZyBjb25maWcsIEV4dGVybmFsUHJveHlDb25maWcgZXh0ZXJuYWxQcm94eUNvbmZpZykKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUxvZ2dlci5zZXRDb25maWdQcm9wZXJ0eU5hbWUoIldhWGNvZGluZy5jb25mLmxvZ2dpbmciKTsKLQkJdGhpcy5leHRlcm5hbFByb3h5Q29uZmlnID0gZXh0ZXJuYWxQcm94eUNvbmZpZzsKLQkJd3BjID0gbmV3IFdvcmtwaWxlQ29udHJvbGxlckltcGwoIldhWGNvZGluZyIpOwotCQlmU2VydmVyU29jayA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKLQkJU29ja2V0QWRkcmVzcyBzYSA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcygibG9jYWxob3N0IiwgY29uZmlnLmdldFBvcnQoKSk7Ci0JCS8vIFNvY2tldEFkZHJlc3Mgc2EgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MobG9jYWxQb3J0KTsKLQkJZlNlcnZlclNvY2suYmluZChzYSk7Ci0JCWZLZWVwQWxpdmUgPSBjb25maWcuZ2V0S2VlcEFsaXZlSW50ZXJ2YWwoKTsKLQkJZlF1ZXVlU2l6ZSA9IGNvbmZpZy5nZXRNYXhRdWV1ZVNpemUoKTsKLQkJY29ubmVjdGlvblBvb2wgPSBuZXcgT2JqZWN0UG9vbEltcGwoIldhWGNvZGluZy1jbGllbnRjb25uZWN0aW9ucyIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZy5nZXRNYXhDb25uZWN0aW9uKCk7IGkrKykgewotCQkJSUhUVFBQcm94eUNvbm5lY3Rpb24gb2JqID0gbmV3IEhUVFBQcm94eUNvbm5lY3Rpb24odGhpcywKLQkJCQkJZlF1ZXVlU2l6ZSwgY29uZmlnLmdldFRpbWVvdXQoKSk7Ci0JCQljb25uZWN0aW9uUG9vbC5hZGQob2JqKTsKLQkJfQotCQlzZWNyZXRNYW5hZ2VyID0gY29uZmlnLmdldFNlY3JldE1hbmFnZXIoKTsKLQkJc2Vzc2lvbk92ZXJyaWRlckZhY3RvcnkgPSBjb25maWcuZ2V0U2Vzc2lvbk92ZXJyaWRlckZhY3RvcnkoKTsKLQkJcHJveHlUcmFuc2NvZGVyRmFjdG9yeSA9IGNvbmZpZy5nZXRQcm94eVRyYW5zY29kZXJGYWN0b3J5KCk7Ci0JCWxvY2FsU2VydmVyRmFjdG9yeSA9IGNvbmZpZy5nZXRMb2NhbFNlcnZlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuSUhUVFBQcm94eSNnZXRTZWNyZXQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWNyZXQoU3RyaW5nIGlkLCBib29sZWFuIHJlbW92ZSkgewotCQlpZiAobnVsbCA9PSBzZWNyZXRNYW5hZ2VyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc2VjcmV0TWFuYWdlci5nZXRTZWNyZXQoaWQsIHJlbW92ZSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0Q3VycmVudFNlcnZlckdyb3VwSW5kZXgoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25DbG9zZWQoSUNsaWVudENvbm5lY3Rpb24gb2JqKSB7Ci0JCWNvbm5lY3Rpb25Qb29sLmFkZChvYmopOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleGl0ID0gZmFsc2U7Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRQcm94eSgpIHsKLQkJTE9HR0VSLmluZm8oIlN0YXJ0ZWQgV2FYY29kaW5nLCBMaXN0ZW5pbmcgcG9ydCAiCi0JCQkJKyBmU2VydmVyU29jay5nZXRMb2NhbFBvcnQoKSk7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlTb2NrZXQgc29jayA9IG51bGw7Ci0JCQl0cnkgewotCQkJCUhUVFBQcm94eUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IChIVFRQUHJveHlDb25uZWN0aW9uKSBjb25uZWN0aW9uUG9vbAotCQkJCQkJLnRha2UoMCk7Ci0JCQkJc29jayA9IGZTZXJ2ZXJTb2NrLmFjY2VwdCgpOwotCQkJCXNvY2suc2V0U29UaW1lb3V0KDEpOwotCQkJCWlmIChleGl0KQotCQkJCQlicmVhazsKLQkJCQlpZiAoc29jayAhPSBudWxsKSB7Ci0JCQkJCWNvbm5lY3Rpb24uaW5pdChDbGllbnRTdGF0ZU1hbmFnZXIKLQkJCQkJCQkuZ2V0Q2xpZW50U3RhdGVNYW5hZ2VyKHRoaXMpLCBzb2NrLCBmS2VlcEFsaXZlLAotCQkJCQkJCWdldEN1cnJlbnRTZXJ2ZXJHcm91cEluZGV4KCkpOwotCQkJCQl3cGMuaW5wdXQoY29ubmVjdGlvbik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCWlmIChleGl0KSB7Ci0JCQkJCUxPR0dFUi5pbmZvKCJTdG9wcGluZyBXYVhjb2RpbmcuLi4iKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB0aGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZC4KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4od3BjLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXAoKSB7Ci0JCUxPR0dFUi5pbmZvKCIuLi5kb25lIik7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBQcm94eVRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JCXByaXZhdGUgYm9vbGVhbiB0aHJlYWRFeGl0OwotCi0JCXB1YmxpYyB2b2lkIGV4aXQoKSB7Ci0JCQlleGl0ID0gdHJ1ZTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCXdoaWxlICghdGhyZWFkRXhpdCkgewotCQkJCQl0aGlzLmludGVycnVwdCgpOwotCQkJCQl0cnkgewotCQkJCQkJZlNlcnZlclNvY2suY2xvc2UoKTsKLQkJCQkJCXdhaXQoMTAwMCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXN0YXJ0UHJveHkoKTsKLQkJCWNsZWFudXAoKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCXRocmVhZEV4aXQgPSB0cnVlOwotCQkJCW5vdGlmeUFsbCgpOwotCQkJfQotCQl9Ci0KLQkJUHJveHlUaHJlYWQoKSB7Ci0JCQlzdXBlcigiUHJveHlUaHJlYWQiKTsKLQkJCXRocmVhZEV4aXQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgUHJveHlUaHJlYWQgcHJveHlUaHJlYWQ7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuSUhUVFBQcm94eSNzdGFydFRocmVhZCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRUaHJlYWQoKSB7Ci0JCWlmIChwcm94eVRocmVhZCAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlwcm94eVRocmVhZCA9IG5ldyBQcm94eVRocmVhZCgpOwotCQlwcm94eVRocmVhZC5zdGFydCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5JSFRUUFByb3h5I3N0b3BUaHJlYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BUaHJlYWQoKSB7Ci0JCXByb3h5VGhyZWFkLmV4aXQoKTsKLQkJcHJveHlUaHJlYWQgPSBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0FHRV9QQVJBTVMgPSAiIDxsb2NhbHBvcnQ+IjsKLQotCXByaXZhdGUgc3RhdGljIHZvaWQgUFJJTlRfVVNBR0UoU3RyaW5nIG1zZykgewotCQlpZiAobXNnICE9IG51bGwgJiYgbXNnLmxlbmd0aCgpID4gMCkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCX0KLQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogamF2YSAiICsgSFRUUFByb3h5LmNsYXNzLmdldE5hbWUoKQotCQkJCSsgVVNBR0VfUEFSQU1TKTsKLQl9Ci0KLQkvKioKLQkgKiBBIHNhbXBsZSBib290c3RyYXAgY29kZSBmb3Igc3RhbmQtYWxvbmUgSFRUUCBwcm94eSBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBhcmdzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncy5sZW5ndGggPCAxKSB7Ci0JCQlQUklOVF9VU0FHRShudWxsKTsKLQkJCVN5c3RlbS5leGl0KDEpOwotCQl9Ci0KLQkJaW50IGFyZ3NPZmZzZXQgPSAwOwotCi0JCWludCBsb2NhbHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbYXJnc09mZnNldCsrXSk7Ci0KLQkJUHJveHlDb25maWcgY29uZmlnID0gbmV3IFByb3h5Q29uZmlnKCk7Ci0JCUV4dGVybmFsUHJveHlDb25maWcgZXh0ZXJuYWxQcm94eUNvbmZpZyA9IG5ldyBFeHRlcm5hbFByb3h5Q29uZmlnKCk7Ci0KLQkJdHJ5IHsKLQkJCUxvZ2dlci5jb25maWd1cmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkvLyBTeXN0ZW0uZXhpdCgxKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlIVFRQUHJveHkgcHJveHkgPSBuZXcgSFRUUFByb3h5KGNvbmZpZywgZXh0ZXJuYWxQcm94eUNvbmZpZyk7Ci0JCQlwcm94eS5zdGFydFByb3h5KCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiUG9ydCBpcyBpbiB1c2U6ICIgKyBsb2NhbHBvcnQpOwotCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvSU9iamVjdFBvb2wuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9JT2JqZWN0UG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODI1YjhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9JT2JqZWN0UG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElPYmplY3RQb29sIHsKLSAgICBTdHJpbmcgZ2V0TmFtZSgpOwotICAgIGJvb2xlYW4gYWRkKE9iamVjdCBvKTsKLSAgICBPYmplY3QgdGFrZSgpOwotICAgIE9iamVjdCB0YWtlKGludCB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvSVdvcmtwaWxlQ29udHJvbGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L0lXb3JrcGlsZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIxZDcxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvSVdvcmtwaWxlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElXb3JrcGlsZUNvbnRyb2xsZXIgewotICAgIHZvaWQgaW5wdXQoUnVubmFibGUgd29yayk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvT2JqZWN0UG9vbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9PYmplY3RQb29sSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjlhYzgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9PYmplY3RQb29sSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotCi0KLQotCi1wdWJsaWMgY2xhc3MgT2JqZWN0UG9vbEltcGwgaW1wbGVtZW50cyBJT2JqZWN0UG9vbCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBwb29sOwotICAgIHByaXZhdGUgaW50IHdhaXRJbkxpbmU7Ci0KLSAgICBzeW5jaHJvbml6ZWQgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7Ci0gICAgICAgIGJvb2xlYW4gZmxhZyA9IHBvb2wuYWRkKG8pOwotICAgICAgICBpZiAoZmxhZyAmJiAgKHdhaXRJbkxpbmUgPiAwKSkgbm90aWZ5KCk7Ci0gICAgICAgIHJldHVybiBmbGFnOwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCBwdWJsaWMgT2JqZWN0IHRha2UoKSB7Ci0gICAgICAgIGlmIChwb29sLnNpemUoKSA9PSAwKSByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIHBvb2wucmVtb3ZlKDApOwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCBwdWJsaWMgT2JqZWN0IHRha2UoaW50IHRpbWVvdXQpCi0gICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgd2FpdEluTGluZSsrOwotICAgICAgICB3aGlsZSAocG9vbC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgd2FpdCh0aW1lb3V0KTsKLSAgICAgICAgICAgIGlmICh0aW1lb3V0ID4gMCkgewotICAgICAgICAgICAgICAgIGlmICgoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWUpID4gdGltZW91dCkgewotICAgICAgICAgICAgICAgICAgICB3YWl0SW5MaW5lLS07Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3YWl0SW5MaW5lLS07Ci0gICAgICAgIHJldHVybiBwb29sLnJlbW92ZSgwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0UG9vbEltcGwoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5wb29sID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0aGlzLndhaXRJbkxpbmUgPSAwOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L1dvcmtwaWxlQ29udHJvbGxlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9Xb3JrcGlsZUNvbnRyb2xsZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTk3ZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L1dvcmtwaWxlQ29udHJvbGxlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLQotCi0KLQotcHVibGljIGNsYXNzIFdvcmtwaWxlQ29udHJvbGxlckltcGwgaW1wbGVtZW50cyBJV29ya3BpbGVDb250cm9sbGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgZmluYWwgVGhyZWFkR3JvdXAgdGhyZWFkR3JvdXA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Qgd29ya3BpbGU7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dChSdW5uYWJsZSB3b3JrKSB7Ci0gICAgICAgIFRocmVhZCB0aDsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICB0aCA9IG5ldyBUaHJlYWQodGhyZWFkR3JvdXAsIHdvcmssIG5hbWUgKyAiLSIgKyB3b3JrcGlsZS5zaXplKCkpOwotICAgICAgICAgICAgd29ya3BpbGUuYWRkKHRoKTsKLSAgICAgICAgfQotICAgICAgICB0aC5zZXREYWVtb24odHJ1ZSk7Ci0gICAgICAgIHRoLnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJXUEM6WyIgKyBuYW1lICsgIl06IiArIHRocmVhZEdyb3VwLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdvcmtwaWxlQ29udHJvbGxlckltcGwoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy50aHJlYWRHcm91cCA9IG5ldyBUaHJlYWRHcm91cChuYW1lKTsKLSAgICAgICAgdGhpcy53b3JrcGlsZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9CaWZ1cmNhdGVkT3V0cHV0U3RyZWFtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9CaWZ1cmNhdGVkT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OWU0MTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvQmlmdXJjYXRlZE91dHB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBCaWZ1cmNhdGVkT3V0cHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVyT3V0cHV0U3RyZWFtIHsKLSAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvMjsKLSAgICAgICAgCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzdXBlci5jbG9zZSgpOwotICAgICAgICBvMi5jbG9zZSgpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzdXBlci5mbHVzaCgpOwotICAgICAgICBvMi5mbHVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzdXBlci53cml0ZShiKTsKLSAgICAgICAgbzIud3JpdGUoYik7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgQmlmdXJjYXRlZE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gbzEsIE91dHB1dFN0cmVhbSBvMikgewotICAgICAgICBzdXBlcihvMSk7Ci0gICAgICAgIHRoaXMubzIgPSBvMjsKLSAgICB9Ci19Ci0JCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9CdWZmZXJSYW5nZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvQnVmZmVyUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkZGM3Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9CdWZmZXJSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklCdWZmZXJSYW5nZTsKLQotcHVibGljIGNsYXNzIEJ1ZmZlclJhbmdlIGltcGxlbWVudHMgSUJ1ZmZlclJhbmdlIHsKLSAgICBwcml2YXRlIGludCBmU3RhcnQ7Ci0gICAgcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLSAgICAgICAgCi0gICAgcHVibGljIEJ1ZmZlclJhbmdlKCkgewotICAgIH0KLSAgICAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlLklCdWZmZXJSYW5nZSNyZXNldCgpCi0JICovCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIGZTdGFydCA9IDA7Ci0gICAgICAgIGZMZW5ndGggPSAwOwotICAgIH0KLSAgICAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlLklCdWZmZXJSYW5nZSNzZXRTdGFydChpbnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IHN0YXJ0KSB7Ci0gICAgICAgIGZTdGFydCA9IHN0YXJ0OwotICAgIH0KLSAgICAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlLklCdWZmZXJSYW5nZSNzZXRMZW5ndGgoaW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIGZMZW5ndGggPSBsZW5ndGg7Ci0gICAgfQotICAgICAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmUuSUJ1ZmZlclJhbmdlI2dldFN0YXJ0KCkKLQkgKi8KLSAgICBwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotICAgICAgICByZXR1cm4gZlN0YXJ0OwotICAgIH0KLSAgICAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlLklCdWZmZXJSYW5nZSNnZXRMZW5ndGgoKQotCSAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gZkxlbmd0aDsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZS5JQnVmZmVyUmFuZ2UjdG9TdHJpbmcoKQotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCdbJykuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoZlN0YXJ0KSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnLCcpLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGZMZW5ndGgpKTsKLSAgICAgICAgc2IuYXBwZW5kKCddJyk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0J5dGVCdWZmZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0J5dGVCdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlNjMyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9CeXRlQnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmU7Ci0KLXB1YmxpYyBjbGFzcyBCeXRlQnVmZmVyIHsKLSAgICBwcml2YXRlIGludCBmSWR4OwotICAgIHByaXZhdGUgYnl0ZVtdIGZCdWZmZXI7Ci0gICAgICAgIAotICAgIHB1YmxpYyBCeXRlQnVmZmVyKCkgewotICAgICAgICBmSWR4ID0gMDsKLSAgICAgICAgZkJ1ZmZlciA9IG51bGw7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBpbml0KGludCBidWZmZXJTaXplKSB7Ci0gICAgICAgIGZJZHggPSAwOwotICAgICAgICBmQnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGQoYnl0ZSBkYXRhKSB7Ci0gICAgICAgIGlmIChmSWR4ID49IGZCdWZmZXIubGVuZ3RoKSB7Ci0gICAgICAgICAgICBieXRlW10gbmV3QnVmZmVyID0gbmV3IGJ5dGVbZkJ1ZmZlci5sZW5ndGggKiAyXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZkJ1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCBmQnVmZmVyLmxlbmd0aCk7Ci0gICAgICAgICAgICBmQnVmZmVyID0gbmV3QnVmZmVyOwotICAgICAgICB9Ci0gICAgICAgIGZCdWZmZXJbZklkeCsrXSA9IGRhdGE7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgYnl0ZVtdIGNsb3NlKCkgewotICAgICAgICBpZiAoZklkeCA8PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbZklkeF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZkJ1ZmZlciwgMCwgYnVmLCAwLCBmSWR4KTsKLSAgICAgICAgcmV0dXJuIGJ1ZjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9DaHVua0RlY29kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0NodW5rRGVjb2Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTE2YzA5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0NodW5rRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlkZWtpIFRBSSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuVGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuTG9nZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBDaHVua0RlY29kZXIgZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7Ci0gICAgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENodW5rRGVjb2Rlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ1IgPSAweDBkOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBMRiA9IDB4MGE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFNQID0gMHgyMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSFQgPSAweDA5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPRiA9IC0xOwotCi0gICAgcHJpdmF0ZSBpbnQgZkNodW5rU2l6ZSA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgZk51bUNodW5rID0gMDsKLSAgICBwcml2YXRlIGludCBmUmVhZEJ5dGVzID0gMDsKLSAgICBwcml2YXRlIGxvbmcgZkxhc3RSZWFkVGltZSA9IDA7Ci0gICAgcHJpdmF0ZSBDaHVua0xpc3RlbmVyIGZDaHVua0xpc3RlbmVyID0gbnVsbDsKLS8vICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIGZSZXBsaWNhID0gbnVsbDsKLQotICAgIHB1YmxpYyBDaHVua0RlY29kZXIoSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgc3VwZXIoaW4pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENodW5rTGlzdGVuZXIoQ2h1bmtMaXN0ZW5lciBsKSB7Ci0gICAgICAgIGlmIChmQ2h1bmtMaXN0ZW5lciAhPSBudWxsICYmIGwgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2h1bmtMaXN0ZW5lciBpcyBhbHJlYWR5IHNldDogIiArIGZDaHVua0xpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBmQ2h1bmtMaXN0ZW5lciA9IGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0Q2h1bmtTaXplKCkgewotICAgICAgICBpZiAoZlJlYWRCeXRlcyA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDaHVua1NpemUgaXMgdW5rbm93biIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmQ2h1bmtTaXplOwotICAgIH0KLSAgICAKLS8vICAgIHB1YmxpYyBDaHVua0RlY29kZXIoSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSByZXBsaWNhKSB7Ci0vLyAgICAgICAgc3VwZXIoaW4pOwotLy8gICAgICAgIGZSZXBsaWNhID0gcmVwbGljYTsKLS8vICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBnZXRBdmFpbGFibGVJbnB1dChsb25nIHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBkYXRhOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkYXRhID0gaW4ucmVhZCgpOwotLy8gICAgICAgICAgICAgICAgaWYgKGRhdGEgPj0gMCAmJiBmUmVwbGljYSAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgZlJlcGxpY2Eud3JpdGUoZGF0YSk7Ci0vLyAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBpZiAodGltZW91dCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZMYXN0UmVhZFRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZkxhc3RSZWFkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGZMYXN0UmVhZFRpbWUgPiB0aW1lb3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmTGFzdFJlYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigiSFRUUFJlYWRlci5nZXRBdmFpbGFibGVJbnB1dCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZMYXN0UmVhZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0vKgotICAgICAgICBpZiAodGltZW91dCA+IDApIHsKLSAgICAgICAgICAgIGludCBhdmFpbGFibGU7Ci0gICAgICAgICAgICB3aGlsZSAoKGF2YWlsYWJsZSA9IGluLmF2YWlsYWJsZSgpKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVPRjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlID09IDAKLSAgICAgICAgICAgICAgICBpZiAoZkxhc3RSZWFkVGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZMYXN0UmVhZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBmTGFzdFJlYWRUaW1lID4gdGltZW91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZkxhc3RSZWFkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIkhUVFBSZWFkZXIuZ2V0QXZhaWxhYmxlSW5wdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRhdGEgPSBpbi5yZWFkKCk7Ci0gICAgICAgIGZMYXN0UmVhZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0qLwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBnZXRBdmFpbGFibGVJbnB1dChsb25nIHRpbWVvdXQsIGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBpZiAobGVuIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGludCBhdmFpbGFibGU7Ci0gICAgICAgIGludCBucmVhZCA9IDA7Ci0gICAgICAgIHdoaWxlICgoYXZhaWxhYmxlID0gaW4uYXZhaWxhYmxlKCkpIDw9IDApIHsKLSAgICAgICAgICAgIGlmIChhdmFpbGFibGUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVPRjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGF2YWlsYWJsZSA9PSAwCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGludCBkYXRhID0gaW4ucmVhZCgpOwotICAgICAgICAgICAgICAgIGJbb2ZmKytdID0gKGJ5dGUpIGRhdGE7Ci0gICAgICAgICAgICAgICAgbnJlYWQgPSAxOwotICAgICAgICAgICAgICAgIGxlbiAtPSAxOwotICAgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IGluLmF2YWlsYWJsZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBjYXRjaCAoU29ja2V0VGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmTGFzdFJlYWRUaW1lID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZMYXN0UmVhZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBmTGFzdFJlYWRUaW1lID4gdGltZW91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZkxhc3RSZWFkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYXZhaWxhYmxlID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBucmVhZDsKLSAgICAgICAgfQotICAgICAgICBpZiAobGVuID4gYXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICBsZW4gPSBhdmFpbGFibGU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHJlYWQgPSBpbi5yZWFkKGIsIG9mZiwgbGVuKTsKLSAgICAgICAgZkxhc3RSZWFkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICByZXR1cm4gcmVhZCArIG5yZWFkOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHJlYWRDaHVua1NpemVMaW5lKGxvbmcgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGRhdGEgPSBnZXRBdmFpbGFibGVJbnB1dCh0aW1lb3V0KTsKLSAgICAgICAgaWYgKGRhdGEgPT0gRU9GKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIGNyID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gY3JsZiA9IGZhbHNlOwotICAgICAgICBTdHJpbmdCdWZmZXIgdG9rZW4gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHdoaWxlIChkYXRhICE9IEVPRikgewotICAgICAgICAgICAgc3dpdGNoIChkYXRhKSB7Ci0gICAgICAgICAgICBjYXNlIENSOgotICAgICAgICAgICAgICAgIGNyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTEY6Ci0gICAgICAgICAgICAgICAgaWYgKGNyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNybGYgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlICc7JzoKLSAgICAgICAgICAgIGNhc2UgU1A6Ci0gICAgICAgICAgICBjYXNlIEhUOgotICAgICAgICAgICAgICAgIGNyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGNyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdG9rZW4uYXBwZW5kKChjaGFyKSBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjcmxmKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRva2VuLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3IgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBjcmxmID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkYXRhID0gZ2V0QXZhaWxhYmxlSW5wdXQodGltZW91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRva2VuLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIC8vIDEqKEhFWCkgQ1IgTEYKLSAgICBwcml2YXRlIHZvaWQgcmVhZENodW5rU2l6ZShsb25nIHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0b2tlbiA9IHJlYWRDaHVua1NpemVMaW5lKHRpbWVvdXQpOwotICAgICAgICBmTnVtQ2h1bmsgKz0gMTsKLSAgICAgICAgLy9TdHJpbmcgdG9rZW4gPSByZWFkTmV4dFRva2VuKHRpbWVvdXQsIG91dCk7Ci0gICAgICAgIGlmICh0b2tlbiA9PSBudWxsIHx8IHRva2VuLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGZDaHVua1NpemUgPSBFT0Y7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0b2tlbiA9IHRva2VuLnRyaW0oKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZkNodW5rU2l6ZSA9IEludGVnZXIucGFyc2VJbnQodG9rZW4sIDE2KTsgLy8gUGFyc2UgYSBIRVggbnVtYmVyCi0gICAgICAgICAgICAgICAgaWYgKGZDaHVua0xpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZkNodW5rTGlzdGVuZXIubmV3Q2hhbmtSZWFkKGZOdW1DaHVuaywgZkNodW5rU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBmQ2h1bmtTaXplID0gLTE7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbnZhbGlkIGNodW5rIHNpemUgbGluZTogJyIgKyB0b2tlbiArICInIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHJlYWQobG9uZyB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBpZiAoZlJlYWRCeXRlcyA9PSBmQ2h1bmtTaXplKSB7Ci0gICAgICAgICAgICBmUmVhZEJ5dGVzID0gMDsKLSAgICAgICAgICAgIHJlYWRDaHVua1NpemUodGltZW91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZDaHVua1NpemUgPT0gRU9GIHx8IGZDaHVua1NpemUgPT0gMCkgewotICAgICAgICAgICAgZkNodW5rU2l6ZSA9IEVPRjsKLSAgICAgICAgICAgIHJldHVybiBFT0Y7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGRhdGEgPSBnZXRBdmFpbGFibGVJbnB1dCh0aW1lb3V0KTsKLSAgICAgICAgZlJlYWRCeXRlcyArPSAxOwotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiByZWFkKDApOwotICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbXBvc3NpYmxlIGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZWFkKGxvbmcgdGltZW91dCwgYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChmUmVhZEJ5dGVzID09IGZDaHVua1NpemUpIHsKLSAgICAgICAgICAgIGZSZWFkQnl0ZXMgPSAwOwotICAgICAgICAgICAgcmVhZENodW5rU2l6ZSh0aW1lb3V0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZkNodW5rU2l6ZSA9PSBFT0YgfHwgZkNodW5rU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBmQ2h1bmtTaXplID0gRU9GOwotICAgICAgICAgICAgcmV0dXJuIEVPRjsKLSAgICAgICAgfQotICAgICAgICBpbnQgbWF4ID0gZkNodW5rU2l6ZSAtIGZSZWFkQnl0ZXM7Ci0gICAgICAgIGlmIChsZW4gPiBtYXgpIHsKLSAgICAgICAgICAgIGxlbiA9IG1heDsKLSAgICAgICAgfQotICAgICAgICBpbnQgcmVhZCA9IGdldEF2YWlsYWJsZUlucHV0KHRpbWVvdXQsIGIsIG9mZiwgbGVuKTsKLSAgICAgICAgZlJlYWRCeXRlcyArPSByZWFkOwotICAgICAgICByZXR1cm4gcmVhZDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCByZWFkKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWQoMCwgYiwgb2ZmLCBsZW4pOwotICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbXBvc3NpYmxlIGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpbi5jbG9zZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBhdmFpbGFibGUgPSBpbi5hdmFpbGFibGUoKTsKLSAgICAgICAgaWYgKGF2YWlsYWJsZSA8PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGF2YWlsYWJsZSA+IDAKLSAgICAgICAgaWYgKGZSZWFkQnl0ZXMgPT0gZkNodW5rU2l6ZSkgewotICAgICAgICAgICAgZlJlYWRCeXRlcyA9IDA7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlYWRDaHVua1NpemUoMSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBmUmVhZEJ5dGVzIDwgZkNodW5rU2l6ZQotICAgICAgICBpZiAoZkNodW5rU2l6ZSA9PSBFT0YgfHwgZkNodW5rU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBmQ2h1bmtTaXplID0gRU9GOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgYXZhaWxhYmxlID0gaW4uYXZhaWxhYmxlKCk7Ci0gICAgICAgIGludCBsZWZ0ID0gZkNodW5rU2l6ZSAtIGZSZWFkQnl0ZXM7Ci0gICAgICAgIHJldHVybiAoYXZhaWxhYmxlIDwgbGVmdCkgPyBhdmFpbGFibGUgOiBsZWZ0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChsb25nIGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgZGF0YSA9IHRoaXMucmVhZCgpOwotICAgICAgICAgICAgaWYgKGRhdGEgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtYXJrKGludCByZWFkbGltaXQpIHsKLSAgICAgICAgLy8gbm9wCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG5vcAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvQ2h1bmtFbmNvZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9DaHVua0VuY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThmMDEwZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9DaHVua0VuY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuTG9nZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBDaHVua0VuY29kZXIgZXh0ZW5kcyBGaWx0ZXJPdXRwdXRTdHJlYW0gewotICAgIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihDaHVua0VuY29kZXIuY2xhc3MpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0hVTktfU0laRSA9IDEwMjQ7IAotICAgIAotICAgIHByaXZhdGUgaW50IGZNYXhDaHVua1NpemU7Ci0gICAgcHJpdmF0ZSBieXRlW10gZkNodW5rQnVmZmVyOwotICAgIHByaXZhdGUgaW50IGZDaHVua1NpemU7Ci0gICAgCi0gICAgcHVibGljIENodW5rRW5jb2RlcihPdXRwdXRTdHJlYW0gb3V0KSB7Ci0gICAgICAgIHRoaXMob3V0LCBERUZBVUxUX0NIVU5LX1NJWkUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ2h1bmtFbmNvZGVyKE91dHB1dFN0cmVhbSBvdXQsIGludCBtYXhDaHVua1NpemUpIHsKLSAgICAgICAgc3VwZXIob3V0KTsKLSAgICAgICAgZk1heENodW5rU2l6ZSA9IG1heENodW5rU2l6ZTsKLSAgICAgICAgZkNodW5rU2l6ZSA9IDA7Ci0gICAgICAgIGZDaHVua0J1ZmZlciA9IG5ldyBieXRlW21heENodW5rU2l6ZV07Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldE1heENodW5rU2l6ZShpbnQgbWF4Q2h1bmtTaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoZk1heENodW5rU2l6ZSA9PSBtYXhDaHVua1NpemUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZkNodW5rU2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGZsdXNoQ2h1bmsoKTsKLSAgICAgICAgfQotICAgICAgICBmTWF4Q2h1bmtTaXplID0gbWF4Q2h1bmtTaXplOwotICAgICAgICBmQ2h1bmtCdWZmZXIgPSBuZXcgYnl0ZVttYXhDaHVua1NpemVdOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZkNodW5rQnVmZmVyW2ZDaHVua1NpemUrK10gPSAoYnl0ZSkgYjsKLSAgICAgICAgaWYgKGZDaHVua1NpemUgPT0gZk1heENodW5rU2l6ZSkgewotICAgICAgICAgICAgZmx1c2hDaHVuaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmbHVzaENodW5rKCk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZsdXNoQ2h1bmsoKTsKLSAgICAgICAgb3V0LndyaXRlKCcwJyk7Ci0gICAgICAgIG91dC53cml0ZShIVFRQUmVhZGVyLkNSKTsKLSAgICAgICAgb3V0LndyaXRlKEhUVFBSZWFkZXIuTEYpOwotICAgICAgICBvdXQud3JpdGUoSFRUUFJlYWRlci5DUik7Ci0gICAgICAgIG91dC53cml0ZShIVFRQUmVhZGVyLkxGKTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBmbHVzaENodW5rKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZDaHVua1NpemUgPiAwKSB7Ci0gICAgICAgICAgICBieXRlW10gc2l6ZSA9IEludGVnZXIudG9IZXhTdHJpbmcoZkNodW5rU2l6ZSkuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgICAgIG91dC53cml0ZShzaXplKTsKLSAgICAgICAgICAgIG91dC53cml0ZShIVFRQUmVhZGVyLkNSKTsKLSAgICAgICAgICAgIG91dC53cml0ZShIVFRQUmVhZGVyLkxGKTsKLSAgICAgICAgICAgIG91dC53cml0ZShmQ2h1bmtCdWZmZXIsIDAsIGZDaHVua1NpemUpOwotICAgICAgICAgICAgb3V0LndyaXRlKEhUVFBSZWFkZXIuQ1IpOwotICAgICAgICAgICAgb3V0LndyaXRlKEhUVFBSZWFkZXIuTEYpOwotICAgICAgICAgICAgZkNodW5rU2l6ZSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIENodW5rRW5jb2RlciBlbmNvZGVyID0gbmV3IENodW5rRW5jb2RlcihidWYsIDEwKTsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSAzOTsgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgYiA9IGkgJiAweGZmOwotICAgICAgICAgICAgZW5jb2Rlci53cml0ZShiKTsKLSAgICAgICAgfQotICAgICAgICBlbmNvZGVyLmNsb3NlKCk7Ci0gICAgICAgIAotICAgICAgICBieXRlW10gYSA9IGJ1Zi50b0J5dGVBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGludCBiID0gYVtpXTsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnWycpOwotICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoaSkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJdICIpOwotICAgICAgICAgICAgLy9zYi5hcHBlbmQoIjB4IikuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoYiA+PiA4LCAxNikpLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGIgJiAweGYsIDE2KSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhiKSk7Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCgoY2hhcikgYikpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAnIikuYXBwZW5kKChjaGFyKSBiKS5hcHBlbmQoJ1wnJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICBDaHVua0RlY29kZXIgZGVjb2RlciA9IG5ldyBDaHVua0RlY29kZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGEpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IHRydWU7IGkrKykgewotICAgICAgICAgICAgaW50IGIgPSBkZWNvZGVyLnJlYWQoKTsKLSAgICAgICAgICAgIGlmIChiIDwgMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCdbJyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhpKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIl0gIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhiKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9DaHVua0xpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9DaHVua0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMzRkMDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvQ2h1bmtMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlOwotCi1wdWJsaWMgaW50ZXJmYWNlIENodW5rTGlzdGVuZXIgewotICAgIHZvaWQgbmV3Q2hhbmtSZWFkKGludCBuLCBpbnQgc2l6ZSk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9DaHVua2VkTWVzc2FnZUJvZHlSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0NodW5rZWRNZXNzYWdlQm9keVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGU4MWEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0NodW5rZWRNZXNzYWdlQm9keVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLlRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgQ2h1bmtlZE1lc3NhZ2VCb2R5UmVhZGVyIGV4dGVuZHMgSFRUUFJlYWRlciB7Ci0gICAgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENodW5rZWRNZXNzYWdlQm9keVJlYWRlci5jbGFzcyk7Ci0gICAgCi0gICAgcHVibGljIENodW5rZWRNZXNzYWdlQm9keVJlYWRlcihJbnB1dFN0cmVhbSBpbikgewotICAgICAgICBzdXBlcihpbik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgcmVhZENodW5rZWRNZXNzYWdlKGxvbmcgdGltZW91dCwgT3V0cHV0U3RyZWFtIG91dCwgSFRUUE1lc3NhZ2UgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPR0dFUi5kZWJ1ZygicmVhZENodW5rZWRNZXNzYWdlOiB0aW1lb3V0PSIgKyB0aW1lb3V0KTsKLSAgICAgICAgfQotICAgICAgICBpbnQgdG90YWxDaHVua1NpemUgPSByZWFkQ2h1bmtlZE1lc3NhZ2VCb2R5KHRpbWVvdXQsIG91dCk7Ci0KLSAgICAgICAgSFRUUE1lc3NhZ2VCdWZmZXIgYnVmID0gbXNnLmdldEJ1ZmZlcigpOwotICAgICAgICBIZWFkZXJJbkJ1ZmZlciBoZWFkZXIgPSByZWFkSGVhZGVyKHRpbWVvdXQsIGJ1Zik7Ci0gICAgICAgIHdoaWxlIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbXNnLmFkZFRyYWlsaW5nSGVhZGVyKGhlYWRlcik7Ci0gICAgICAgICAgICBoZWFkZXIgPSByZWFkSGVhZGVyKHRpbWVvdXQsIGJ1Zik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0dHRVIuZGVidWcoInJlYWRDaHVua2VkTWVzc2FnZTogdG90YWxDaHVua1NpemU9IiArIHRvdGFsQ2h1bmtTaXplKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG90YWxDaHVua1NpemU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvQ2xpZW50Q29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvQ2xpZW50Q29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTgzNGYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0NsaWVudENvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuVGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuTG9nZ2VyOwotCi0KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xpZW50Q29ubmVjdGlvbiBpbXBsZW1lbnRzIFJ1bm5hYmxlLCBJQ2xpZW50Q29ubmVjdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQ2xpZW50Q29ubmVjdGlvbi5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENsaWVudENvbm5lY3Rpb25MaXN0ZW5lciBjbGllbnRDb25uZWN0aW9uTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBmUXVldWVTaXplOwotCi0gICAgLy8gcHJpdmF0ZSBmaW5hbCBBc3luY1dvcmtNYW5hZ2VyIGZEaXNwYXRjaFdvcmtNYW47Ci0KLSAgICBwcml2YXRlIGxvbmcgZktlZXBBbGl2ZTsKLQotICAgIHByaXZhdGUgU29ja2V0IGZDbGllbnRTb2NrZXQ7Ci0KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGZDbGllbnRJbjsKLQotICAgIHByaXZhdGUgQnVmZmVyZWRPdXRwdXRTdHJlYW0gZkNsaWVudE91dDsKLQotICAgIHByaXZhdGUgSFRUUFJlcXVlc3RSZWFkZXIgZlJlYWRlcjsKLQotICAgIHByaXZhdGUgUmVxdWVzdERpc3BhdGNoZXIgZkRpc3BhdGNoZXI7Ci0KLSAgICBwcml2YXRlIGxvbmcgZkxhc3RSZWFkVGltZSA9IDA7Ci0KLSAgICBwcml2YXRlIGxvbmcgZk1lc3NhZ2VTZXJpYWwgPSAwOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSGFuZGxpbmdSZXF1ZXN0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29ubmVjdGlvbk5hbWU7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb25uZWN0aW9uTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLmNvbm5lY3Rpb25OYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGdldFF1ZXVlU2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIGZRdWV1ZVNpemU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsaWVudENvbm5lY3Rpb24oQ2xpZW50Q29ubmVjdGlvbkxpc3RlbmVyIGNsaWVudENvbm5lY3Rpb25MaXN0ZW5lciwgaW50IHF1ZXVlU2l6ZSkgewotICAgICAgICB0aGlzLmNsaWVudENvbm5lY3Rpb25MaXN0ZW5lciA9IGNsaWVudENvbm5lY3Rpb25MaXN0ZW5lcjsKLSAgICAgICAgZlF1ZXVlU2l6ZSA9IHF1ZXVlU2l6ZTsKLSAgICAgICAgLy8gZkRpc3BhdGNoV29ya01hbiA9IGRpc3BhdGNoV29ya01hbjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb24jcmVzZXRDb25uZWN0aW9uKCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldENvbm5lY3Rpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZkNsaWVudFNvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZDbGllbnRJbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZDbGllbnRJbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZkNsaWVudE91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZDbGllbnRPdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFmQ2xpZW50U29ja2V0LmlzQ2xvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZkNsaWVudFNvY2tldC5zZXRTb0xpbmdlcih0cnVlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgZkNsaWVudFNvY2tldC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmQ2xpZW50U29ja2V0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIFdBUk5JTkcoIkZhaWxlZCB0byBzaHV0IGRvd24gYSBjbGllbnQgb3V0cHV0IGNvbm5lY3Rpb24gKElPRXhjZXB0aW9uKTogIiArIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JQ2xpZW50Q29ubmVjdGlvbiNjbG9zZSgpCi0JICovCi0gICAgcHVibGljIFN0cmluZyBjbG9zZSgpIHsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBERUJVRygiU2h1dGRvd24gYSBjbGllbnQgc29ja2V0OiBsYXN0UmVhZFRpbWU9IiArIGZMYXN0UmVhZFRpbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmRGlzcGF0Y2hlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmRGlzcGF0Y2hlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmQ2xpZW50U29ja2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZkNsaWVudFNvY2tldC5zaHV0ZG93bklucHV0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZDbGllbnRJbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZDbGllbnRJbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgV0FSTklORygiRmFpbGVkIHRvIGNsb3NlIGEgY2xpZW50IGNvbm5lY3Rpb24gKElPRXhjZXB0aW9uKTogIiArIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY05hbWVUbXAgPSBjb25uZWN0aW9uTmFtZTsKLSAgICAgICAgY29ubmVjdGlvbk5hbWUgPSBudWxsOwotICAgICAgICBmQ2xpZW50U29ja2V0ID0gbnVsbDsKLSAgICAgICAgZkNsaWVudE91dCA9IG51bGw7Ci0gICAgICAgIGZSZWFkZXIgPSBudWxsOwotICAgICAgICBmRGlzcGF0Y2hlciA9IG51bGw7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ0xPU0UiKTsKLSAgICAgICAgY2xpZW50Q29ubmVjdGlvbkxpc3RlbmVyLmNvbm5lY3Rpb25DbG9zZWQodGhpcyk7Ci0gICAgICAgIHJldHVybiBjTmFtZVRtcDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0SW50ZXJuYWwoU29ja2V0IGNsaWVudFNvY2ssIGxvbmcga2VlcEFsaXZlLCBpbnQgdGltZW91dCwgUmVxdWVzdERpc3BhdGNoZXIgZGlzcGF0Y2hlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZDbGllbnRTb2NrZXQgPSBjbGllbnRTb2NrOwotICAgICAgICBmQ2xpZW50U29ja2V0LnNldFNvVGltZW91dCh0aW1lb3V0KTsKLSAgICAgICAgZkNsaWVudEluID0gY2xpZW50U29jay5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICBmQ2xpZW50T3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBTb2NrZXRUaW1lb3V0UmV0cnlPdXRwdXRTdHJlYW0oY2xpZW50U29jay5nZXRPdXRwdXRTdHJlYW0oKSkpOwotICAgICAgICBmS2VlcEFsaXZlID0ga2VlcEFsaXZlOwotICAgICAgICBmUmVhZGVyID0gZGlzcGF0Y2hlci5jcmVhdGVIVFRQUmVxdWVzdFJlYWRlcihmQ2xpZW50SW4pOwotICAgICAgICBpc0hhbmRsaW5nUmVxdWVzdCA9IGZhbHNlOwotICAgICAgICBmRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7Ci0gICAgICAgIGZEaXNwYXRjaGVyLnN0YXJ0KCk7Ci0gICAgICAgIERFQlVHKCJJbml0aWFsaXplZCIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBIVFRQUmVxdWVzdE1lc3NhZ2UgY3JlYXRlSFRUUFJlcXVlc3RNZXNzYWdlKGxvbmcgbXNnU2VyaWFsKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSFRUUFJlcXVlc3RNZXNzYWdlKG1zZ1NlcmlhbCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JQ2xpZW50Q29ubmVjdGlvbiNnZXRDbGllbnRTb2NrZXQoKQotCSAqLwotICAgIHB1YmxpYyBTb2NrZXQgZ2V0Q2xpZW50U29ja2V0KCkgewotICAgICAgICByZXR1cm4gZkNsaWVudFNvY2tldDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb24jZ2V0Q3VycmVudFNlcnZlckdyb3VwSW5kZXgoKQotCSAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFNlcnZlckdyb3VwSW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiBjbGllbnRDb25uZWN0aW9uTGlzdGVuZXIuZ2V0Q3VycmVudFNlcnZlckdyb3VwSW5kZXgoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb24jaXNIYW5kbGluZ1JlcXVlc3QoKQotCSAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0hhbmRsaW5nUmVxdWVzdCgpIHsKLSAgICAgICAgcmV0dXJuIGlzSGFuZGxpbmdSZXF1ZXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0SGFuZGxpbmdSZXF1ZXN0KGJvb2xlYW4gYikgewotICAgICAgICBpc0hhbmRsaW5nUmVxdWVzdCA9IGI7Ci0gICAgICAgIGlmICghaXNIYW5kbGluZ1JlcXVlc3QpIHsKLSAgICAgICAgICAgIHRoaXMubm90aWZ5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHdhaXRIYW5kbGluZ1JlcXVlc3RGaW5pc2goKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICB3aGlsZSAoaXNIYW5kbGluZ1JlcXVlc3QpIHsKLSAgICAgICAgICAgIHRoaXMud2FpdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVxdWVzdFJlY2VpdmVkKElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCkgewotICAgICAgICAvLyBub3AKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb24jc2VuZFJlc3BvbnNlKGxvbmcsIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5IVFRQUmVzcG9uc2VNZXNzYWdlLCBib29sZWFuKQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRSZXNwb25zZShsb25nIHRpbWVvdXQsIElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlLCBib29sZWFuIHJlYWR5VG9IYW5kbGVSZXF1ZXN0KQotICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIAotICAgIHsKLSAgICAgICAgaWYgKGZDbGllbnRPdXQgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIGlmICghaXNIYW5kbGluZ1JlcXVlc3QoKSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIqKioqKklOVkFMSUQgU1RBVEU6IHJlc3BvbnNlPSIgKyByZXNwb25zZSk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgtMSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlNlbmQgYSByZXNwb25zZSB0byB0aGUgY2xpZW50OiBzZXJpYWw9IikuYXBwZW5kKHJlc3BvbnNlLmdldFNlcmlhbCgpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgdGlkPSIpLmFwcGVuZChyZXNwb25zZS5nZXRUaWQoKSk7Ci0gICAgICAgICAgICAgICAgREVCVUcoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgU3RyaW5nKHJlc3BvbnNlLmdldE1lc3NhZ2VCb2R5KCkpKTsKLSAgICAgICAgICAgIC8vIHJlc3BvbnNlLndyaXRlSGVhZGVycyhTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlJlc3BvbnNlIGFycml2ZWQ6IHRpZD0iKS5hcHBlbmQocmVzcG9uc2UuZ2V0VGlkKCkpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBtc2dTZXJpYWw9IikuYXBwZW5kKHJlc3BvbnNlLmdldFNlcmlhbCgpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxuX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1xuIik7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9iID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBCaWZ1cmNhdGVkT3V0cHV0U3RyZWFtIG8gPSBuZXcgQmlmdXJjYXRlZE91dHB1dFN0cmVhbShmQ2xpZW50T3V0LCBvYik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLndyaXRlKHRpbWVvdXQsIG8pOwotICAgICAgICAgICAgICAgICAgICBvYi5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQob2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbm9wCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXG5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+XG4iKTsKLSAgICAgICAgICAgICAgICBERUJVRyhzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uud3JpdGUodGltZW91dCwgZkNsaWVudE91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmQ2xpZW50T3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICBpZiAocmVzcG9uc2UuaXNDb25uZWN0aW9uVG9CZUNsb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZkNsaWVudFNvY2tldC5zaHV0ZG93bk91dHB1dCgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigiVGhpcyBjb25uZWN0aW9uIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuIik7Ci0gICAgICAgICAgICB9Ci0vKgotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIkZhaWxlZCB0byBzZW5kIGEgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCAoSU9FeGNlcHRpb24pIDogdGlkPSIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHJlc3BvbnNlLmdldFRpZCgpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBtZXNzYWdlPSIpLmFwcGVuZChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBMT0dHRVIud2FybmluZyhzYi50b1N0cmluZygpKTsKLSovCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBhc3NlcnQgaXNIYW5kbGluZ1JlcXVlc3QoKTsKLSAgICAgICAgICAgIGlmIChyZWFkeVRvSGFuZGxlUmVxdWVzdCkgewotICAgICAgICAgICAgICAgIHNldEhhbmRsaW5nUmVxdWVzdChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb24jc2VuZFJlc3BvbnNlKGxvbmcsIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlTWVzc2FnZSkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kUmVzcG9uc2UobG9uZyB0aW1lb3V0LCBJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSkgCi0gICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gCi0gICAgewotICAgICAgICBzZW5kUmVzcG9uc2UodGltZW91dCwgcmVzcG9uc2UsIHRydWUpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb24jc2VuZFJlc3BvbnNlKG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5IVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UpCi0JICovCi0gICAgcHVibGljIHZvaWQgc2VuZFJlc3BvbnNlKElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlKQotICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VuZFJlc3BvbnNlKDAsIHJlc3BvbnNlKTsKLSAgICAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRpbWVvdXQ6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFR1bm5lbFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0gICAgICAgIHByaXZhdGUgYnl0ZVtdIGJ1ZmZlcjsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGVUFMVF9UVU5ORUxfQlVGRkVSX1NJWkUgPSAxMDI0OwotCi0gICAgICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaXM7Ci0KLSAgICAgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3M7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGV4aXRlZDsKLQotICAgICAgICBzeW5jaHJvbml6ZWQgcHJpdmF0ZSB2b2lkIGV4aXQoKSB7Ci0gICAgICAgICAgICBleGl0ZWQgPSB0cnVlOwotICAgICAgICAgICAgbm90aWZ5QWxsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgd2FpdEV4aXQoKSB7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdhaXQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gaXMuYXZhaWxhYmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gYnVmZmVyLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGlzLnJlYWQoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoIi0tLS1UVU5ORUwtLS0+XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKHNpemUgPiAwKSA/IG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBzaXplKSA6ICIiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXG4tLS0tVFVOTkVMLS0tPlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShidWZmZXIsIDAsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3MuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBleGl0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBUdW5uZWxUaHJlYWQoSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcykgewotICAgICAgICAgICAgdGhpcy5pcyA9IGlzOwotICAgICAgICAgICAgdGhpcy5vcyA9IG9zOwotICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgYnl0ZVtERUZVQUxUX1RVTk5FTF9CVUZGRVJfU0laRV07Ci0gICAgICAgICAgICB0aGlzLmV4aXRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUNsaWVudENvbm5lY3Rpb24jYWxsb3dUdW5uZWwob3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLkhUVFBSZXF1ZXN0TWVzc2FnZSwgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLlNlcnZlckNvbm5lY3Rpb24sIGxvbmcpCi0JICovCi0gICAgcHVibGljIHZvaWQgYWxsb3dUdW5uZWwoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXEsIFNlcnZlckNvbm5lY3Rpb24gc2MsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgREVCVUcoIkNPTk5FQ1QgdG8gIiArIHNjLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZW5kUmVzcG9uc2UodGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKHJlcS5nZXRTZXJpYWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElIVFRQSGVhZGVyLkhUVFBfVkVSU0lPTl8xXzBfQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDAiLmdldEJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT0siLmdldEJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSFRUUFJlc3BvbnNlTWVzc2FnZS5FTVBUWV9CT0RZKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICBUdW5uZWxUaHJlYWQgYzJzID0gbmV3IFR1bm5lbFRocmVhZChmQ2xpZW50SW4sIHNjLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIFR1bm5lbFRocmVhZCBzMmMgPSBuZXcgVHVubmVsVGhyZWFkKHNjLmdldElucHV0U3RyZWFtKCksIGZDbGllbnRPdXQpOwotICAgICAgICAgICAgREVCVUcoIlR1bm5lbCBpcyBzdGFydGVkLiIpOwotICAgICAgICAgICAgYzJzLnN0YXJ0KCk7Ci0gICAgICAgICAgICBzMmMuc3RhcnQoKTsKLSAgICAgICAgICAgIGMycy53YWl0RXhpdCgpOwotICAgICAgICAgICAgczJjLndhaXRFeGl0KCk7Ci0gICAgICAgICAgICBERUJVRygiVHVubmVsIGlzIGZpbmlzaGVkLiIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2V0SGFuZGxpbmdSZXF1ZXN0KGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JQ2xpZW50Q29ubmVjdGlvbiNyZWplY3RUdW5uZWwob3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLkhUVFBSZXF1ZXN0TWVzc2FnZSwgbG9uZykKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCByZWplY3RUdW5uZWwoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXEsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHNlbmRSZXNwb25zZSh0aW1lb3V0LAotICAgICAgICAgICAgICAgIG5ldyBIVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UocmVxLmdldFNlcmlhbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgSUhUVFBIZWFkZXIuSFRUUF9WRVJTSU9OXzFfMF9BLAotICAgICAgICAgICAgICAgICAgICAgICAgIjQwNSIuZ2V0Qnl0ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJNZXRob2QgTm90IEFsbG93ZWQiLmdldEJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBJSFRUUFJlc3BvbnNlTWVzc2FnZS5FTVBUWV9CT0RZKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklDbGllbnRDb25uZWN0aW9uI3J1bigpCi0JICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBERUJVRygiUmVhZGVyIHRocmVhZCBzdGFydGVkIik7Ci0gICAgICAgIFN0cmluZyBjTmFtZVRtcDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZMYXN0UmVhZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotICAgICAgICAgICAgc2V0SGFuZGxpbmdSZXF1ZXN0KGZhbHNlKTsKLSAgICAgICAgICAgIEhUVFBSZXF1ZXN0TWVzc2FnZSByZWNlaXZlZFJlcXVlc3QgPSBudWxsOwotICAgICAgICAgICAgbG9uZyB0aW1lb3V0ID0gZktlZXBBbGl2ZTsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICB3YWl0SGFuZGxpbmdSZXF1ZXN0RmluaXNoKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWFkIG5leHQgcmVxdWVzdAotICAgICAgICAgICAgICAgIGlmIChyZWNlaXZlZFJlcXVlc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0SGFuZGxpbmdSZXF1ZXN0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBtc2dTZXJpYWwgPSBmTWVzc2FnZVNlcmlhbCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnU2VyaWFsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTWVzc2FnZVNlcmlhbCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZFJlcXVlc3QgPSBjcmVhdGVIVFRQUmVxdWVzdE1lc3NhZ2UobXNnU2VyaWFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJyZWFkIHcvIHRpbWVvdXQ6ICIgKyB0aW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmVhZGVyLnJlYWRNZXNzYWdlKHJlY2VpdmVkUmVxdWVzdCwgdGltZW91dCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVRygicmVhZCB3L28gdGltZW91dCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSZWFkZXIucmVhZE1lc3NhZ2UocmVjZWl2ZWRSZXF1ZXN0LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmTGFzdFJlYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gZktlZXBBbGl2ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RSZWNlaXZlZChyZWNlaXZlZFJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjZWl2ZWRSZXF1ZXN0LnNldFRpZChmVGlkR2VuLmdldElEKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZk1lc3NhZ2VTZXJpYWwgPSBtc2dTZXJpYWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJSZWFkIGEgcmVxdWVzdDogIikuYXBwZW5kKGNvbm5lY3Rpb25OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgc2VyaWFsPSIpLmFwcGVuZChyZWNlaXZlZFJlcXVlc3QuZ2V0U2VyaWFsKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCB0aWQ9IikuYXBwZW5kKHJlY2VpdmVkUmVxdWVzdC5nZXRUaWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlZFJlcXVlc3Qud3JpdGVIZWFkZXJzKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEhhbmRsaW5nUmVxdWVzdChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZFJlcXVlc3QgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiUmVxdWVzdCByZWFkaW5nIHRpbWVvdXQ6IGxhc3RSZWFkVGltZT0iKS5hcHBlbmQoZkxhc3RSZWFkVGltZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsIGVsYXBzZWQ9IikuYXBwZW5kKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gZkxhc3RSZWFkVGltZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBTZW5kIGEgcmVxdWVzdCB0byBhIHNlcnZlcgotICAgICAgICAgICAgICAgIGlmIChyZWNlaXZlZFJlcXVlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZkRpc3BhdGNoZXIucHV0UmVxdWVzdChyZWNlaXZlZFJlcXVlc3QsIDEwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlNlbnQgYSByZXF1ZXN0OiBzZXJpYWw9IikuYXBwZW5kKHJlY2VpdmVkUmVxdWVzdC5nZXRTZXJpYWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsIHRpZD0iKS5hcHBlbmQocmVjZWl2ZWRSZXF1ZXN0LmdldFRpZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVRyhzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkUmVxdWVzdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgdHJ5IGFnYWluIGluIHRoZSBuZXh0IGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlRocmVhZCBpbnRlcnJ1cHRlZCAoRGlzcGF0Y2hlci5wdXRSZXF1ZXN0KTogc2VyaWFsPSIpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkUmVxdWVzdC5nZXRTZXJpYWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlLCB0cnkgYWdhaW4gaW4gdGhlIG5leHQgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiUXVldWUgb3ZlcmZsb3cgKERpc3BhdGNoZXIucHV0UmVxdWVzdCk6IHNlcmlhbD0iKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZFJlcXVlc3QuZ2V0U2VyaWFsKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoaXNIYW5kbGluZ1JlcXVlc3QoKSB8fCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGZMYXN0UmVhZFRpbWUgPCBmS2VlcEFsaXZlKTsKLSAgICAgICAgICAgIC8vIFdBUk5JTkcoIlpaWlogRklOSVNISU5HOiBpc0hhbmRsaW5nUmVxdWVzdD0iICsKLSAgICAgICAgICAgIC8vIGlzSGFuZGxpbmdSZXF1ZXN0KTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaW50ZXJydXB0ZWQpIHsKLSAgICAgICAgICAgIC8vIG5vcAotICAgICAgICAgICAgLy8gV0FSTklORygiSW50ZXJydXB0ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoSFRUUENvbm5lY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAJREVCVUcoIlRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBieSB0aGUgcGVlci4iKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAvLyBFeGNlcHRpb24gZnJvbSB0aGUgSW5wdXRTdHJlYW0KLSAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIERFQlVHKCJDbGllbnQgY29ubmVjdGlvbiBpcyBsb3N0OiAiICsgaW9lLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgaW9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY05hbWVUbXAgPSBjbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIERFQlVHKGNOYW1lVG1wLCAiUmVhZGVyIHRocmVhZCBzdG9wcGVkIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIERFQlVHKFN0cmluZyBuYW1lLCBTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgc2IuYXBwZW5kKG5hbWUpLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChtc2cpOwotICAgICAgICAgICAgTE9HR0VSLmRlYnVnKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIERFQlVHKFN0cmluZyBtc2cpIHsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoY29ubmVjdGlvbk5hbWUpLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChtc2cpOwotICAgICAgICAgICAgTE9HR0VSLmRlYnVnKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIFdBUk5JTkcoU3RyaW5nIG1zZykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZChjb25uZWN0aW9uTmFtZSkuYXBwZW5kKCI6ICIpOwotICAgICAgICBzYi5hcHBlbmQobXNnKTsKLSAgICAgICAgTE9HR0VSLndhcm5pbmcoc2IudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvQ2xpZW50Q29ubmVjdGlvbkxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9DbGllbnRDb25uZWN0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4OGMwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9DbGllbnRDb25uZWN0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JQ2xpZW50Q29ubmVjdGlvbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENsaWVudENvbm5lY3Rpb25MaXN0ZW5lciB7Ci0gICAgdm9pZCBjb25uZWN0aW9uQ2xvc2VkKElDbGllbnRDb25uZWN0aW9uIGNvbik7Ci0gICAgaW50IGdldEN1cnJlbnRTZXJ2ZXJHcm91cEluZGV4KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9GaXhlZFNpemVRdWV1ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvRml4ZWRTaXplUXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMxMDlkMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9GaXhlZFNpemVRdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlkZWtpIFRBSSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLlRpbWVvdXRFeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEZpeGVkU2l6ZVF1ZXVlIHsKLSAgICBwcml2YXRlIE9iamVjdFtdIGZRdWV1ZTsKLSAgICBwcml2YXRlIGludCBmU2l6ZTsKLSAgICBwcml2YXRlIGludCBmTmV4dEluZGV4ID0gMDsKLSAgICBwcml2YXRlIGludCBmTWluSW5kZXggPSAwOwotICAgICAgICAKLSAgICBwdWJsaWMgRml4ZWRTaXplUXVldWUoaW50IHF1ZXVlU2l6ZSkgewotICAgICAgICBmUXVldWUgPSBuZXcgT2JqZWN0W3F1ZXVlU2l6ZV07Ci0gICAgICAgIGZTaXplID0gcXVldWVTaXplOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIGludCBnZXRRdWV1ZVNpemUoKSB7Ci0gICAgICAgIHJldHVybiBmU2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIGlmIChmTWluSW5kZXggIT0gZk5leHRJbmRleCkgewotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGZRdWV1ZVtmTWluSW5kZXgrK10gPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChmTWluSW5kZXggPiBmU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBmTWluSW5kZXggPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKGZNaW5JbmRleCAhPSBmTmV4dEluZGV4KTsgCi0gICAgICAgIH0KLSAgICAgICAgZk5leHRJbmRleCA9IDA7Ci0gICAgICAgIGZNaW5JbmRleCA9IDA7Ci0gICAgICAgIGZRdWV1ZVswXSA9IG51bGw7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIChmTmV4dEluZGV4ID09IGZNaW5JbmRleCk7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRTaXplKCkgewotICAgICAgICBpbnQgZCA9IGZOZXh0SW5kZXggLSBmTWluSW5kZXg7Ci0gICAgICAgIHJldHVybiAoZCA+PSAwKSA/IGQgOiBkICsgZlNpemU7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHV0KE9iamVjdCBvYmopIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChmUXVldWVbZk5leHRJbmRleF0gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy53YWl0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZlF1ZXVlW2ZOZXh0SW5kZXgrK10gPSBvYmo7Ci0gICAgICAgIGlmIChmTmV4dEluZGV4ID49IGZTaXplKSB7Ci0gICAgICAgICAgICBmTmV4dEluZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICB0aGlzLm5vdGlmeUFsbCgpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHB1dChPYmplY3Qgb2JqLCBsb25nIHRpbWVvdXQpIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aW1lb3V0ID09IDApIHsKLSAgICAgICAgICAgIHB1dChvYmopOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZRdWV1ZVtmTmV4dEluZGV4XSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyB0MCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGxvbmcgd2FpdCA9IHRpbWVvdXQ7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB0aW1lZG91dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICB0aGlzLndhaXQod2FpdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmUXVldWVbZk5leHRJbmRleF0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGltZWRvdXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdDA7Ci0gICAgICAgICAgICAgICAgICAgIHdhaXQgPSB0aW1lb3V0IC0gZWxhcHNlZDsKLSAgICAgICAgICAgICAgICB9IHdoaWxlICh3YWl0ID4gMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVkb3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJGaXhlZFNpemVRdWV1ZS5wdXQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmUXVldWVbZk5leHRJbmRleCsrXSA9IG9iajsKLSAgICAgICAgICAgIGlmIChmTmV4dEluZGV4ID49IGZTaXplKSB7Ci0gICAgICAgICAgICAgICAgZk5leHRJbmRleCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLm5vdGlmeUFsbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcmVtb3ZlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IHJlcTsKLSAgICAgICAgd2hpbGUgKChyZXEgPSBmUXVldWVbZk1pbkluZGV4XSkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy53YWl0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZlF1ZXVlW2ZNaW5JbmRleCsrXSA9IG51bGw7Ci0gICAgICAgIGlmIChmTWluSW5kZXggPj0gZlNpemUpIHsKLSAgICAgICAgICAgIGZNaW5JbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5ub3RpZnlBbGwoKTsKLSAgICAgICAgcmV0dXJuIHJlcTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHJlbW92ZShsb25nIHRpbWVvdXQpIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCByZXEgPSBmUXVldWVbZk1pbkluZGV4XTsKLSAgICAgICAgaWYgKHJlcSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb25nIHQwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBsb25nIHdhaXQgPSB0aW1lb3V0OwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHRoaXMud2FpdCh3YWl0KTsKLSAgICAgICAgICAgICAgICBpZiAoKHJlcSA9IGZRdWV1ZVtmTWluSW5kZXhdKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb25nIGVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQwOwotICAgICAgICAgICAgICAgIHdhaXQgPSB0aW1lb3V0IC0gZWxhcHNlZDsKLSAgICAgICAgICAgIH0gd2hpbGUgKHdhaXQgPiAwKTsKLSAgICAgICAgICAgIGlmIChyZXEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJGaXhlZFNpemVRdWV1ZS5yZW1vdmUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmUXVldWVbZk1pbkluZGV4KytdID0gbnVsbDsKLSAgICAgICAgaWYgKGZNaW5JbmRleCA+PSBmU2l6ZSkgewotICAgICAgICAgICAgZk1pbkluZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICB0aGlzLm5vdGlmeUFsbCgpOwotICAgICAgICByZXR1cm4gcmVxOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3Qgbm9uQmxvY2tpbmdSZW1vdmUoKSB7Ci0gICAgICAgIE9iamVjdCByZXEgPSBmUXVldWVbZk1pbkluZGV4XTsKLSAgICAgICAgaWYgKHJlcSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmUXVldWVbZk1pbkluZGV4KytdID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChmTWluSW5kZXggPj0gZlNpemUpIHsKLSAgICAgICAgICAgICAgICBmTWluSW5kZXggPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5ub3RpZnlBbGwoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVxOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgbWF0Y2hBbmRSZW1vdmUoT2JqZWN0IG8sIENvbXBhcmF0b3IgY29tcGFyYXRvcikgewotICAgICAgICBpZiAobyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IHJlcSA9IGZRdWV1ZVtmTWluSW5kZXhdOwotICAgICAgICBpZiAocmVxID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21wYXJhdG9yLmNvbXBhcmUobywgcmVxKSA9PSAwKSB7Ci0gICAgICAgICAgICBmUXVldWVbZk1pbkluZGV4KytdID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChmTWluSW5kZXggPj0gZlNpemUpIHsKLSAgICAgICAgICAgICAgICBmTWluSW5kZXggPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5ub3RpZnlBbGwoKTsKLSAgICAgICAgICAgIHJldHVybiByZXE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBDb25uZWN0aW9uRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9IVFRQQ29ubmVjdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ2Yjg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBDb25uZWN0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSFRUUENvbm5lY3Rpb25FeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjE1MTcxNzMyMzA3NzQ4ODY0MUw7Ci0KLQlwdWJsaWMgSFRUUENvbm5lY3Rpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIobWVzc2FnZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUEhlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUEhlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODEyNDcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBIZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSFRUUEhlYWRlciBpbXBsZW1lbnRzIElIVFRQSGVhZGVyIHsKLSAgICBwdWJsaWMgc3RhdGljIGJ5dGUgdG9VcGNhc2UoYnl0ZSBiKSB7Ci0gICAgICAgIGlmICgoYiA+PSAnYScpICYmIChiIDw9ICd6JykpIHsKLSAgICAgICAgICAgIHJldHVybiAoYnl0ZSkgKGIgLSAoJ2EnIC0gJ0EnKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmUoYnl0ZVtdIHYxLCBieXRlW10gdjIpIHsKLSAgICAgICAgaW50IGxlbiA9IHYxLmxlbmd0aDsKLSAgICAgICAgaWYgKGxlbiAhPSB2Mi5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGlmICh2MVtpXSAhPSB2MltpXSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZUlnbm9yZUNhc2UoYnl0ZVtdIHYxLCBieXRlW10gdjIpIHsKLSAgICAgICAgaW50IGxlbiA9IHYxLmxlbmd0aDsKLSAgICAgICAgaWYgKGxlbiAhPSB2Mi5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGlmIChIVFRQSGVhZGVyLnRvVXBjYXNlKHYxW2ldKSAhPSBIVFRQSGVhZGVyLnRvVXBjYXNlKHYyW2ldKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZW1vdmVkID0gZmFsc2U7Ci0gICAgCi0gICAgcHJvdGVjdGVkIEhUVFBIZWFkZXIoKSB7Ci0gICAgfQotICAgICAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXIjc2V0UmVtb3ZlZChib29sZWFuKQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlbW92ZWQoYm9vbGVhbiByZW1vdmVkKSB7Ci0gICAgCWlzUmVtb3ZlZCA9IHJlbW92ZWQ7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUEhlYWRlciNpc1JlbW92ZWQoKQotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVtb3ZlZCgpIHsKLSAgICAJcmV0dXJuIGlzUmVtb3ZlZDsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyI2lzRmllbGROYW1lRXF1YWxzVG8oYnl0ZVtdKQotCSAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRmllbGROYW1lRXF1YWxzVG8oYnl0ZVtdIG5hbWUpOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyI2lzRmllbGRWYWx1ZUVxdWFsc1RvKGJ5dGVbXSkKLQkgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0ZpZWxkVmFsdWVFcXVhbHNUbyhieXRlW10gdmFsdWUpOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyI2dldE5hbWUoKQotCSAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0TmFtZSgpOwotICAgICAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXIjZ2V0VmFsdWUoKQotCSAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0VmFsdWUoKTsKLSAgICAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyI3NldFZhbHVlKGJ5dGVbXSkKLQkgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRWYWx1ZShieXRlW10gdmFsdWUpOwotICAgIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSGVhZGVyU2VwYXJhdG9yKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC53cml0ZSgnOicpOwotICAgICAgICBvdXQud3JpdGUoSFRUUFJlYWRlci5TUCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyI2NvbXBhcmVWYWx1ZShieXRlW10pCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gY29tcGFyZVZhbHVlKGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gY29tcGFyZShnZXRWYWx1ZSgpLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyI2NvbXBhcmVWYWx1ZUlnbm9yZUNhc2UoYnl0ZVtdKQotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbXBhcmVWYWx1ZUlnbm9yZUNhc2UoYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlSWdub3JlQ2FzZShnZXRWYWx1ZSgpLCB2YWx1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUEhlYWRlciN3cml0ZUxpbmUoamF2YS5pby5PdXRwdXRTdHJlYW0pCi0JICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVMaW5lKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgCWlmICghaXNSZW1vdmVkKSB7Ci0gICAgICAgICAgICB3cml0ZShvdXQpOwotICAgICAgICAgICAgb3V0LndyaXRlKEhUVFBSZWFkZXIuQ1IpOwotICAgICAgICAgICAgb3V0LndyaXRlKEhUVFBSZWFkZXIuTEYpOwotICAgIAl9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJIZWFkZXI6IiArIG5ldyBTdHJpbmcoZ2V0TmFtZSgpKSArICI6IiArIG5ldyBTdHJpbmcoZ2V0VmFsdWUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUE1hbGZvcm1lZFJlc3BvbnNlTWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUE1hbGZvcm1lZFJlc3BvbnNlTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzYzYmRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBNYWxmb3JtZWRSZXNwb25zZU1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBIVFRQTWFsZm9ybWVkUmVzcG9uc2VNZXNzYWdlIGV4dGVuZHMgSFRUUFJlc3BvbnNlTWVzc2FnZSB7Ci0gICAgcHJpdmF0ZSBJT0V4Y2VwdGlvbiBleGNlcHRpb247Ci0KLSAgICBwdWJsaWMgSU9FeGNlcHRpb24gZ2V0SU9FeGNlcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBleGNlcHRpb247Ci0gICAgfQotCi0gICAgSFRUUE1hbGZvcm1lZFJlc3BvbnNlTWVzc2FnZShsb25nIHNlcmlhbCwgSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgIHN1cGVyKHNlcmlhbCk7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uID0gZXhjZXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SFRUUFZlcnNpb25Bc1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRIVFRQVmVyc2lvbkFzQnl0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzQ29kZUFzU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldFN0YXR1c0NvZGVBc0J5dGVzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlYXNvblBocmFzZUFzU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldFJlYXNvblBocmFzZUFzQnl0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlRmlyc3RMaW5lKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSFRUUE1hbGZvcm1lZFJlc3BvbnNlTWVzc2FnZSBjYW5ub3QgYmUgb3V0cHV0LiIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBNZXNzYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9IVFRQTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzI1MjA2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBLZW50YXJvdSBGVUtVREEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSU1lc3NhZ2VCb2R5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5UaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5Mb2dnZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBIVFRQTWVzc2FnZSBpbXBsZW1lbnRzIElIVFRQTWVzc2FnZSB7Ci0Jc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEhUVFBNZXNzYWdlLmNsYXNzKTsKLQotCXByaXZhdGUgdHJhbnNpZW50IGxvbmcgZlNlcmlhbDsKLQlwcml2YXRlIEhUVFBNZXNzYWdlQnVmZmVyIGZCdWZmZXI7Ci0JcHJpdmF0ZSBJTWVzc2FnZUJvZHkgZk9yaWdpbmFsTWVzc2FnZUJvZHk7Ci0JcHJpdmF0ZSBJTWVzc2FnZUJvZHkgZlRyYW5zZm9ybWVkTWVzc2FnZUJvZHkgPSBudWxsOwotCXByaXZhdGUgTGlzdDxJSFRUUEhlYWRlcj4gZkhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PElIVFRQSGVhZGVyPigKLQkJCUlOSVRfTlVNX0hFQURFUlMpOwotCXByaXZhdGUgTGlzdDxJSFRUUEhlYWRlcj4gZlRyYWlsaW5nSGVhZGVyczsKLQlwcml2YXRlIGJvb2xlYW4gaXNDaHVua2VkRW5jb2RpbmcgPSBmYWxzZTsKLQotCXByaXZhdGUgbG9uZyBmVGlkID0gMDsKLQotCXB1YmxpYyBIVFRQTWVzc2FnZShsb25nIHNlcmlhbCkgewotCQl0aGlzKHNlcmlhbCwgREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFKTsKLQl9Ci0KLQlwdWJsaWMgSFRUUE1lc3NhZ2UobG9uZyBzZXJpYWwsIGludCBpbml0QnVmZmVyU2l6ZSkgewotCQlmU2VyaWFsID0gc2VyaWFsOwotCQlmQnVmZmVyID0gbmV3IEhUVFBNZXNzYWdlQnVmZmVyKGluaXRCdWZmZXJTaXplKTsKLQkJZk9yaWdpbmFsTWVzc2FnZUJvZHkgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBIVFRQTWVzc2FnZShsb25nIHNlcmlhbCwgYnl0ZVtdIGJvZHkpIHsKLQkJZlNlcmlhbCA9IHNlcmlhbDsKLQkJZkJ1ZmZlciA9IG5ldyBIVFRQTWVzc2FnZUJ1ZmZlcigpOwotCQlzZXRPcmlnaW5hbE1lc3NhZ2VCb2R5KG5ldyBNZXNzYWdlQm9keShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9keSksCi0JCQkJYm9keS5sZW5ndGgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUE1lc3NhZ2UjZ2V0U2VyaWFsKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRTZXJpYWwoKSB7Ci0JCXJldHVybiBmU2VyaWFsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZSNnZXRIVFRQVmVyc2lvbkFzU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEhUVFBWZXJzaW9uQXNTdHJpbmcoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZSNnZXRIVFRQVmVyc2lvbkFzQnl0ZXMoKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0SFRUUFZlcnNpb25Bc0J5dGVzKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0JvZHlFbXB0eSgpOwotCi0JZmluYWwgdm9pZCBzZXRPcmlnaW5hbE1lc3NhZ2VCb2R5KElNZXNzYWdlQm9keSBtc2dCb2R5KSB7Ci0JCWlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJTE9HR0VSLmRlYnVnKCJzZXRPcmlnaW5hbE1lc3NhZ2VCb2R5OiAiICsgbXNnQm9keSk7Ci0JCX0KLQkJdXBkYXRlQ29udGVudExlbmd0aEhlYWRlcihtc2dCb2R5KTsKLQkJZk9yaWdpbmFsTWVzc2FnZUJvZHkgPSBtc2dCb2R5OwotCX0KLQotCWZpbmFsIHZvaWQgdXBkYXRlQ29udGVudExlbmd0aEhlYWRlcihJTWVzc2FnZUJvZHkgbXNnQm9keSkgewotCQlpbnQgb2xkQ29udGVudExlbmd0aCA9IChmT3JpZ2luYWxNZXNzYWdlQm9keSA9PSBudWxsKSA/IC0xCi0JCQkJOiBmT3JpZ2luYWxNZXNzYWdlQm9keS5nZXRDb250ZW50TGVuZ3RoKCk7Ci0JCWludCBjb250ZW50TGVuZ3RoID0gKG1zZ0JvZHkgPT0gbnVsbCkgPyAtMSA6IG1zZ0JvZHkuZ2V0Q29udGVudExlbmd0aCgpOwotCQlpZiAoY29udGVudExlbmd0aCA+PSAwKSB7Ci0JCQlzZXRIZWFkZXIoSUhUVFBIZWFkZXIuQ09OVEVOVF9MRU5HVEhfQSwgSW50ZWdlci50b1N0cmluZygKLQkJCQkJY29udGVudExlbmd0aCkuZ2V0Qnl0ZXMoKSk7Ci0JCX0gZWxzZSBpZiAob2xkQ29udGVudExlbmd0aCA+PSAwKSB7Ci0JCQlyZW1vdmVIZWFkZXIoSUhUVFBIZWFkZXIuQ09OVEVOVF9MRU5HVEhfQSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2VCb2R5IGdldE9yaWdpbmFsTWVzc2FnZUJvZHkoKSB7Ci0JCXJldHVybiBmT3JpZ2luYWxNZXNzYWdlQm9keTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2VCb2R5IGdldFRyYW5zZm9ybWVkTWVzc2FnZUJvZHkoKSB7Ci0JCXJldHVybiBmVHJhbnNmb3JtZWRNZXNzYWdlQm9keTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUE1lc3NhZ2UjZ2V0TWVzc2FnZUJvZHkoKQotCSAqLwotCXB1YmxpYyBJTWVzc2FnZUJvZHkgZ2V0TWVzc2FnZUJvZHkoKSB7Ci0JCXJldHVybiAoZlRyYW5zZm9ybWVkTWVzc2FnZUJvZHkgIT0gbnVsbCkgPyBmVHJhbnNmb3JtZWRNZXNzYWdlQm9keQotCQkJCTogZk9yaWdpbmFsTWVzc2FnZUJvZHk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVGaXJzdExpbmUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JcHJvdGVjdGVkIEhUVFBNZXNzYWdlQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJcmV0dXJuIGZCdWZmZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlI2dldEhlYWRlcnMoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBMaXN0PElIVFRQSGVhZGVyPiBnZXRIZWFkZXJzKCkgewotCQlyZXR1cm4gZkhlYWRlcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlI3JlbW92ZUhlYWRlcihieXRlW10pCi0JICovCi0JcHVibGljIGZpbmFsIElIVFRQSGVhZGVyIHJlbW92ZUhlYWRlcihieXRlW10gbmFtZSkgewotCQlmb3IgKElIVFRQSGVhZGVyIGggOiBmSGVhZGVycykgewotCQkJaWYgKCFoLmlzUmVtb3ZlZCgpICYmIGguaXNGaWVsZE5hbWVFcXVhbHNUbyhuYW1lKSkgewotCQkJCWguc2V0UmVtb3ZlZCh0cnVlKTsKLQkJCQlyZXR1cm4gaDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUE1lc3NhZ2Ujc2V0SGVhZGVyKGJ5dGVbXSwKLQkgKiAgICAgIGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRIZWFkZXIoYnl0ZVtdIG5hbWUsIGJ5dGVbXSB2YWx1ZSkgewotCQlIZWFkZXJUb0FkZCBoZWFkZXIgPSBuZXcgSGVhZGVyVG9BZGQoKTsKLQkJaGVhZGVyLmluaXQobmFtZSwgdmFsdWUpOwotCQlyZW1vdmVIZWFkZXIobmFtZSk7Ci0JCWZIZWFkZXJzLmFkZChoZWFkZXIpOwotCX0KLQotCWZpbmFsIHZvaWQgYWRkSGVhZGVyKEhlYWRlckluQnVmZmVyIGhlYWRlcikgewotCQlmSGVhZGVycy5hZGQoaGVhZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUE1lc3NhZ2UjYWRkVHJhaWxpbmdIZWFkZXIob3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZFRyYWlsaW5nSGVhZGVyKElIVFRQSGVhZGVyIHRyYWlsZXIpIHsKLQkJaWYgKGZUcmFpbGluZ0hlYWRlcnMgPT0gbnVsbCkgewotCQkJZlRyYWlsaW5nSGVhZGVycyA9IG5ldyBBcnJheUxpc3Q8SUhUVFBIZWFkZXI+KElOSVRfTlVNX0hFQURFUlMpOwotCQl9Ci0JCWZUcmFpbGluZ0hlYWRlcnMuYWRkKHRyYWlsZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZSNnZXRIZWFkZXIoYnl0ZVtdKQotCSAqLwotCXB1YmxpYyBmaW5hbCBJSFRUUEhlYWRlciBnZXRIZWFkZXIoYnl0ZVtdIG5hbWUpIHsKLQkJZm9yIChJSFRUUEhlYWRlciBoZWFkZXIgOiBmSGVhZGVycykgewotCQkJaWYgKGhlYWRlci5pc0ZpZWxkTmFtZUVxdWFsc1RvKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGhlYWRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUE1lc3NhZ2UjZ2V0SGVhZGVyQXNCeXRlcyhieXRlW10pCi0JICovCi0JcHVibGljIGZpbmFsIGJ5dGVbXSBnZXRIZWFkZXJBc0J5dGVzKGJ5dGVbXSBuYW1lKSB7Ci0JCUlIVFRQSGVhZGVyIGhlYWRlciA9IGdldEhlYWRlcihuYW1lKTsKLQkJcmV0dXJuIChoZWFkZXIgPT0gbnVsbCkgPyBudWxsIDogaGVhZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlI2lzQ2h1bmtlZEVuY29kaW5nKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NodW5rZWRFbmNvZGluZygpIHsKLQkJcmV0dXJuIGlzQ2h1bmtlZEVuY29kaW5nOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZSNzZXRDaHVua2VkRW5jb2RpbmcoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRDaHVua2VkRW5jb2RpbmcoYm9vbGVhbiBpc0NodW5rZWQpIHsKLQkJaXNDaHVua2VkRW5jb2RpbmcgPSBpc0NodW5rZWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlI3NldFRpZChsb25nKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFRpZChsb25nIHRpZCkgewotCQlmVGlkID0gdGlkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZSNnZXRUaWQoKQotCSAqLwotCXB1YmxpYyBsb25nIGdldFRpZCgpIHsKLQkJcmV0dXJuIGZUaWQ7Ci0JfQotCi0JLyoKLQkgKiBwcml2YXRlIHZvaWQgREVCVUcoaW50IGNoKSB7IFN5c3RlbS5vdXQucHJpbnQoIkJ1ZlsiICsgZklkeCArICJdPSIpOyBpZgotCSAqIChjaCA8IDApIHsgU3lzdGVtLm91dC5wcmludCgiIiArIGNoKTsgfSBlbHNlIHsgaW50IGhpZ2ggPSBjaCA+Pj4gNDsgaW50Ci0JICogbG93ID0gKGNoICYgMHgwZik7IGlmIChoaWdoIDwgMTApIHsgaGlnaCA9ICcwJyArIGhpZ2g7IH0gZWxzZSB7IGhpZ2ggPQotCSAqICdhJyArIGhpZ2ggLSAxMDsgfSBpZiAobG93IDwgMTApIHsgbG93ID0gJzAnICsgbG93OyB9IGVsc2UgeyBsb3cgPSAnYScgKwotCSAqIGxvdyAtIDEwOyB9IFN5c3RlbS5vdXQucHJpbnQoKGNoYXIpIGhpZ2gpOyBTeXN0ZW0ub3V0LnByaW50KChjaGFyKSBsb3cpOyB9Ci0JICogaWYgKGNoID4gMHgyMCkgeyBTeXN0ZW0ub3V0LnByaW50KCIgKCIgKyAoY2hhcikgY2ggKyAiKSIpOyB9Ci0JICogU3lzdGVtLm91dC5wcmludGxuKCk7IH0KLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIHdyaXRlSGVhZGVycyhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl3cml0ZUZpcnN0TGluZShvdXQpOwotCQlmb3IgKElIVFRQSGVhZGVyIGhlYWRlciA6IGZIZWFkZXJzKSB7Ci0JCQloZWFkZXIud3JpdGVMaW5lKG91dCk7Ci0JCX0KLQkJb3V0LndyaXRlKENSKTsKLQkJb3V0LndyaXRlKExGKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZUJvZHlXaXRob3V0Q29udGVudExlbmd0aChsb25nIHRpbWVvdXQsCi0JCQlJTWVzc2FnZUJvZHkgbXNnQm9keSwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uLAotCQkJVGltZW91dEV4Y2VwdGlvbjsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZSN3cml0ZUJvZHkobG9uZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5pbXBsLk1lc3NhZ2VCb2R5LAotCSAqICAgICAgamF2YS5pby5PdXRwdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGVCb2R5KGxvbmcgdGltZW91dCwgSU1lc3NhZ2VCb2R5IG1zZ0JvZHksIE91dHB1dFN0cmVhbSBvdXQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotCQlpZiAobXNnQm9keSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSW5wdXRTdHJlYW0gYm9keSA9IG1zZ0JvZHkuZ2V0TWVzc2FnZUJvZHlJbnB1dFN0cmVhbSgpOwotCQlpbnQgY29udGVudExlbmd0aCA9IG1zZ0JvZHkuZ2V0Q29udGVudExlbmd0aCgpOwotCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCUxPR0dFUi5kZWJ1Zygic3VwZXIud3JpdGVCb2R5OiBjb250ZW50TGVuZ3RoPSIgKyBjb250ZW50TGVuZ3RoCi0JCQkJCSsgIiwgYm9keT0iICsgYm9keSArICIsIGlzQ2h1bmtlZEVuY29kaW5nPSIKLQkJCQkJKyBtc2dCb2R5LmlzQ2h1bmtlZEVuY29kaW5nKCkpOwotCQl9Ci0JCWlmIChib2R5ICE9IG51bGwpIHsKLQkJCWlmIChjb250ZW50TGVuZ3RoID49IDApIHsKLQkJCQkvLyBub3JtYWwgZW5jb2RpbmcKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRMZW5ndGg7IGkrKykgewotCQkJCQlpbnQgYiA9IGJvZHkucmVhZCgpOwotCQkJCQlpZiAoYiA8IDApIHsKLQkJCQkJCUxPR0dFUi5kZWJ1ZygiVW5leHBlY3RlZCBjb25uZWN0aW9uIHNodXRkb3duLi4uOiIgKyBpCi0JCQkJCQkJCSsgIjoiICsgYm9keSk7Ci0JCQkJCX0KLQkJCQkJb3V0LndyaXRlKGIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAobXNnQm9keS5pc0NodW5rZWRFbmNvZGluZygpKSB7Ci0JCQkJLy8gY2h1bmtlZCBlbmNvZGluZwotCQkJCUNodW5rZWRNZXNzYWdlQm9keVJlYWRlciBjaHVua1JlYWRlciA9IG5ldyBDaHVua2VkTWVzc2FnZUJvZHlSZWFkZXIoCi0JCQkJCQlib2R5KTsKLQkJCQljaHVua1JlYWRlci5yZWFkQ2h1bmtlZE1lc3NhZ2UodGltZW91dCwgb3V0LCB0aGlzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJd3JpdGVCb2R5V2l0aG91dENvbnRlbnRMZW5ndGgodGltZW91dCwgbXNnQm9keSwgb3V0KTsKLQkJCX0KLQkJfQotCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCUxPR0dFUi5kZWJ1Zygic3VwZXIud3JpdGVCb2R5OiBkb25lIik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2VCb2R5IHRyYW5zZm9ybU1lc3NhZ2VCb2R5KGxvbmcgdGltZW91dCwgSU1lc3NhZ2VCb2R5IHNyYykKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQTWVzc2FnZSN3cml0ZShsb25nLAotCSAqICAgICAgamF2YS5pby5PdXRwdXRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUobG9uZyB0aW1lb3V0LCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sCi0JCQlUaW1lb3V0RXhjZXB0aW9uIHsKLQkJaWYgKGZUcmFuc2Zvcm1lZE1lc3NhZ2VCb2R5ID09IG51bGwpIHsKLQkJCWZUcmFuc2Zvcm1lZE1lc3NhZ2VCb2R5ID0gdHJhbnNmb3JtTWVzc2FnZUJvZHkodGltZW91dCwKLQkJCQkJZk9yaWdpbmFsTWVzc2FnZUJvZHkpOwotCQkJaWYgKGZUcmFuc2Zvcm1lZE1lc3NhZ2VCb2R5ICE9IG51bGwpIHsKLQkJCQl1cGRhdGVDb250ZW50TGVuZ3RoSGVhZGVyKGZUcmFuc2Zvcm1lZE1lc3NhZ2VCb2R5KTsKLQkJCX0KLQkJfQotCi0JCXdyaXRlSGVhZGVycyhvdXQpOwotCi0JCXdyaXRlQm9keSh0aW1lb3V0LCBnZXRNZXNzYWdlQm9keSgpLCBvdXQpOwotCX0KLQotCS8qCi0JICogcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUcmFpbGluZ0hlYWRlcnMoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzCi0JICogSU9FeGNlcHRpb24geyBib29sZWFuIG91dHB1dCA9IGZhbHNlOyBmb3IgKEl0ZXJhdG9yIGl0ID0KLQkgKiBmVHJhaWxpbmdIZWFkZXJzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7IEhUVFBIZWFkZXIgaGVhZGVyID0KLQkgKiAoSFRUUEhlYWRlcikgaXQubmV4dCgpOyBoZWFkZXIud3JpdGUob3V0KTsgb3V0cHV0ID0gdHJ1ZTsgfSBpZiAob3V0cHV0KSB7Ci0JICogb3V0LndyaXRlKENSKTsgb3V0LndyaXRlKExGKTsgfSB9Ci0JICovCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUE1lc3NhZ2UjaXNIVFRQVmVyc2lvbjFfMSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIVFRQVmVyc2lvbjFfMSgpIHsKLQkJaWYgKEFycmF5cy5lcXVhbHMoSUhUVFBIZWFkZXIuSFRUUF9WRVJTSU9OXzFfMV9BLAotCQkJCWdldEhUVFBWZXJzaW9uQXNCeXRlcygpKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENMT1NFX0EgPSAiY2xvc2UiLmdldEJ5dGVzKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEtFRVBfQUxJVkVfQSA9ICJLZWVwLUFsaXZlIi5nZXRCeXRlcygpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBNZXNzYWdlI3NldENvbm5lY3Rpb25IZWFkZXIoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uSGVhZGVyKGJvb2xlYW4ga2VlcGFsaXZlKSB7Ci0JCWlmIChrZWVwYWxpdmUpIHsKLQkJCXNldEhlYWRlcihJSFRUUEhlYWRlci5DT05ORUNUSU9OX0EsICJLZWVwLUFsaXZlIi5nZXRCeXRlcygpKTsKLQkJfSBlbHNlIHsKLQkJCXNldEhlYWRlcihJSFRUUEhlYWRlci5DT05ORUNUSU9OX0EsICJjbG9zZSIuZ2V0Qnl0ZXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUE1lc3NhZ2UjaXNDb25uZWN0aW9uVG9CZUNsb3NlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW9uVG9CZUNsb3NlZCgpIHsKLQkJSUhUVFBIZWFkZXIgaCA9IGdldEhlYWRlcihJSFRUUEhlYWRlci5DT05ORUNUSU9OX0EpOwotCQlpZiAoaXNIVFRQVmVyc2lvbjFfMSgpKSB7Ci0JCQkvLyBXaGVuIEhUVFAgdmVyc2lvbiBpcyAxLjEsIHdlIGFzc3VtZSB0aGUgY29ubmVjdGlvbiBpcyByZXVzZWQgYnkKLQkJCS8vIGRlZmF1bHQuCi0JCQlpZiAoaCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBoLmNvbXBhcmVWYWx1ZUlnbm9yZUNhc2UoQ0xPU0VfQSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBXaGVuIEhUVFAgdmVyc2lvbiBpcyAxLjAsIHdlIGFzc3VtZSB0aGUgY29ubmVjdGlvbiB3aWxsIGJlCi0JCQkvLyBzaHV0ZG93biBieSBkZWZhdWx0LgotCQkJaWYgKGggPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChoLmNvbXBhcmVWYWx1ZUlnbm9yZUNhc2UoS0VFUF9BTElWRV9BKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiSFRUUE1lc3NhZ2UgIiArIGZTZXJpYWwgKyAiOiIgKyBmQnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUE1lc3NhZ2VCdWZmZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBNZXNzYWdlQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MGQyYWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUE1lc3NhZ2VCdWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlkZWtpIFRBSSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUJ1ZmZlclJhbmdlOwotCi0KLXB1YmxpYyBjbGFzcyBIVFRQTWVzc2FnZUJ1ZmZlciBleHRlbmRzIEJ5dGVBcnJheU91dHB1dFN0cmVhbSB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFID0gMTAyNDsKLSAgICAgICAgCi0gICAgcHVibGljIEhUVFBNZXNzYWdlQnVmZmVyKCkgewotICAgICAgICBzdXBlcihERUZBVUxUX0lOSVRJQUxfQlVGRkVSX1NJWkUpOwotICAgIH0KLQotICAgIHB1YmxpYyBIVFRQTWVzc2FnZUJ1ZmZlcihpbnQgaW5pdEJ1ZmZlclNpemUpIHsKLSAgICAgICAgc3VwZXIoaW5pdEJ1ZmZlclNpemUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBIVFRQTWVzc2FnZUJ1ZmZlcihieXRlW10gYm9keSkgewotICAgICAgICBzdXBlci5idWYgPSBib2R5OwotICAgICAgICBzdXBlci5jb3VudCA9IGJvZHkubGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZUFycmF5KCkgewotICAgICAgICByZXR1cm4gc3VwZXIuYnVmOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5jb3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFzU3RyaW5nKElCdWZmZXJSYW5nZSByYW5nZSkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhzdXBlci5idWYsIHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldExlbmd0aCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEFzQnl0ZXMoSUJ1ZmZlclJhbmdlIHJhbmdlKSB7Ci0gICAgICAgIGludCBsZW4gPSByYW5nZS5nZXRMZW5ndGgoKTsKLSAgICAgICAgaWYgKGxlbiA8PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IGJ5dGVbMF07Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbGVuXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShzdXBlci5idWYsIHJhbmdlLmdldFN0YXJ0KCksIGJ5dGVzLCAwLCBsZW4pOwotICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvdXQsIElCdWZmZXJSYW5nZSByYW5nZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0LndyaXRlKHN1cGVyLmJ1ZiwgcmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0TGVuZ3RoKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhJQnVmZmVyUmFuZ2UgcmFuZ2UsIGJ5dGVbXSBkYXRhKSB7Ci0gICAgICAgIGludCBsZW4gPSBkYXRhLmxlbmd0aDsKLSAgICAgICAgaWYgKGxlbiAhPSByYW5nZS5nZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGludCBvZmZzZXQgPSByYW5nZS5nZXRTdGFydCgpOwotICAgICAgICBieXRlW10gYnVmZmVyID0gc3VwZXIuYnVmOwotICAgICAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgIGlmIChkYXRhW2ldICE9IGJ1ZmZlcltvZmZzZXQgKyBpXSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVDYXNlKElCdWZmZXJSYW5nZSByYW5nZSwgYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgaW50IGxlbiA9IGRhdGEubGVuZ3RoOwotICAgICAgICBpZiAobGVuICE9IHJhbmdlLmdldExlbmd0aCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG9mZnNldCA9IHJhbmdlLmdldFN0YXJ0KCk7Ci0gICAgICAgIGJ5dGVbXSBidWZmZXIgPSBzdXBlci5idWY7Ci0gICAgICAgIGZvciAoaW50IGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgaWYgKEhUVFBIZWFkZXIudG9VcGNhc2UoZGF0YVtpXSkKLSAgICAgICAgICAgICAgICAhPSBIVFRQSGVhZGVyLnRvVXBjYXNlKGJ1ZmZlcltvZmZzZXQgKyBpXSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoc3VwZXIuYnVmLCAwLCBzdXBlci5jb3VudCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUE1lc3NhZ2VSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBNZXNzYWdlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYTVhZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUE1lc3NhZ2VSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlkZWtpIFRBSSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSU1lc3NhZ2VCb2R5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5UaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5Mb2dnZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEhUVFBNZXNzYWdlUmVhZGVyIGV4dGVuZHMgSFRUUFJlYWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSFRUUE1lc3NhZ2VSZWFkZXIuY2xhc3MpOwotICAgIAotICAgIHByb3RlY3RlZCBIVFRQTWVzc2FnZVJlYWRlcihJbnB1dFN0cmVhbSBpbikgewotICAgICAgICBzdXBlcihpbik7Ci0gICAgfQotICAgICAgICAKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZWFkRmlyc3RMaW5lKEhUVFBNZXNzYWdlIG1zZywgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb247Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSGVhZGVyKEhUVFBNZXNzYWdlIG1zZywgSUhUVFBIZWFkZXIgaGVhZGVyKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2UoSFRUUE1lc3NhZ2UgbXNnLCBib29sZWFuIGlzQm9keUVtcHR5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVhZE1lc3NhZ2UobXNnLCAwLCBpc0JvZHlFbXB0eSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HR0VSLmZhdGFsKCJJbXBvc3NpYmxlIGV4Y2VwdGlvbiIsIGUpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZWFkTWVzc2FnZShIVFRQTWVzc2FnZSBtc2csIGxvbmcgdGltZW91dCwgYm9vbGVhbiBpc0JvZHlFbXB0eSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0dHRVIuZGVidWcoInJlYWQ6IGlzQm9keUVtcHR5PSIgKyBpc0JvZHlFbXB0eSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmVhZCB0aGUgZmlyc3QgbGluZQotICAgICAgICByZWFkRmlyc3RMaW5lKG1zZywgdGltZW91dCk7Ci0KLSAgICAgICAgaW50IGNvbnRlbnRMZW5ndGggPSAtMTsKLSAgICAgICAgd2hpbGUgKGZMYXN0Qnl0ZSA+PSAwKSB7Ci0gICAgICAgICAgICBIZWFkZXJJbkJ1ZmZlciBoZWFkZXIgPSByZWFkSGVhZGVyKHRpbWVvdXQsIG1zZy5nZXRCdWZmZXIoKSk7Ci0gICAgICAgICAgICBpZiAoaGVhZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBFT0YKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZy5hZGRIZWFkZXIoaGVhZGVyKTsKLSAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmV3IFN0cmluZyhoZWFkZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuZXcgU3RyaW5nKGhlYWRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBMT0dHRVIuZGVidWcobmFtZSArICI6ICIgKyB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChoZWFkZXIuaXNGaWVsZE5hbWVFcXVhbHNUbyhJSFRUUEhlYWRlci5DT05URU5UX0xFTkdUSF9BKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gbmV3IFN0cmluZyhoZWFkZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiB2Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQodik7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIud2FybmluZygiSWxsZWdhbCBoZWFkZXIgZmllYWxkIChDT05URU5UX0xFTkdUSCkgaWdub3JlZDogIiArIHYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXIuaXNGaWVsZE5hbWVFcXVhbHNUbyhJSFRUUEhlYWRlci5UUkFOU0ZFUl9FTkNPRElOR19BKSAKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgaGVhZGVyLmlzRmllbGRWYWx1ZUVxdWFsc1RvKElIVFRQSGVhZGVyLkNIVU5LRURfQSkpIHsKLSAgICAgICAgICAgICAgICBtc2cuc2V0Q2h1bmtlZEVuY29kaW5nKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvY2Vzc0hlYWRlcihtc2csIGhlYWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpc0JvZHlFbXB0eSB8PSBtc2cuaXNCb2R5RW1wdHkoKTsKLQotICAgICAgICBpZiAoaXNCb2R5RW1wdHkpIHsKLSAgICAgICAgICAgIExPR0dFUi5kZWJ1ZygiVGhlIG1lc3NhZ2UgYm9keSBpcyBlbXB0eS4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIElNZXNzYWdlQm9keSBtc2dCb2R5OwotICAgICAgICAgICAgaWYgKG1zZy5pc0NodW5rZWRFbmNvZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgbXNnQm9keSA9IG5ldyBNZXNzYWdlQm9keShnZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbXNnQm9keSA9IG5ldyBNZXNzYWdlQm9keShnZXRJbnB1dFN0cmVhbSgpLCBjb250ZW50TGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZy5zZXRPcmlnaW5hbE1lc3NhZ2VCb2R5KG1zZ0JvZHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUFJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTE1MTcyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklCdWZmZXJSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLlRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkxvZ2dlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSFRUUFJlYWRlciB7Ci0gICAgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEhUVFBSZWFkZXIuY2xhc3MpOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVRfTlVNX0hFQURFUlMgPSA1MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ1IgPSAweDBkOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBMRiA9IDB4MGE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFNQID0gMHgyMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSFQgPSAweDA5OwotICAgICAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0YgPSAtMTsKLSAgICAgICAgCi0gICAgcHJpdmF0ZSBQdXNoYmFja0lucHV0U3RyZWFtIGZJbjsKLSAgICBwcml2YXRlIGxvbmcgZkxhc3RSZWFkVGltZSA9IDA7Ci0gICAgcHJvdGVjdGVkIGludCBmTGFzdEJ5dGUgPSAtMTsKLQotICAgIHByb3RlY3RlZCBIVFRQUmVhZGVyKElucHV0U3RyZWFtIGluKSB7Ci0gICAgICAgIGlmIChpbiBpbnN0YW5jZW9mIFB1c2hiYWNrSW5wdXRTdHJlYW0pIHsKLSAgICAgICAgICAgIGZJbiA9IChQdXNoYmFja0lucHV0U3RyZWFtKSBpbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZJbiA9IG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKGluLCAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiBmSW47Ci0gICAgfQotICAgICAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgbG9uZyBnZXRMYXN0UmVhZFRpbWUoKSB7Ci0gICAgICAgIHJldHVybiBmTGFzdFJlYWRUaW1lOwotICAgIH0KLSAgICAgICAgCi0gICAgcHJvdGVjdGVkIGZpbmFsIGludCBnZXRMYXN0Qnl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGZMYXN0Qnl0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRBdmFpbGFibGVJbnB1dChsb25nIHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBkYXRhOwotICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgIGlmICh0aW1lb3V0ID4gMCkgewotICAgICAgICAgICAgICAgIGludCBhdmFpbGFibGU7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChhdmFpbGFibGUgPSBmSW4uYXZhaWxhYmxlKCkpIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBhdmFpbGFibGUgPT0gMAotICAgICAgICAgICAgICAgICAgICBpZiAoZkxhc3RSZWFkVGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmTGFzdFJlYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBmTGFzdFJlYWRUaW1lID4gdGltZW91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZMYXN0UmVhZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigiSFRUUFJlYWRlci5nZXRBdmFpbGFibGVJbnB1dCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkYXRhID0gZkluLnJlYWQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGZJbi5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAodGltZW91dCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmTGFzdFJlYWRUaW1lID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTGFzdFJlYWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBmTGFzdFJlYWRUaW1lID4gdGltZW91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZMYXN0UmVhZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigiSFRUUFJlYWRlci5nZXRBdmFpbGFibGVJbnB1dCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZMYXN0UmVhZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbmV4dEJ5dGUobG9uZyB0aW1lb3V0LCBPdXRwdXRTdHJlYW0gcmVwbGljYSkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgZkxhc3RCeXRlID0gZ2V0QXZhaWxhYmxlSW5wdXQodGltZW91dCk7Ci0gICAgICAgIGlmIChmTGFzdEJ5dGUgIT0gLTEpIHsKLSAgICAgICAgICAgIHJlcGxpY2Eud3JpdGUoZkxhc3RCeXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzQ29udGludWVkTGluZShsb25nIHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEFzc2VydGlvbgotICAgICAgICBpZiAoZkxhc3RCeXRlICE9IExGKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG5leHRDaGFyID0gZ2V0QXZhaWxhYmxlSW5wdXQodGltZW91dCk7Ci0gICAgICAgIGZJbi51bnJlYWQobmV4dENoYXIpOwotICAgICAgICByZXR1cm4gKG5leHRDaGFyID09IFNQIHx8IG5leHRDaGFyID09IEhUKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgcmVhZEJ5dGVzKGxvbmcgdGltZW91dCwgT3V0cHV0U3RyZWFtIG91dCwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoaSA8IGxlbikgewotICAgICAgICAgICAgaWYgKCFuZXh0Qnl0ZSh0aW1lb3V0LCBvdXQpKSBicmVhazsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUX05VTV9UUkFJTEVSUyA9IDI7Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdDxJSFRUUEhlYWRlcj4gcmVhZENodW5rZWRNZXNzYWdlVHJhaWxlcnMobG9uZyB0aW1lb3V0LCBIVFRQTWVzc2FnZUJ1ZmZlciBidWYpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8SUhUVFBIZWFkZXI+IHRyYWlsZXJzID0gbnVsbDsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIEhlYWRlckluQnVmZmVyIGhlYWRlciA9IHJlYWRIZWFkZXIodGltZW91dCwgYnVmKTsKLSAgICAgICAgICAgIGlmIChoZWFkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRyYWlsZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cmFpbGVycyA9IG5ldyBBcnJheUxpc3Q8SUhUVFBIZWFkZXI+KElOSVRfTlVNX1RSQUlMRVJTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyYWlsZXJzLmFkZChoZWFkZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cmFpbGVyczsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIEhlYWRlckluQnVmZmVyIHJlYWRIZWFkZXIobG9uZyB0aW1lb3V0LCBIVFRQTWVzc2FnZUJ1ZmZlciBidWYpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFJlYWQgJ2ZpZWxkLW5hbWUnCi0gICAgICAgIElCdWZmZXJSYW5nZSBmaWVsZE5hbWUgPSBuZXcgQnVmZmVyUmFuZ2UoKTsKLSAgICAgICAgcmVhZE5leHRUb2tlbih0aW1lb3V0LCBidWYsIGZpZWxkTmFtZSwgJzonKTsKLSAgICAgICAgaWYgKGZMYXN0Qnl0ZSA9PSBFT0YgfHwgZkxhc3RCeXRlID09IExGKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZkxhc3RCeXRlICE9ICc6JykgewotICAgICAgICAgICAgLy8gVW5leHBlY3RlZCBsaW5lCi0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2hhciAoIiArIGZMYXN0Qnl0ZSArICIuKSBFeHBlY3RlZCB3YXMgKCc6JykiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNraXBTcGFjZXModGltZW91dCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBSZWFkICdmaWVsZC12YWx1ZScKLSAgICAgICAgSUJ1ZmZlclJhbmdlIGZpZWxkVmFsdWUgPSBuZXcgQnVmZmVyUmFuZ2UoKTsKLSAgICAgICAgcmVhZE5leHRUb2tlbih0aW1lb3V0LCBidWYsIGZpZWxkVmFsdWUpOwotICAgICAgICB3aGlsZSAoaGFzQ29udGludWVkTGluZSh0aW1lb3V0KSkgewotICAgICAgICAgICAgcmVhZENvbnRpbnVlZExpbmUodGltZW91dCwgYnVmLCBmaWVsZFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEhlYWRlckluQnVmZmVyIGhlYWRlciA9IG5ldyBIZWFkZXJJbkJ1ZmZlcigpOwotICAgICAgICBoZWFkZXIuaW5pdChidWYsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7Ci0gICAgICAgIHJldHVybiBoZWFkZXI7Ci0gICAgfQotICAgICAgICAKLSAgICBwcml2YXRlIGZpbmFsIGludCByZWFkQ29udGludWVkTGluZShsb25nIHRpbWVvdXQsIEhUVFBNZXNzYWdlQnVmZmVyIGJ1ZiwgSUJ1ZmZlclJhbmdlIHJhbmdlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICAvLyBSZWFkIHVudGlsIENSTEYKLSAgICAgICAgaW50IHN0YXJ0ID0gYnVmLmdldExlbmd0aCgpOwotICAgICAgICBib29sZWFuIGNyID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gY3JsZiA9IGZhbHNlOwotICAgICAgICB3aGlsZSAoZkxhc3RCeXRlICE9IEVPRikgewotICAgICAgICAgICAgbmV4dEJ5dGUodGltZW91dCwgYnVmKTsKLSAgICAgICAgICAgIGlmIChmTGFzdEJ5dGUgPT0gQ1IpIHsKLSAgICAgICAgICAgICAgICBjciA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZMYXN0Qnl0ZSA9PSBMRiAmJiBjcikgewotICAgICAgICAgICAgICAgIGNybGYgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjciA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBsZW5ndGggPSBidWYuZ2V0TGVuZ3RoKCkgLSBzdGFydDsKLSAgICAgICAgaWYgKGNybGYpIHsKLSAgICAgICAgICAgIGxlbmd0aCAtPSAyOwotICAgICAgICB9Ci0gICAgICAgIHJhbmdlLnNldExlbmd0aChyYW5nZS5nZXRMZW5ndGgoKSArIGxlbmd0aCk7Ci0gICAgICAgIHJldHVybiBmTGFzdEJ5dGU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2tpcFNwYWNlQ1JBbmRMRnMobG9uZyB0aW1lb3V0KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBmTGFzdEJ5dGUgPSBnZXRBdmFpbGFibGVJbnB1dCh0aW1lb3V0KTsKLSAgICAgICAgd2hpbGUgKChmTGFzdEJ5dGUgPT0gU1ApCi0gICAgICAgICAgICAgICB8fCAoZkxhc3RCeXRlID09IENSKQotICAgICAgICAgICAgICAgfHwgKGZMYXN0Qnl0ZSA9PSBMRikpIHsKLSAgICAgICAgICAgIGZMYXN0Qnl0ZSA9IFNvY2tldFRpbWVvdXRSZXRyeUlucHV0U3RyZWFtLnJlYWQoZkluKTsKLSAgICAgICAgfQotICAgICAgICBmSW4udW5yZWFkKGZMYXN0Qnl0ZSk7Ci0gICAgfQotICAgICAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBza2lwU3BhY2VzKGxvbmcgdGltZW91dCwgT3V0cHV0U3RyZWFtIHJlcGxpY2EpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZMYXN0Qnl0ZSA9IGdldEF2YWlsYWJsZUlucHV0KHRpbWVvdXQpOwotICAgICAgICB3aGlsZSAoZkxhc3RCeXRlID09IFNQKSB7Ci0gICAgICAgICAgICByZXBsaWNhLndyaXRlKGZMYXN0Qnl0ZSk7Ci0gICAgICAgICAgICBmTGFzdEJ5dGUgPSBTb2NrZXRUaW1lb3V0UmV0cnlJbnB1dFN0cmVhbS5yZWFkKGZJbik7Ci0gICAgICAgIH0KLSAgICAgICAgZkluLnVucmVhZChmTGFzdEJ5dGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgcmVhZE5leHRUb2tlbihsb25nIHRpbWVvdXQsIEhUVFBNZXNzYWdlQnVmZmVyIGJ1ZiwgSUJ1ZmZlclJhbmdlIG1hcmtlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWROZXh0VG9rZW4odGltZW91dCwgYnVmLCBtYXJrZXIsIChjaGFyKSAwKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgcmVhZE5leHRUb2tlbihsb25nIHRpbWVvdXQsIEhUVFBNZXNzYWdlQnVmZmVyIGJ1ZiwgSUJ1ZmZlclJhbmdlIG1hcmtlciwgY2hhciBkZWxpbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHN0YXJ0ID0gYnVmLmdldExlbmd0aCgpOwotICAgICAgICBuZXh0Qnl0ZSh0aW1lb3V0LCBidWYpOwotICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgYm9vbGVhbiBjciA9IGZhbHNlOwotICAgICAgICB3aGlsZSAoZkxhc3RCeXRlICE9IEVPRikgewotICAgICAgICAgICAgaWYgKGRlbGltICE9IDAgJiYgZkxhc3RCeXRlID09IGRlbGltKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZkxhc3RCeXRlID09IENSKSB7Ci0gICAgICAgICAgICAgICAgY3IgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmTGFzdEJ5dGUgPT0gTEYgJiYgY3IpIHsKLSAgICAgICAgICAgICAgICBsZW5ndGggLT0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3IgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5leHRCeXRlKHRpbWVvdXQsIGJ1Zik7Ci0gICAgICAgICAgICBsZW5ndGggKz0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGVuZ3RoID4gMCkgeyAKLSAgICAgICAgICAgIG1hcmtlci5zZXRTdGFydChzdGFydCk7Ci0gICAgICAgICAgICBtYXJrZXIuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZMYXN0Qnl0ZTsKLSAgICB9Ci0KLSAgICAvKgotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1Rva2VuQ2hhcihpbnQgY2gpIHsKLSAgICAgICAgaWYgKGNoIDwgMCB8fCBpc0N0cmxDaGFyKGNoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGlzU2VwZXJhdG9yKGNoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0N0cmxDaGFyKGludCBjaCkgewotICAgICAgICByZXR1cm4gKChjaCA+PSAwICYmIGNoIDw9IDB4MUYpIHx8IGNoID09IDB4N0YpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1RleHRDaGFyKGludCBjaCkgewotICAgICAgICBpZiAoY2ggPT0gU1AgfHwgY2ggPT0gSFQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICFpc0N0cmxDaGFyKGNoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzU2VwZXJhdG9yKGludCBjaCkgewotICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgIGNhc2UgSFQ6IC8vIDB4MDkKLSAgICAgICAgY2FzZSBTUDogLy8gMHgyMAotICAgICAgICBjYXNlICciJzogLy8gMHgyMgotICAgICAgICBjYXNlICcoJzogLy8gMHgyOAotICAgICAgICBjYXNlICcpJzogLy8gMHgyOQotICAgICAgICBjYXNlICcsJzogLy8gMHgyYwotICAgICAgICBjYXNlICcvJzogLy8gMHgyZgotICAgICAgICBjYXNlICc6JzogLy8gMHgzYQotICAgICAgICBjYXNlICc7JzogLy8gMHgzYgotICAgICAgICBjYXNlICc8JzogLy8gMHgzYwotICAgICAgICBjYXNlICc9JzogLy8gMHgzZAotICAgICAgICBjYXNlICc+JzogLy8gMHgzZQotICAgICAgICBjYXNlICc/JzogLy8gMHgzZgotICAgICAgICBjYXNlICdAJzogLy8gMHg0MCAKLSAgICAgICAgY2FzZSAnWyc6IC8vIDB4NWIKLSAgICAgICAgY2FzZSAnXFwnOiAvLyAweDVjCi0gICAgICAgIGNhc2UgJ10nOiAvLyAweDVkCi0gICAgICAgIGNhc2UgJ3snOiAvLyAweDdiCi0gICAgICAgIGNhc2UgJ30nOiAvLyAweDdkCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci0gICAgKi8KLSAgICAgICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIGZpZWxkLXZhbHVlICAgID0gKiggZmllbGQtY29udGVudCB8IExXUyApCi0gICAgLy8gZmllbGQtY29udGVudCAgPSA8dGhlIE9DVEVUcyBtYWtpbmcgdXAgdGhlIGZpZWxkLXZhbHVlCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGNvbnNpc3Rpbmcgb2YgZWl0aGVyICpURVhUIG9yIGNvbWJpbmF0aW9ucwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRva2VuLCBzZXBhcmF0b3JzLCBhbmQgcXVvdGVkLXN0cmluZz4KLSAgICAvLyBURVhUICAgICAgICAgICA9IDxhbnkgT0NURVQgZXhjZXB0IENUTHMsIGJ1dCBpbmNsdWRpbmcgTFdTPgotICAgIC8vIHF1b3RlZC1zdHJpbmcgID0gKCA8Ij4gKihxZHRleHQgfCBxdW90ZWQtcGFpciApIDwiPiApCi0gICAgLy8gcWR0ZXh0ICAgICAgICAgPSA8YW55IFRFWFQgZXhjZXB0IDwiPj4KLSAgICAvLyBxdW90ZWQtcGFpciAgICA9ICJcIiBDSEFSCi0gICAgLy8gQ0hBUiAgICAgICAgICAgPSA8YW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpPgotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIENSIExGCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZENSTEYobG9uZyB0aW1lb3V0LCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBuZXh0Qnl0ZSh0aW1lb3V0LCBvdXQpOwotICAgICAgICBpZiAoZkxhc3RCeXRlICE9IENSKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2hhciAoIiArIGZMYXN0Qnl0ZSArIi4pIEV4cGVjdGVkIHdhcyAoIiArIEludGVnZXIudG9TdHJpbmcoQ1IpICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBuZXh0Qnl0ZSh0aW1lb3V0LCBvdXQpOwotICAgICAgICBpZiAoZkxhc3RCeXRlICE9IExGKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2hhciAoIiArIGZMYXN0Qnl0ZSArIi4pIEV4cGVjdGVkIHdhcyAoIiArIEludGVnZXIudG9TdHJpbmcoTEYpICsgIikiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHJlYWROZXh0VG9rZW4obG9uZyB0aW1lb3V0LCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcmVhZE5leHRUb2tlbih0aW1lb3V0LCBvdXQsIChjaGFyKSAwKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyByZWFkTmV4dFRva2VuKGxvbmcgdGltZW91dCwgT3V0cHV0U3RyZWFtIG91dCwgY2hhciBkZWxpbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgbmV4dEJ5dGUodGltZW91dCwgb3V0KTsKLSAgICAgICAgaWYgKGZMYXN0Qnl0ZSA9PSBFT0YpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gY3IgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHRva2VuID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB3aGlsZSAoZkxhc3RCeXRlICE9IEVPRikgewotICAgICAgICAgICAgaWYgKGRlbGltICE9IDAgJiYgZkxhc3RCeXRlID09IGRlbGltKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZkxhc3RCeXRlID09IENSKSB7Ci0gICAgICAgICAgICAgICAgY3IgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmTGFzdEJ5dGUgPT0gTEYgJiYgY3IpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3IgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB0b2tlbi5hcHBlbmQoKGNoYXIpIGZMYXN0Qnl0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0Qnl0ZSh0aW1lb3V0LCBvdXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b2tlbi50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IHJlYWRDaHVua2VkTWVzc2FnZUJvZHkobG9uZyB0aW1lb3V0LCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBDaHVua0RlY29kZXIgZGVjb2RlciA9IG5ldyBDaHVua0RlY29kZXIoZkluKTsKLSAgICAgICAgZmluYWwgQ2h1bmtFbmNvZGVyIGVuY29kZXIgPSBuZXcgQ2h1bmtFbmNvZGVyKG91dCk7Ci0gICAgICAgIGRlY29kZXIuc2V0Q2h1bmtMaXN0ZW5lcihuZXcgQ2h1bmtMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG5ld0NoYW5rUmVhZChpbnQgbiwgaW50IHNpemUpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLnNldE1heENodW5rU2l6ZShzaXplKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgYjsKLSAgICAgICAgICAgIGludCBuID0gMDsKLSAgICAgICAgICAgIHdoaWxlICgoYiA9IGRlY29kZXIucmVhZCh0aW1lb3V0KSkgIT0gLTEpIHsgCi0gICAgICAgICAgICAgICAgZW5jb2Rlci53cml0ZShiKTsKLSAgICAgICAgICAgICAgICBuICs9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGVuY29kZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBSZXF1ZXN0TWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUFJlcXVlc3RNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZjRmMDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUFJlcXVlc3RNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUJ1ZmZlclJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSU1lc3NhZ2VCb2R5OwotCi1wdWJsaWMgY2xhc3MgSFRUUFJlcXVlc3RNZXNzYWdlIGV4dGVuZHMgSFRUUE1lc3NhZ2UgaW1wbGVtZW50cyBJSFRUUFJlcXVlc3RNZXNzYWdlewotICAgIC8vIFJlcXVlc3QgPSBSZXF1ZXN0LUxpbmUKLSAgICAvLyAgICAgICAgICAgICAgICAgICooKCBnZW5lcmFsLWhlYWRlcgotICAgIC8vICAgICAgICAgICAgICAgICAgICB8IHJlcXVlc3QtaGVhZGVyCi0gICAgLy8gICAgICAgICAgICAgICAgICAgIHwgZW50aXR5LWhlYWRlciApIENSTEYpCi0gICAgLy8gICAgICAgICAgICAgICAgICBDUkxGCi0gICAgLy8gICAgICAgICAgICAgICAgICBbIG1lc3NhZ2UtYm9keSBdCi0KLSAgICBwcml2YXRlIElCdWZmZXJSYW5nZSBmTWV0aG9kOwotICAgIHByaXZhdGUgSUJ1ZmZlclJhbmdlIGZSZXF1ZXN0VVJJOwotICAgIHByaXZhdGUgU3RyaW5nIG1vZGlmaWVkUmVxdWVzdFVSSTsKLSAgICBwcml2YXRlIElCdWZmZXJSYW5nZSBmSFRUUFZlcnNpb247Ci0KLSAgICBwdWJsaWMgSFRUUFJlcXVlc3RNZXNzYWdlKGxvbmcgc2VyaWFsKSB7Ci0gICAgICAgIHN1cGVyKHNlcmlhbCk7Ci0gICAgICAgIGZNZXRob2QgPSBuZXcgQnVmZmVyUmFuZ2UoKTsKLSAgICAgICAgZlJlcXVlc3RVUkkgPSBuZXcgQnVmZmVyUmFuZ2UoKTsKLSAgICAgICAgZkhUVFBWZXJzaW9uID0gbmV3IEJ1ZmZlclJhbmdlKCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlI2dldE1ldGhvZCgpCi0JICovCi0gICAgcHVibGljIElCdWZmZXJSYW5nZSBnZXRNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBmTWV0aG9kOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlI2dldE1ldGhvZEFzQnl0ZXMoKQotCSAqLwotICAgIHB1YmxpYyBieXRlW10gZ2V0TWV0aG9kQXNCeXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1ZmZlcigpLmdldEFzQnl0ZXMoZk1ldGhvZCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2UjZ2V0TWV0aG9kQXNTdHJpbmcoKQotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kQXNTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCdWZmZXIoKS5nZXRBc1N0cmluZyhmTWV0aG9kKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZSNnZXRSZXF1ZXN0VVJJKCkKLQkgKi8KLSAgICBwdWJsaWMgSUJ1ZmZlclJhbmdlIGdldFJlcXVlc3RVUkkoKSB7Ci0gICAgICAgIGlmIChtb2RpZmllZFJlcXVlc3RVUkkgIT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBmUmVxdWVzdFVSSTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZSNzZXRSZXF1ZXN0VVJJU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdFVSSVN0cmluZyhTdHJpbmcgbmV3UmVxdWVzdFVSSSkgewotICAgICAgICB0aGlzLm1vZGlmaWVkUmVxdWVzdFVSSSA9IG5ld1JlcXVlc3RVUkk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2UjZ2V0T3JpZ2luYWxSZXF1ZXN0VVJJU3RyaW5nKCkKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9yaWdpbmFsUmVxdWVzdFVSSVN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1ZmZlcigpLmdldEFzU3RyaW5nKGZSZXF1ZXN0VVJJKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZSNnZXRSZXF1ZXN0VVJJU3RyaW5nKCkKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RVUklTdHJpbmcoKSB7Ci0gICAgICAgIGlmIChtb2RpZmllZFJlcXVlc3RVUkkgIT0gbnVsbCkgcmV0dXJuIG1vZGlmaWVkUmVxdWVzdFVSSTsKLSAgICAgICAgcmV0dXJuIGdldE9yaWdpbmFsUmVxdWVzdFVSSVN0cmluZygpOwotICAgIH0KLSAgICAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2UjZ2V0SFRUUFZlcnNpb24oKQotCSAqLwotICAgIHB1YmxpYyBJQnVmZmVyUmFuZ2UgZ2V0SFRUUFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBmSFRUUFZlcnNpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRIVFRQVmVyc2lvbkFzQnl0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCdWZmZXIoKS5nZXRBc0J5dGVzKGZIVFRQVmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRIVFRQVmVyc2lvbkFzU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKCkuZ2V0QXNTdHJpbmcoZkhUVFBWZXJzaW9uKTsKLSAgICB9Ci0gICAgICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlI2lzTWV0aG9kRXF1YWxzVG8oYnl0ZVtdKQotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWV0aG9kRXF1YWxzVG8oYnl0ZVtdIG1ldGhvZCkgewotICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKCkuZXF1YWxzKGZNZXRob2QsIG1ldGhvZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVGaXJzdExpbmUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSFRUUE1lc3NhZ2VCdWZmZXIgYnVmID0gZ2V0QnVmZmVyKCk7Ci0gICAgICAgIGJ1Zi53cml0ZVRvKG91dCwgZk1ldGhvZCk7Ci0gICAgICAgIG91dC53cml0ZShTUCk7Ci0gICAgICAgIGlmIChtb2RpZmllZFJlcXVlc3RVUkkgPT0gbnVsbCkgewotICAgICAgICAgICAgYnVmLndyaXRlVG8ob3V0LCBmUmVxdWVzdFVSSSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUobW9kaWZpZWRSZXF1ZXN0VVJJLmdldEJ5dGVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZShTUCk7Ci0gICAgICAgIGJ1Zi53cml0ZVRvKG91dCwgZkhUVFBWZXJzaW9uKTsKLSAgICAgICAgb3V0LndyaXRlKENSKTsKLSAgICAgICAgb3V0LndyaXRlKExGKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0JvZHlFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlI2lzUmVzcG9uc2VCb2R5RW1wdHkoKQotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVzcG9uc2VCb2R5RW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiAoSUhUVFBIZWFkZXIuTUVUSE9EX0NPTk5FQ1QuZXF1YWxzKGdldE1ldGhvZEFzU3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgfHwgSUhUVFBIZWFkZXIuTUVUSE9EX0hFQUQuZXF1YWxzKGdldE1ldGhvZEFzU3RyaW5nKCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29udGVudExlbmd0aEludmFsaWRNZXNzYWdlOwotICAgIGZpbmFsIHZvaWQgcmVjYWxjdWxhdGVDb250ZW50TGVuZ3RoKCkgewotICAgICAgICBJTWVzc2FnZUJvZHkgYm9keSA9IGdldE1lc3NhZ2VCb2R5KCk7Ci0gICAgICAgIGlmIChib2R5LmdldENvbnRlbnRMZW5ndGgoKSA9PSAtMSkgewotICAgICAgICAgICAgY29udGVudExlbmd0aEludmFsaWRNZXNzYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gYm9keS5nZXRNZXNzYWdlQm9keUlucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgaW50IGI7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBpcy5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiA8IDApIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgb3Mud3JpdGUoYik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ5dGVbXSBib2R5Qnl0ZUFycmF5ID0gb3MudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBuZXdJcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib2R5Qnl0ZUFycmF5KTsKLSAgICAgICAgICAgICAgICBzZXRPcmlnaW5hbE1lc3NhZ2VCb2R5KG5ldyBNZXNzYWdlQm9keShuZXdJcywgYm9keUJ5dGVBcnJheS5sZW5ndGgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgcmVnYXJkIGJvZHkgaXMgZW1wdHkuCi0gICAgICAgICAgICAgICAgc2V0T3JpZ2luYWxNZXNzYWdlQm9keShuZXcgTWVzc2FnZUJvZHkoaXMsIDApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlI2lzQ29ubmVjdGlvblNodXRkb3duUmVxdWlyZWQoKQotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGlvblNodXRkb3duUmVxdWlyZWQoKSB7Ci0gICAgICAgIGlmICghaXNDb25uZWN0aW9uVG9CZUNsb3NlZCgpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIElNZXNzYWdlQm9keSBib2R5ID0gZ2V0TWVzc2FnZUJvZHkoKTsKLSAgICAgICAgaWYgKGJvZHkuaXNDaHVua2VkRW5jb2RpbmcoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIWNvbnRlbnRMZW5ndGhJbnZhbGlkTWVzc2FnZSAmJiAoYm9keS5nZXRDb250ZW50TGVuZ3RoKCkgPj0gMCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVCb2R5V2l0aG91dENvbnRlbnRMZW5ndGgobG9uZyB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNZXNzYWdlQm9keSBtc2dCb2R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQpIHsKLSAgICAgICAgLy8gZG8gbm90aGluZy4gIFdlIHJlZ2FyZCBib2R5IGlzIGVtcHR5LgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9IVFRQUmVxdWVzdFJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUFJlcXVlc3RSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhNDAxMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9IVFRQUmVxdWVzdFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLlRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgSFRUUFJlcXVlc3RSZWFkZXIgZXh0ZW5kcyBIVFRQTWVzc2FnZVJlYWRlciB7Ci0gICAgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEhUVFBSZXF1ZXN0UmVhZGVyLmNsYXNzKTsKLQotICAgIC8vIFJlcXVlc3QgPSBSZXF1ZXN0LUxpbmUKLSAgICAvLyAgICAgICAgICAgICAgICAgICooKCBnZW5lcmFsLWhlYWRlcgotICAgIC8vICAgICAgICAgICAgICAgICAgICB8IHJlcXVlc3QtaGVhZGVyCi0gICAgLy8gICAgICAgICAgICAgICAgICAgIHwgZW50aXR5LWhlYWRlciApIENSTEYpCi0gICAgLy8gICAgICAgICAgICAgICAgICBDUkxGCi0gICAgLy8gICAgICAgICAgICAgICAgICBbIG1lc3NhZ2UtYm9keSBdCi0KLSAgICBwdWJsaWMgSFRUUFJlcXVlc3RSZWFkZXIoSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgc3VwZXIoaW4pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRGaXJzdExpbmUoSFRUUE1lc3NhZ2UgbXNnLCBsb25nIHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFJlcXVlc3QtTGluZSA9IE1ldGhvZCBTUCBSZXF1ZXN0LVVSSSBTUCBIVFRQLVZlcnNpb24gQ1JMRgotICAgICAgICBJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcSA9IChJSFRUUFJlcXVlc3RNZXNzYWdlKSBtc2c7Ci0gICAgICAgIEhUVFBNZXNzYWdlQnVmZmVyIGJ1ZiA9IG1zZy5nZXRCdWZmZXIoKTsKLQotICAgICAgICAvLyBBbHRob3VnaCBza2lwcGluZyB3aGl0ZXNwYWNlcyBpcyBub3QgYWN0dWFsbHkgY29ycmVjdCwgYSBtZXNzYWdlIHNvbWV0aW1lcyBzdGFydHMgd2l0aCB3aGl0ZXNwYWNlcy4KLSAgICAgICAgc2tpcFNwYWNlQ1JBbmRMRnModGltZW91dCk7Ci0KLSAgICAgICAgcmVhZE5leHRUb2tlbih0aW1lb3V0LCBidWYsIHJlcS5nZXRNZXRob2QoKSwgU1ApOwotICAgICAgICBpZiAoZ2V0TGFzdEJ5dGUoKSA9PSAtMSkgewotICAgICAgICAJdGhyb3cgbmV3IEhUVFBDb25uZWN0aW9uRXhjZXB0aW9uKCJSZXF1ZXN0IGNvbm5lY3Rpb24gaXMgY2xvc2VkLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRMYXN0Qnl0ZSgpICE9IFNQKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2hhciAoZXhwZWN0ZWQ9U1ApOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvU3RyaW5nKGdldExhc3RCeXRlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLyIgKyBidWYuZ2V0QXNTdHJpbmcocmVxLmdldE1ldGhvZCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2tpcFNwYWNlcyh0aW1lb3V0LCBidWYpOwotICAgICAgICByZWFkTmV4dFRva2VuKHRpbWVvdXQsIGJ1ZiwgcmVxLmdldFJlcXVlc3RVUkkoKSwgU1ApOwotICAgICAgICBpZiAoZ2V0TGFzdEJ5dGUoKSAhPSBTUCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNoYXIgKGV4cGVjdGVkPVNQKTogIiArIEludGVnZXIudG9TdHJpbmcoZ2V0TGFzdEJ5dGUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHNraXBTcGFjZXModGltZW91dCwgYnVmKTsKLSAgICAgICAgcmVhZE5leHRUb2tlbih0aW1lb3V0LCBidWYsIHJlcS5nZXRIVFRQVmVyc2lvbigpKTsKLSAgICAgICAgaWYgKGdldExhc3RCeXRlKCkgIT0gTEYpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5leHBlY3RlZCBjaGFyIChleHBlY3RlZD1MRik6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGdldExhc3RCeXRlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YjkxYmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JTWVzc2FnZUJvZHk7Ci0KLXB1YmxpYyBjbGFzcyBIVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UgZXh0ZW5kcyBIVFRQUmVzcG9uc2VNZXNzYWdlIGltcGxlbWVudHMgSUhUVFBSZXNwb25zZU1lc3NhZ2V7Ci0gICAgLy8gUmVxdWVzdCA9IFN0YXR1cy1MaW5lCi0gICAgLy8gKigoIGdlbmVyYWwtaGVhZGVyCi0gICAgLy8gfCByZXF1ZXN0LWhlYWRlcgotICAgIC8vIHwgZW50aXR5LWhlYWRlciApIENSTEYpCi0gICAgLy8gQ1JMRgotICAgIC8vIFsgbWVzc2FnZS1ib2R5IF0KLSAgICAvLyBTdGF0dXMtTGluZSA9IEhUVFAtVmVyc2lvbiBTUCBTdGF0dXMtQ29kZSBTUCBSZWFzb24tUGhyYXNlIENSTEYKLQotICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHZlcnNpb247Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBzdGF0dXNDb2RlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gcmVhc29uUGhyYXNlOwotCi0gICAgcHJvdGVjdGVkIEhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZShsb25nIHNlcmlhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHN0YXR1c0NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcmVhc29uUGhyYXNlKSB7Ci0gICAgICAgIHN1cGVyKHNlcmlhbCk7Ci0gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7Ci0gICAgICAgIHRoaXMucmVhc29uUGhyYXNlID0gcmVhc29uUGhyYXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBIVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UobG9uZyBzZXJpYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBzdGF0dXNDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHJlYXNvblBocmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBib2R5KSB7Ci0gICAgICAgIHRoaXMoc2VyaWFsLCB2ZXJzaW9uLCBzdGF0dXNDb2RlLCByZWFzb25QaHJhc2UpOwotICAgICAgICBJTWVzc2FnZUJvZHkgbXNnQm9keSA9IG5ldyBNZXNzYWdlQm9keShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9keSksIGJvZHkubGVuZ3RoKTsKLSAgICAgICAgc3VwZXIuc2V0T3JpZ2luYWxNZXNzYWdlQm9keShtc2dCb2R5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRCYXNlSGVhZGVycyhJSFRUUE1lc3NhZ2UgYmFzZSkgewotICAgICAgICBmb3IgKElIVFRQSGVhZGVyIGggOiBiYXNlLmdldEhlYWRlcnMoKSkgewotICAgICAgICAgICAgaWYgKCFoLmlzRmllbGROYW1lRXF1YWxzVG8oSUhUVFBIZWFkZXIuQ09OVEVOVF9MRU5HVEhfQSkpIHsKLSAgICAgICAgICAgICAgICBzZXRIZWFkZXIoaC5nZXROYW1lKCksIGguZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKElIVFRQUmVzcG9uc2VNZXNzYWdlIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYm9keSkgewotICAgICAgICB0aGlzKGJhc2UuZ2V0U2VyaWFsKCksCi0gICAgICAgICAgICAgYmFzZS5nZXRIVFRQVmVyc2lvbkFzQnl0ZXMoKSwKLSAgICAgICAgICAgICBiYXNlLmdldFN0YXR1c0NvZGVBc0J5dGVzKCksCi0gICAgICAgICAgICAgYmFzZS5nZXRSZWFzb25QaHJhc2VBc0J5dGVzKCksCi0gICAgICAgICAgICAgYm9keSk7Ci0gICAgICAgIHNldEJhc2VIZWFkZXJzKGJhc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SFRUUFZlcnNpb25Bc1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcodmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRIVFRQVmVyc2lvbkFzQnl0ZXMoKSB7Ci0gICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzQ29kZUFzU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhzdGF0dXNDb2RlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldFN0YXR1c0NvZGVBc0J5dGVzKCkgewotICAgICAgICByZXR1cm4gc3RhdHVzQ29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlYXNvblBocmFzZUFzU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZWFzb25QaHJhc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0UmVhc29uUGhyYXNlQXNCeXRlcygpIHsKLSAgICAgICAgcmV0dXJuIHJlYXNvblBocmFzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpcnN0TGluZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQud3JpdGUodmVyc2lvbik7Ci0gICAgICAgIG91dC53cml0ZShTUCk7Ci0gICAgICAgIG91dC53cml0ZShzdGF0dXNDb2RlKTsKLSAgICAgICAgb3V0LndyaXRlKFNQKTsKLSAgICAgICAgb3V0LndyaXRlKHJlYXNvblBocmFzZSk7Ci0gICAgICAgIG91dC53cml0ZShDUik7Ci0gICAgICAgIG91dC53cml0ZShMRik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUFJlc3BvbnNlTWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUFJlc3BvbnNlTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTA5NWUzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBSZXNwb25zZU1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JTWVzc2FnZUJvZHk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBIVFRQUmVzcG9uc2VNZXNzYWdlIGV4dGVuZHMgSFRUUE1lc3NhZ2UgaW1wbGVtZW50cyBJSFRUUFJlc3BvbnNlTWVzc2FnZSB7Ci0gICAgLy8gUmVxdWVzdCA9IFN0YXR1cy1MaW5lCi0gICAgLy8gICAgICAgICAgICAgICAgICAqKCggZ2VuZXJhbC1oZWFkZXIKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgfCByZXF1ZXN0LWhlYWRlcgotICAgIC8vICAgICAgICAgICAgICAgICAgICB8IGVudGl0eS1oZWFkZXIgKSBDUkxGKQotICAgIC8vICAgICAgICAgICAgICAgICAgQ1JMRgotICAgIC8vICAgICAgICAgICAgICAgICAgWyBtZXNzYWdlLWJvZHkgXQotICAgIC8vIFN0YXR1cy1MaW5lID0gSFRUUC1WZXJzaW9uIFNQIFN0YXR1cy1Db2RlIFNQIFJlYXNvbi1QaHJhc2UgQ1JMRgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBTVEFUVVNfTk9fQ09OVEVOVF9BID0gIjIwNCIuZ2V0Qnl0ZXMoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gU1RBVFVTX05PVF9NT0RJRklFRF9BID0gIjMwNCIuZ2V0Qnl0ZXMoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXUklURUJPRFlfREVGQVVMVF9XQUlUX0RFTk9NID0gMTA7Ci0KLSAgICBwcm90ZWN0ZWQgSFRUUFJlc3BvbnNlTWVzc2FnZShsb25nIHNlcmlhbCkgewotICAgICAgICBzdXBlcihzZXJpYWwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQm9keUVtcHR5KCkgewotICAgICAgICBieXRlW10gc3RhdENvZGUgPSBnZXRTdGF0dXNDb2RlQXNCeXRlcygpOwotICAgICAgICByZXR1cm4gKEFycmF5cy5lcXVhbHMoc3RhdENvZGUsIFNUQVRVU19OT19DT05URU5UX0EpCi0gICAgICAgICAgICAgICAgfHwgQXJyYXlzLmVxdWFscyhzdGF0Q29kZSwgU1RBVFVTX05PVF9NT0RJRklFRF9BKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VNZXNzYWdlI2dldFN0YXR1c0NvZGVBc1N0cmluZygpCi0JICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGF0dXNDb2RlQXNTdHJpbmcoKTsKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2UjZ2V0U3RhdHVzQ29kZUFzQnl0ZXMoKQotCSAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0U3RhdHVzQ29kZUFzQnl0ZXMoKTsKLSAgICAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VNZXNzYWdlI2dldFJlYXNvblBocmFzZUFzU3RyaW5nKCkKLQkgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFJlYXNvblBocmFzZUFzU3RyaW5nKCk7Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VNZXNzYWdlI2dldFJlYXNvblBocmFzZUFzQnl0ZXMoKQotCSAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBieXRlW10gZ2V0UmVhc29uUGhyYXNlQXNCeXRlcygpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVCb2R5V2l0aG91dENvbnRlbnRMZW5ndGgobG9uZyB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNZXNzYWdlQm9keSBtc2dCb2R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc0Nvbm5lY3Rpb25Ub0JlQ2xvc2VkKCkpIHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGJvZHkgPSBtc2dCb2R5LmdldE1lc3NhZ2VCb2R5SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIC8vIFdyaXRlIHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICBpbnQgYiA9IGJvZHkucmVhZCgpOwotICAgICAgICAgICAgICAgIGlmIChiIDwgMCkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gYm9keSA9IG1zZ0JvZHkuZ2V0TWVzc2FnZUJvZHlUaW1lb3V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIC8vIFRyeSB0byByZWFkIHRoZSBpbmNvbWluZyBkYXRhIGFzIG11Y2ggYXMgd2UgY2FuLgotICAgICAgICAgICAgbG9uZyBrZWVwQWxpdmVUaW1lb3V0ID0gdGltZW91dCAvIFdSSVRFQk9EWV9ERUZBVUxUX1dBSVRfREVOT007Ci0gICAgICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsJCQkJCQkJCQkJCQkvLyBERUJVRwotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsJCQkJCQkJCQkvLyBERUJVRwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgia2VlcEFsaXZlVGltZW91dD0iICsga2VlcEFsaXZlVGltZW91dCArICIgbXMiKTsgCQkJCQkvLyBERUJVRwotICAgICAgICAgICAgICAgIExPR0dFUi5kZWJ1ZyhzYi50b1N0cmluZygpKTsJCQkJCQkJCQkJCS8vIERFQlVHCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNiLnRvU3RyaW5nKCkpOyAvLyBERUJVRwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOyAgCi0gICAgICAgICAgICBsb25nIGJlZm9yZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgd2hpbGUgKChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZSkgPCBrZWVwQWxpdmVUaW1lb3V0KSB7Ci0gICAgICAgICAgICAJaW50IGI7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAJYiA9IGJvZHkucmVhZCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYiA8IDApIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAJY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dC53cml0ZShiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewkJCQkJCQkJCQkJCS8vIERFQlVHCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwkJCQkJCQkJCS8vIERFQlVHCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJlbGFwc2VkICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCkgKyAiIG1zIik7IAkJLy8gREVCVUcKLSAgICAgICAgICAgICAgICBMT0dHRVIuZGVidWcoc2IudG9TdHJpbmcoKSk7CQkJCQkJCQkJCQkvLyBERUJVRwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsgLy8gREVCVUcKLSAgICAgICAgICAgIH0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gREVCVUcKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBSZXNwb25zZVB1c2hiYWNrTWVzc2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMThiODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoaW4gU0FJVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZVB1c2hiYWNrTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSU1lc3NhZ2VCb2R5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JUHVzaGJhY2tNZXNzYWdlQm9keTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuVGltZW91dEV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlIGV4dGVuZHMgSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlIGltcGxlbWVudHMgSUhUVFBSZXNwb25zZVB1c2hiYWNrTWVzc2FnZXsKLQotICAgICBwdWJsaWMgSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlKGxvbmcgc2VyaWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBzdGF0dXNDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSByZWFzb25QaHJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1lc3NhZ2VCb2R5IGJvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHB1c2hiYWNrQnVmZmVyU2l6ZSkgewotICAgICAgICBzdXBlcihzZXJpYWwsIHZlcnNpb24sIHN0YXR1c0NvZGUsIHJlYXNvblBocmFzZSk7Ci0gICAgICAgIGlmIChib2R5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gYm9keS5nZXRNZXNzYWdlQm9keVRpbWVvdXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgSU1lc3NhZ2VCb2R5IG1zZ0JvZHk7Ci0gICAgICAgICAgICBpZiAoYm9keS5pc0NodW5rZWRFbmNvZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgbXNnQm9keSA9IG5ldyBQdXNoYmFja01lc3NhZ2VCb2R5KGlzLCBwdXNoYmFja0J1ZmZlclNpemUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtc2dCb2R5ID0gbmV3IFB1c2hiYWNrTWVzc2FnZUJvZHkoaXMsIHB1c2hiYWNrQnVmZmVyU2l6ZSwgYm9keS5nZXRDb250ZW50TGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VwZXIuc2V0T3JpZ2luYWxNZXNzYWdlQm9keShtc2dCb2R5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENhdXRpb24hISEhIFdpdGhvdXQgcHVzaGJhY2sgb3B0aW9uLCBib2R5IHdpbGwgYmUgaW52YWxpZGF0ZWQuCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VQdXNoYmFja01lc3NhZ2UjcmVhZEJvZHkobG9uZywgYm9vbGVhbikKLQkgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIHJlYWRCb2R5KGxvbmcgdGltZW91dCwgYm9vbGVhbiBwdXNoYmFjaykKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgUHVzaGJhY2tNZXNzYWdlQm9keSBtc2dCb2R5ID0gKFB1c2hiYWNrTWVzc2FnZUJvZHkpIGdldE1lc3NhZ2VCb2R5KCk7Ci0gICAgICAgIGlmIChtc2dCb2R5ID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICBJbnB1dFN0cmVhbSBib2R5ID0gbXNnQm9keS5nZXRNZXNzYWdlQm9keUlucHV0U3RyZWFtKCk7Ci0gICAgICAgIGludCBjb250ZW50TGVuZ3RoID0gbXNnQm9keS5nZXRDb250ZW50TGVuZ3RoKCk7Ci0gICAgICAgIGlmIChib2R5ID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGlmIChjb250ZW50TGVuZ3RoID49IDApIHsKLSAgICAgICAgICAgIC8vIG5vcm1hbCBlbmNvZGluZwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBvcy53cml0ZShib2R5LnJlYWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBjaHVua2VkIGVuY29kaW5nCi0gICAgICAgICAgICBDaHVua2VkTWVzc2FnZUJvZHlSZWFkZXIgY2h1bmtSZWFkZXIgPSBuZXcgQ2h1bmtlZE1lc3NhZ2VCb2R5UmVhZGVyKGJvZHkpOwotICAgICAgICAgICAgY2h1bmtSZWFkZXIucmVhZENodW5rZWRNZXNzYWdlKHRpbWVvdXQsIG9zLCB0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBieXRlW10gb3V0Qnl0ZXMgPSBvcy50b0J5dGVBcnJheSgpOwotICAgICAgICBpZiAocHVzaGJhY2spIHsKLSAgICAgICAgICAgIFB1c2hiYWNrSW5wdXRTdHJlYW0gaXMgPSBtc2dCb2R5LmdldE1lc3NhZ2VCb2R5UHVzaEJhY2tJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgaXMudW5yZWFkKG91dEJ5dGVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3V0Qnl0ZXM7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgSFRUUFJlc3BvbnNlUHVzaGJhY2tNZXNzYWdlKElIVFRQUmVzcG9uc2VNZXNzYWdlIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHVzaGJhY2tCdWZmZXJTaXplKSB7Ci0gICAgICAgIHRoaXMoYmFzZS5nZXRTZXJpYWwoKSwKLSAgICAgICAgICAgICBiYXNlLmdldEhUVFBWZXJzaW9uQXNCeXRlcygpLAotICAgICAgICAgICAgIGJhc2UuZ2V0U3RhdHVzQ29kZUFzQnl0ZXMoKSwKLSAgICAgICAgICAgICBiYXNlLmdldFJlYXNvblBocmFzZUFzQnl0ZXMoKSwKLSAgICAgICAgICAgICBiYXNlLmdldE1lc3NhZ2VCb2R5KCksCi0gICAgICAgICAgICAgcHVzaGJhY2tCdWZmZXJTaXplKTsKLSAgICAgICAgc2V0QmFzZUhlYWRlcnMoYmFzZSk7Ci0gICAgfQotCi0JcHVibGljIElQdXNoYmFja01lc3NhZ2VCb2R5IGdldFB1c2hiYWNrTWVzc2FnZUJvZHkoKSB7Ci0gICAgICAgIHJldHVybiAoUHVzaGJhY2tNZXNzYWdlQm9keSkgZ2V0TWVzc2FnZUJvZHkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9IVFRQUmVzcG9uc2VSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBSZXNwb25zZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzRmZTI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hUVFBSZXNwb25zZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlkZWtpIFRBSSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5UaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5Mb2dnZXI7Ci0KLQotcHVibGljIGNsYXNzIEhUVFBSZXNwb25zZVJlYWRlciBleHRlbmRzIEhUVFBNZXNzYWdlUmVhZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihIVFRQUmVzcG9uc2VSZWFkZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgaWQ7Ci0KLSAgICAvLyBSZXF1ZXN0ID0gU3RhdHVzLUxpbmUKLSAgICAvLyAqKCggZ2VuZXJhbC1oZWFkZXIKLSAgICAvLyB8IHJlcXVlc3QtaGVhZGVyCi0gICAgLy8gfCBlbnRpdHktaGVhZGVyICkgQ1JMRikKLSAgICAvLyBDUkxGCi0gICAgLy8gWyBtZXNzYWdlLWJvZHkgXQotICAgIC8vIFN0YXR1cy1MaW5lID0gSFRUUC1WZXJzaW9uIFNQIFN0YXR1cy1Db2RlIFNQIFJlYXNvbi1QaHJhc2UgQ1JMRgotCi0gICAgcHVibGljIEhUVFBSZXNwb25zZVJlYWRlcihpbnQgaWQsIElucHV0U3RyZWFtIGluKSB7Ci0gICAgICAgIHN1cGVyKGluKTsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLSAgICAgICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVhZEZpcnN0TGluZShIVFRQTWVzc2FnZSBtc2csIGxvbmcgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gUmVxdWVzdC1MaW5lID0gTWV0aG9kIFNQIFJlcXVlc3QtVVJJIFNQIEhUVFAtVmVyc2lvbiBDUkxGCi0gICAgICAgIEhUVFBSZXNwb25zZVN0cmVhbU1lc3NhZ2UgcmVzcG9uc2UgPSAoSFRUUFJlc3BvbnNlU3RyZWFtTWVzc2FnZSkgbXNnOwotICAgICAgICBIVFRQTWVzc2FnZUJ1ZmZlciBidWYgPSBtc2cuZ2V0QnVmZmVyKCk7Ci0KLSAgICAgICAgcmVhZE5leHRUb2tlbih0aW1lb3V0LCBidWYsIHJlc3BvbnNlLmdldEhUVFBWZXJzaW9uKCksIFNQKTsKLSAgICAgICAgaWYgKGdldExhc3RCeXRlKCkgIT0gU1ApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5leHBlY3RlZCBjaGFyIChleHBlY3RlZD1TUCk6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGdldExhc3RCeXRlKCkpKTsKLSAgICAgICAgfQotICAgICAgICBza2lwU3BhY2VzKHRpbWVvdXQsIGJ1Zik7Ci0gICAgICAgIHJlYWROZXh0VG9rZW4odGltZW91dCwgYnVmLCByZXNwb25zZS5nZXRTdGF0dXNDb2RlKCksIFNQKTsKLSAgICAgICAgaWYgKGdldExhc3RCeXRlKCkgIT0gU1ApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5leHBlY3RlZCBjaGFyIChleHBlY3RlZD1TUCk6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGdldExhc3RCeXRlKCkpKTsKLSAgICAgICAgfQotICAgICAgICBza2lwU3BhY2VzKHRpbWVvdXQsIGJ1Zik7Ci0gICAgICAgIHJlYWROZXh0VG9rZW4odGltZW91dCwgYnVmLCByZXNwb25zZS5nZXRSZWFzb25QaHJhc2UoKSk7Ci0gICAgICAgIGlmIChnZXRMYXN0Qnl0ZSgpICE9IExGKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2hhciAoZXhwZWN0ZWQ9TEYpOiAiICsgSW50ZWdlci50b1N0cmluZyhnZXRMYXN0Qnl0ZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0dHRVIuZGVidWcoIlJlc3BvbnNlLVJGTDoiICsgcmVzcG9uc2UuZ2V0SFRUUFZlcnNpb25Bc1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiICIgKyByZXNwb25zZS5nZXRTdGF0dXNDb2RlQXNTdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAiICsgcmVzcG9uc2UuZ2V0UmVhc29uUGhyYXNlQXNTdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgIHByb3RlY3RlZCBIVFRQTWVzc2FnZSByZWFkTWVzc2FnZUJvZHkoSFRUUE1lc3NhZ2UgbXNnLCBpbnQgY29udGVudExlbmd0aCwgbG9uZyB0aW1lb3V0KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBpZiAobXNnLmlzQ2h1bmtlZEVuY29kaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIERFQlVHKCJDaGFua2VkRW5jb2Rpbmc6IiArIG1zZy5nZXRTZXJpYWwoKSArICJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVhZENodW5rZWRNZXNzYWdlQm9keSgwLCBtc2cpOwotICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRMZW5ndGggPj0gMCkgewotICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUcoIkNvbnRlbnQtTGVuZ3RoOiIgKyBjb250ZW50TGVuZ3RoICsgIiAiICsgbXNnLmdldFNlcmlhbCgpICsgIlxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcmVhZEJ5dGVzID0gcmVhZEJ5dGVzKDAsIG1zZywgY29udGVudExlbmd0aCk7Ci0gICAgICAgICAgICBtc2cubWFya01lc3NhZ2VCb2R5RW5kKCk7Ci0gICAgICAgICAgICBpZiAocmVhZEJ5dGVzICE9IGNvbnRlbnRMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBGQVRBTCgiSWxsZWdhbCBtZXNzYWdlIGJvZHk6IHJlYWQ9IiArIHJlYWRCeXRlcyArICIsIGNvbnRlbnRMZW5ndGg9IiArIGNvbnRlbnRMZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUcoIkVuZCBpcyBtYXJrZWQgYnkgQ1MuIiArIG1zZy5nZXRTZXJpYWwoKSArICJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVhZEJ5dGVzKDAsIG1zZyk7Ci0gICAgICAgICAgICBtc2cubWFya01lc3NhZ2VCb2R5RW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1zZzsKLSAgICB9Ci0gICAgICovCi0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgV0FSTklORyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCJbaWQ6IikuYXBwZW5kKGlkKS5hcHBlbmQoIl0gSFRUUFJlc3BvbnNlUmVhZGVyOiAiKTsKLSAgICAgICAgc2IuYXBwZW5kKG1zZyk7Ci0gICAgICAgIExPR0dFUi53YXJuaW5nKHNiLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgdm9pZCBERUJVRyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCJbaWQ6IikuYXBwZW5kKGlkKS5hcHBlbmQoIl0gSFRUUFJlc3BvbnNlUmVhZGVyOiAiKTsKLSAgICAgICAgc2IuYXBwZW5kKG1zZyk7Ci0gICAgICAgIExPR0dFUi5kZWJ1ZyhzYi50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgRkFUQUwoU3RyaW5nIG1zZykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCgiW2lkOiIpLmFwcGVuZChpZCkuYXBwZW5kKCJdIEhUVFBSZXNwb25zZVJlYWRlcjogIik7Ci0gICAgICAgIHNiLmFwcGVuZChtc2cpOwotICAgICAgICBMT0dHRVIuZmF0YWwoc2IudG9TdHJpbmcoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9IVFRQUmVzcG9uc2VTdHJlYW1NZXNzYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9IVFRQUmVzcG9uc2VTdHJlYW1NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NzI1YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSFRUUFJlc3BvbnNlU3RyZWFtTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JQnVmZmVyUmFuZ2U7Ci0KLQotcHVibGljIGNsYXNzIEhUVFBSZXNwb25zZVN0cmVhbU1lc3NhZ2UgZXh0ZW5kcyBIVFRQUmVzcG9uc2VNZXNzYWdlIHsKLSAgICAvLyBSZXF1ZXN0ID0gU3RhdHVzLUxpbmUKLSAgICAvLyAgICAgICAgICAgICAgICAgICooKCBnZW5lcmFsLWhlYWRlcgotICAgIC8vICAgICAgICAgICAgICAgICAgICB8IHJlcXVlc3QtaGVhZGVyCi0gICAgLy8gICAgICAgICAgICAgICAgICAgIHwgZW50aXR5LWhlYWRlciApIENSTEYpCi0gICAgLy8gICAgICAgICAgICAgICAgICBDUkxGCi0gICAgLy8gICAgICAgICAgICAgICAgICBbIG1lc3NhZ2UtYm9keSBdCi0gICAgLy8gU3RhdHVzLUxpbmUgPSBIVFRQLVZlcnNpb24gU1AgU3RhdHVzLUNvZGUgU1AgUmVhc29uLVBocmFzZSBDUkxGCi0KLSAgICBwcml2YXRlIElCdWZmZXJSYW5nZSBmSFRUUFZlcnNpb247Ci0gICAgcHJpdmF0ZSBJQnVmZmVyUmFuZ2UgZlN0YXR1c0NvZGU7Ci0gICAgcHJpdmF0ZSBJQnVmZmVyUmFuZ2UgZlJlYXNvblBocmFzZTsKLQotICAgIHB1YmxpYyBIVFRQUmVzcG9uc2VTdHJlYW1NZXNzYWdlKGxvbmcgc2VyaWFsKSB7Ci0gICAgICAgIHN1cGVyKHNlcmlhbCk7Ci0gICAgICAgIGZIVFRQVmVyc2lvbiA9IG5ldyBCdWZmZXJSYW5nZSgpOwotICAgICAgICBmU3RhdHVzQ29kZSA9IG5ldyBCdWZmZXJSYW5nZSgpOwotICAgICAgICBmUmVhc29uUGhyYXNlID0gbmV3IEJ1ZmZlclJhbmdlKCk7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgSUJ1ZmZlclJhbmdlIGdldEhUVFBWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gZkhUVFBWZXJzaW9uOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRIVFRQVmVyc2lvbkFzU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKCkuZ2V0QXNTdHJpbmcoZkhUVFBWZXJzaW9uKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBieXRlW10gZ2V0SFRUUFZlcnNpb25Bc0J5dGVzKCkgewotICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKCkuZ2V0QXNCeXRlcyhmSFRUUFZlcnNpb24pOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIElCdWZmZXJSYW5nZSBnZXRTdGF0dXNDb2RlKCkgewotICAgICAgICByZXR1cm4gZlN0YXR1c0NvZGU7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvZGVBc1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1ZmZlcigpLmdldEFzU3RyaW5nKGZTdGF0dXNDb2RlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldFN0YXR1c0NvZGVBc0J5dGVzKCkgewotICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKCkuZ2V0QXNCeXRlcyhmU3RhdHVzQ29kZSk7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgSUJ1ZmZlclJhbmdlIGdldFJlYXNvblBocmFzZSgpIHsKLSAgICAgICAgcmV0dXJuIGZSZWFzb25QaHJhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWFzb25QaHJhc2VBc1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1ZmZlcigpLmdldEFzU3RyaW5nKGZSZWFzb25QaHJhc2UpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIGJ5dGVbXSBnZXRSZWFzb25QaHJhc2VBc0J5dGVzKCkgewotICAgICAgICByZXR1cm4gZ2V0QnVmZmVyKCkuZ2V0QXNCeXRlcyhmUmVhc29uUGhyYXNlKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlRmlyc3RMaW5lKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEhUVFBNZXNzYWdlQnVmZmVyIGJ1ZiA9IGdldEJ1ZmZlcigpOwotICAgICAgICBidWYud3JpdGVUbyhvdXQsIGZIVFRQVmVyc2lvbik7Ci0gICAgICAgIG91dC53cml0ZShTUCk7Ci0gICAgICAgIGJ1Zi53cml0ZVRvKG91dCwgZlN0YXR1c0NvZGUpOwotICAgICAgICBvdXQud3JpdGUoU1ApOwotICAgICAgICBidWYud3JpdGVUbyhvdXQsIGZSZWFzb25QaHJhc2UpOwotICAgICAgICBvdXQud3JpdGUoQ1IpOwotICAgICAgICBvdXQud3JpdGUoTEYpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hlYWRlckluQnVmZmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9IZWFkZXJJbkJ1ZmZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2VhNmQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL0hlYWRlckluQnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklCdWZmZXJSYW5nZTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgSGVhZGVySW5CdWZmZXIgZXh0ZW5kcyBIVFRQSGVhZGVyIHsKLSAgICBwcml2YXRlIEhUVFBNZXNzYWdlQnVmZmVyIGZCdWZmZXI7Ci0gICAgcHJpdmF0ZSBJQnVmZmVyUmFuZ2UgZk5hbWU7Ci0gICAgcHJpdmF0ZSBJQnVmZmVyUmFuZ2UgZlZhbHVlOwotICAgIHByaXZhdGUgYnl0ZVtdIGZSZXBsYWNlZFZhbHVlOwotCQotICAgIHB1YmxpYyBIZWFkZXJJbkJ1ZmZlcigpIHsKLSAgICAgICAgZk5hbWUgPSBudWxsOwotICAgICAgICBmVmFsdWUgPSBudWxsOwotICAgICAgICBmUmVwbGFjZWRWYWx1ZSA9IG51bGw7Ci0gICAgfQotCQotICAgIHB1YmxpYyB2b2lkIGluaXQoSFRUUE1lc3NhZ2VCdWZmZXIgYnVmZmVyLCBJQnVmZmVyUmFuZ2UgbmFtZSwgSUJ1ZmZlclJhbmdlIHZhbHVlKSB7Ci0gICAgICAgIGZCdWZmZXIgPSBidWZmZXI7Ci0gICAgICAgIGZOYW1lID0gbmFtZTsKLSAgICAgICAgZlZhbHVlID0gdmFsdWU7Ci0gICAgICAgIGZSZXBsYWNlZFZhbHVlID0gbnVsbDsKLSAgICB9Ci0JCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIGZOYW1lID0gbnVsbDsKLSAgICAgICAgZlZhbHVlID0gbnVsbDsKLSAgICAgICAgZlJlcGxhY2VkVmFsdWUgPSBudWxsOwotICAgIH0KLQkKLSAgICBwdWJsaWMgSUJ1ZmZlclJhbmdlIGdldE5hbWVBc0J1ZmZlclJhbmdlKCkgewotICAgICAgICByZXR1cm4gZk5hbWU7Ci0gICAgfQotCQotICAgIHB1YmxpYyBJQnVmZmVyUmFuZ2UgZ2V0VmFsdWVBc0J1ZmZlclJhbmdlKCkgewotICAgICAgICByZXR1cm4gZlZhbHVlOwotICAgIH0KLQkKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkTmFtZUVxdWFsc1RvKGJ5dGVbXSBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBmQnVmZmVyLmVxdWFsc0lnbm9yZUNhc2UoZk5hbWUsIG5hbWUpOwotICAgIH0KLQkKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkVmFsdWVFcXVhbHNUbyhieXRlW10gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGZCdWZmZXIuZXF1YWxzKGZWYWx1ZSwgdmFsdWUpOwotICAgIH0KLQkKLSAgICBwdWJsaWMgYnl0ZVtdIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmQnVmZmVyLmdldEFzQnl0ZXMoZk5hbWUpOwotICAgIH0KLQkKLSAgICBwdWJsaWMgYnl0ZVtdIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gZkJ1ZmZlci5nZXRBc0J5dGVzKGZWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoYnl0ZVtdIHZhbHVlKSB7Ci0gICAgICAgIGZWYWx1ZSA9IG51bGw7Ci0gICAgICAgIGZSZXBsYWNlZFZhbHVlID0gdmFsdWU7Ci0gICAgfQotCQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZCdWZmZXIud3JpdGVUbyhvdXQsIGZOYW1lKTsKLSAgICAgICAgd3JpdGVIZWFkZXJTZXBhcmF0b3Iob3V0KTsKLSAgICAgICAgaWYgKGZWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmQnVmZmVyLndyaXRlVG8ob3V0LCBmVmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKGZSZXBsYWNlZFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG91dC53cml0ZShmUmVwbGFjZWRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9IZWFkZXJUb0FkZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvSGVhZGVyVG9BZGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIwMWY2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9IZWFkZXJUb0FkZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgSGVhZGVyVG9BZGQgZXh0ZW5kcyBIVFRQSGVhZGVyIHsKLSAgICBwcml2YXRlIGJ5dGVbXSBmTmFtZTsKLSAgICBwcml2YXRlIGJ5dGVbXSBmVmFsdWU7Ci0JCi0gICAgcHVibGljIEhlYWRlclRvQWRkKCkgewotICAgICAgICBmTmFtZSA9IG51bGw7Ci0gICAgICAgIGZWYWx1ZSA9IG51bGw7Ci0gICAgfQotCQotICAgIHB1YmxpYyB2b2lkIGluaXQoYnl0ZVtdIG5hbWUsIGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICBmTmFtZSA9IG5hbWU7Ci0gICAgICAgIGZWYWx1ZSA9IHZhbHVlOwotICAgIH0KLQkKLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgZk5hbWUgPSBudWxsOwotICAgICAgICBmVmFsdWUgPSBudWxsOwotICAgIH0KLQkKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkTmFtZUVxdWFsc1RvKGJ5dGVbXSBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlSWdub3JlQ2FzZShuYW1lLCBmTmFtZSk7Ci0gICAgfQotCQotICAgIHB1YmxpYyBib29sZWFuIGlzRmllbGRWYWx1ZUVxdWFsc1RvKGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gY29tcGFyZSh2YWx1ZSwgZlZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJ5dGVbXSBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gZk5hbWU7Ci0gICAgfQotCQotICAgIHB1YmxpYyBieXRlW10gZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBmVmFsdWU7Ci0gICAgfQotCQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICBmVmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQud3JpdGUoZk5hbWUpOwotICAgICAgICB3cml0ZUhlYWRlclNlcGFyYXRvcihvdXQpOwotICAgICAgICBvdXQud3JpdGUoZlZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9NZXNzYWdlQm9keS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvTWVzc2FnZUJvZHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM5ODVjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9NZXNzYWdlQm9keS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JTWVzc2FnZUJvZHk7Ci0KLQotcHVibGljIGNsYXNzIE1lc3NhZ2VCb2R5IGltcGxlbWVudHMgSU1lc3NhZ2VCb2R5IHsKLSAgICBwcml2YXRlIGZpbmFsIElucHV0U3RyZWFtIGZNZXNzYWdlQm9keTsKLSAgICBwcml2YXRlIGZpbmFsIFNvY2tldFRpbWVvdXRSZXRyeUlucHV0U3RyZWFtIGZNZXNzYWdlQm9keVNvY2tldFRpbWVvdXRSZXRyeTsKLQotICAgIHByaXZhdGUgaW50IGZDb250ZW50TGVuZ3RoOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2h1bmtlZEVuY29kaW5nOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbWVzc2FnZSBib2R5IG9mIGNvbnRlbnQgbGVuZ3RoIGVuY29kaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtc2dCb2R5Ci0gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGgKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUJvZHkoSW5wdXRTdHJlYW0gbXNnQm9keSwgaW50IGNvbnRlbnRMZW5ndGgpIHsKLSAgICAgICAgZk1lc3NhZ2VCb2R5ID0gbXNnQm9keTsKLSAgICAgICAgZk1lc3NhZ2VCb2R5U29ja2V0VGltZW91dFJldHJ5ID0gbmV3IFNvY2tldFRpbWVvdXRSZXRyeUlucHV0U3RyZWFtKG1zZ0JvZHkpOwotICAgICAgICBmQ29udGVudExlbmd0aCA9IGNvbnRlbnRMZW5ndGg7Ci0gICAgICAgIGlzQ2h1bmtlZEVuY29kaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbWVzc2FnZSBib2R5IG9mIGNodW5rZWQgZW5jb2RpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1zZ0JvZHkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUJvZHkoSW5wdXRTdHJlYW0gbXNnQm9keSkgewotICAgICAgICBmTWVzc2FnZUJvZHkgPSBtc2dCb2R5OwotICAgICAgICBmTWVzc2FnZUJvZHlTb2NrZXRUaW1lb3V0UmV0cnkgPSBuZXcgU29ja2V0VGltZW91dFJldHJ5SW5wdXRTdHJlYW0obXNnQm9keSk7Ci0gICAgICAgIGZDb250ZW50TGVuZ3RoID0gLTE7Ci0gICAgICAgIGlzQ2h1bmtlZEVuY29kaW5nID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSU1lc3NhZ2VCb2R5I2dldENvbnRlbnRMZW5ndGgoKQotCSAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIGZDb250ZW50TGVuZ3RoOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JTWVzc2FnZUJvZHkjaXNDaHVua2VkRW5jb2RpbmcoKQotCSAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2h1bmtlZEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gaXNDaHVua2VkRW5jb2Rpbmc7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklNZXNzYWdlQm9keSNnZXRNZXNzYWdlQm9keVRpbWVvdXRJbnB1dFN0cmVhbSgpCi0JICovCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldE1lc3NhZ2VCb2R5VGltZW91dElucHV0U3RyZWFtKCkgewotICAgICAgICByZXR1cm4gZk1lc3NhZ2VCb2R5OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JTWVzc2FnZUJvZHkjZ2V0TWVzc2FnZUJvZHlJbnB1dFN0cmVhbSgpCi0JICovCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldE1lc3NhZ2VCb2R5SW5wdXRTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiBmTWVzc2FnZUJvZHlTb2NrZXRUaW1lb3V0UmV0cnk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQoIk1lc3NhZ2VCb2R5WyIpOwotICAgICAgICBpZiAoaXNDaHVua2VkRW5jb2RpbmcpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiY2h1bmtlZCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2IuYXBwZW5kKCJDb250ZW50TGVuZ3RoPSIpLmFwcGVuZChmQ29udGVudExlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKCddJyk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL1B1c2hiYWNrTWVzc2FnZUJvZHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL1B1c2hiYWNrTWVzc2FnZUJvZHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQxYTRkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9QdXNoYmFja01lc3NhZ2VCb2R5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JUHVzaGJhY2tNZXNzYWdlQm9keTsKLQotCi0KLXB1YmxpYyBjbGFzcyBQdXNoYmFja01lc3NhZ2VCb2R5IGV4dGVuZHMgTWVzc2FnZUJvZHkgaW1wbGVtZW50cyBJUHVzaGJhY2tNZXNzYWdlQm9keSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQdXNoYmFja0lucHV0U3RyZWFtIHB1c2hiYWNrSW5wdXRTdHJlYW07Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBtZXNzYWdlIGJvZHkgb2YgY29udGVudCBsZW5ndGggZW5jb2RpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1zZ0JvZHkKLSAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aAotICAgICAqLwotICAgIFB1c2hiYWNrTWVzc2FnZUJvZHkoSW5wdXRTdHJlYW0gbXNnQm9keUlucHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHB1c2hiYWNrQnVmZmVyc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb250ZW50TGVuZ3RoKSB7Ci0gICAgICAgIHN1cGVyKG1zZ0JvZHlJbnB1dFN0cmVhbSwgY29udGVudExlbmd0aCk7Ci0gICAgICAgIHRoaXMucHVzaGJhY2tJbnB1dFN0cmVhbSA9IG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKHN1cGVyLmdldE1lc3NhZ2VCb2R5SW5wdXRTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaGJhY2tCdWZmZXJzaXplKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBtZXNzYWdlIGJvZHkgb2YgY2h1bmtlZCBlbmNvZGluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbXNnQm9keQotICAgICAqLwotICAgIFB1c2hiYWNrTWVzc2FnZUJvZHkoSW5wdXRTdHJlYW0gbXNnQm9keUlucHV0U3RyZWFtLCBpbnQgcHVzaGJhY2tCdWZmZXJzaXplKSB7Ci0gICAgICAgIHN1cGVyKG1zZ0JvZHlJbnB1dFN0cmVhbSk7Ci0gICAgICAgIHRoaXMucHVzaGJhY2tJbnB1dFN0cmVhbSA9IG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKHN1cGVyLmdldE1lc3NhZ2VCb2R5SW5wdXRTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaGJhY2tCdWZmZXJzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0TWVzc2FnZUJvZHlJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgcmV0dXJuIHB1c2hiYWNrSW5wdXRTdHJlYW07Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklQdXNoYmFja01lc3NhZ2VCb2R5I2dldE1lc3NhZ2VCb2R5UHVzaEJhY2tJbnB1dFN0cmVhbSgpCi0JICovCi0gICAgcHVibGljIFB1c2hiYWNrSW5wdXRTdHJlYW0gZ2V0TWVzc2FnZUJvZHlQdXNoQmFja0lucHV0U3RyZWFtKCkgewotICAgICAgICByZXR1cm4gcHVzaGJhY2tJbnB1dFN0cmVhbTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9SZXF1ZXN0RGlzcGF0Y2hlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvUmVxdWVzdERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1ZGFmZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9SZXF1ZXN0RGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlkZWtpIFRBSSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklDbGllbnRDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVxdWVzdE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQUmVzcG9uc2VNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5UaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkudXRpbC5Mb2dnZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlcXVlc3REaXNwYXRjaGVyIGV4dGVuZHMgVGhyZWFkIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihSZXF1ZXN0RGlzcGF0Y2hlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBmSWQ7Ci0KLSAgICAvKiogTWVzc2FnZSB3aGljaCBqdXN0IGFycml2ZWQgZnJvbSBhIGNsaWVudCAqLwotICAgIHByaXZhdGUgRml4ZWRTaXplUXVldWUgZkFycml2ZWRNc2dzOwotCi0gICAgcHJpdmF0ZSBJSFRUUFJlcXVlc3RNZXNzYWdlIGZOZXh0TXNnID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBTZXNzaW9uIGZTZXNzaW9uOwotCi0gICAgcHJvdGVjdGVkIFJlcXVlc3REaXNwYXRjaGVyKFN0cmluZyBuYW1lLCBTZXNzaW9uIHNlc3Npb24sIElDbGllbnRDb25uZWN0aW9uIGNsaWVudCwgU29ja2V0IGNsaWVudFNvY2ssIGludCBxdWV1ZVNpemUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIHRoaXMuZlNlc3Npb24gPSBzZXNzaW9uOwotICAgICAgICBmSWQgPSBjbGllbnRTb2NrLmdldFBvcnQoKTsKLSAgICAgICAgZkFycml2ZWRNc2dzID0gbmV3IEZpeGVkU2l6ZVF1ZXVlKHF1ZXVlU2l6ZSk7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgaW50IGdldERpc3BhdGNoZXJJZCgpIHsKLSAgICAgICAgcmV0dXJuIGZJZDsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHB1dFJlcXVlc3QoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXEsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgZkFycml2ZWRNc2dzLnB1dChyZXEsIHRpbWVvdXQpOwotICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiUmVxdWVzdCByZWNlaXZlZCBmcm9tIGEgY2xpZW50OiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgidGlkPSIpLmFwcGVuZChyZXEuZ2V0VGlkKCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIsIG1zZ1NlcmlhbD0iKS5hcHBlbmQocmVxLmdldFNlcmlhbCgpKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBzYi5hcHBlbmQoIlxuW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1xuIik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvICA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICByZXEud3JpdGUobyk7Ci0gICAgICAgICAgICAgICAgby5jbG9zZSgpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChvLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvL25vcAotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKCJdXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXG4iKTsKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBERUJVRyhzYi50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBDYWxsZWQgYnkgU2VydmVyQ29ubmVjdGlvbnMKLSAgICBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZXNwb25zZUFycml2ZWQoU2VydmVyQ29ubmVjdGlvbiBjb25uLCBJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlJlc3BvbnNlIGFycml2ZWQgZnJvbSBhIHNlcnZlciAoIikuYXBwZW5kKGNvbm4pOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIpOiB0aWQ9IikuYXBwZW5kKHJlc3BvbnNlLmdldFRpZCgpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBtc2dTZXJpYWw9IikuYXBwZW5kKHJlc3BvbnNlLmdldFNlcmlhbCgpKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBzYi5hcHBlbmQoIlxuPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PFxuIik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvICA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS53cml0ZShvKTsKLSAgICAgICAgICAgICAgICBvLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKG8udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vbm9wCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlxuPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuIik7Ci0gICAgICAgICAgICAqLwotICAgICAgICAgICAgREVCVUcoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiByZWNlaXZlZCA9IGZTZXNzaW9uLnJlY2VpdmVSZXNwb25zZShyZXNwb25zZSk7Ci0gICAgICAgIGlmIChyZWNlaXZlZCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgbXNnVG9TdHJpbmcoSUhUVFBNZXNzYWdlIG1zZykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7IAotICAgICAgICBpZiAobXNnID09IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2IuYXBwZW5kKCIoc2VyPSIpLmFwcGVuZChtc2cuZ2V0U2VyaWFsKCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIsdGlkPSIpLmFwcGVuZChtc2cuZ2V0VGlkKCkpLmFwcGVuZCgnKScpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZHVtcE1lc3NhZ2VzKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCgiU2VudD0iKS5hcHBlbmQobXNnVG9TdHJpbmcoZlNlc3Npb24uZ2V0UmVxdWVzdE1lc3NhZ2UoKSkpOwotICAgICAgICBzYi5hcHBlbmQoIiwgTmV4dD0iKS5hcHBlbmQobXNnVG9TdHJpbmcoZk5leHRNc2cpKTsKLSAgICAgICAgc2IuYXBwZW5kKCIsIEFycml2ZWQ9IikuYXBwZW5kKGZBcnJpdmVkTXNncy5nZXRTaXplKCkpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSFRUUFJlcXVlc3RSZWFkZXIgY3JlYXRlSFRUUFJlcXVlc3RSZWFkZXIoSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIVFRQUmVxdWVzdFJlYWRlcihpcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBIVFRQUmVzcG9uc2VSZWFkZXIgY3JlYXRlSFRUUFJlc3BvbnNlUmVhZGVyKElucHV0U3RyZWFtIGlzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSFRUUFJlc3BvbnNlUmVhZGVyKGdldERpc3BhdGNoZXJJZCgpLCBpcyk7Ci0gICAgfQotICAgICAgICAKLSAgICAvLyBDYWxsZWQgb25seSBieSBydW4oKQotICAgIHByb3RlY3RlZCBJSFRUUFJlcXVlc3RNZXNzYWdlIGdldE5leHRSZXF1ZXN0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZOZXh0TXNnICE9IG51bGwpIHsKLSAgICAgICAgICAgIERFQlVHKCJSZXVzZSB0aGUgc2FtZSByZXF1ZXN0Iik7Ci0gICAgICAgICAgICByZXR1cm4gZk5leHRNc2c7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmTmV4dE1zZyA9IChJSFRUUFJlcXVlc3RNZXNzYWdlKSBmQXJyaXZlZE1zZ3MucmVtb3ZlKCk7Ci0gICAgICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBERUJVRygiRmlsbGVkIGEgbWVzc2FnZTogbXNnU2VyaWFsPSIgKyBmTmV4dE1zZy5nZXRTZXJpYWwoKSArICIsIHRpZD0iICsgZk5leHRNc2cuZ2V0VGlkKCkpOwotICAgICAgICAgICAgICAgIERFQlVHKGR1bXBNZXNzYWdlcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmTmV4dE1zZzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyTmV4dFJlcXVlc3QoKSB7Ci0gICAgICAgIGZOZXh0TXNnID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRTZXNzaW9uQW5kU2VuZFJlcXVlc3QoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0LCBTZXJ2ZXJDb25uZWN0aW9uIGNvbm4sIGxvbmcgdGltZW91dCkKLSAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgZlNlc3Npb24uc3RhcnQocmVxdWVzdCk7Ci0gICAgICAgIGNvbm4ucHV0UmVxdWVzdChyZXF1ZXN0LCB0aW1lb3V0KTsKLSAgICB9ICAgICAgICAgICAKLSAgICAKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBydW4oKTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgREVCVUcoIkNsb3NpbmcgYSBSZXF1ZXN0RGlzcGF0Y2hlciIpOwotICAgICAgICB0aGlzLmludGVycnVwdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCJSZXF1ZXN0RGlzcGF0Y2hlci0iKS5hcHBlbmQoZklkKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIERFQlVHKFN0cmluZyBtc2cpIHsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQodGhpcy50b1N0cmluZygpKS5hcHBlbmQoIjogIikuYXBwZW5kKG1zZyk7Ci0gICAgICAgICAgICBMT0dHRVIuZGVidWcoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBXQVJOSU5HKFN0cmluZyBtc2cpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQodGhpcy50b1N0cmluZygpKS5hcHBlbmQoIjogIikuYXBwZW5kKG1zZyk7Ci0gICAgICAgIExPR0dFUi53YXJuaW5nKHNiLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIElORk8oU3RyaW5nIG1zZykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCh0aGlzLnRvU3RyaW5nKCkpLmFwcGVuZCgiOiAiKS5hcHBlbmQobXNnKTsKLSAgICAgICAgTE9HR0VSLmluZm8oc2IudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvU2VydmVyQ29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvU2VydmVyQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmEyNjk5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL1NlcnZlckNvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXF1ZXN0TWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuSUhUVFBSZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLlRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkxvZ2dlcjsKLQotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJDb25uZWN0aW9uIGltcGxlbWVudHMgUnVubmFibGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNlcnZlckNvbm5lY3Rpb24uY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU29ja2V0T3BlbmVyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwcml2YXRlIFNlcnZlckNvbm5lY3Rpb24gZlNvY2tldFJlY2VpdmVyOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGZIb3N0OwotCi0gICAgICAgIHByaXZhdGUgaW50IGZQb3J0OwotCi0gICAgICAgIHByaXZhdGUgaW50IGZTT1RpbWVvdXQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQ7Ci0KLSAgICAgICAgU29ja2V0T3BlbmVyKFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHNvVGltZW91dCwgU2VydmVyQ29ubmVjdGlvbiBzb2NrZXRSZWNlaXZlcikgewotICAgICAgICAgICAgZkhvc3QgPSBob3N0OwotICAgICAgICAgICAgZlBvcnQgPSBwb3J0OwotICAgICAgICAgICAgZlNPVGltZW91dCA9IHNvVGltZW91dDsKLSAgICAgICAgICAgIGZTb2NrZXRSZWNlaXZlciA9IHNvY2tldFJlY2VpdmVyOwotICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgdm9pZCBzZXRWYWxpZChib29sZWFuIHYpIHsKLSAgICAgICAgICAgIGlzVmFsaWQgPSB2OwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgZlNvY2tldFJlY2VpdmVyLkRFQlVHKCJTb2NrZXRPcGVuZXIgc3RhcnRlZCIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTb2NrZXQgc29jayA9IG51bGw7Ci0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmU29ja2V0UmVjZWl2ZXIuREVCVUcoIlRyeWluZyB0byBjcmVhdGUgYSBTb2NrZXQ6ICIgKyBmSG9zdCArICJAIiArIGZQb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzb2NrID0gbmV3IFNvY2tldChmSG9zdCwgZlBvcnQpOwotICAgICAgICAgICAgICAgICAgICAvLyBzb2NrID0gbmV3IFNvY2tldCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBzb2NrLnNldFNvVGltZW91dCgoaW50KSBmU09UaW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc29jay5zZXRUY3BOb0RlbGF5KHRydWUpOwotICAgICAgICAgICAgICAgICAgICAvLyBTb2NrZXRBZGRyZXNzIGRlc3QgPSBuZXcKLSAgICAgICAgICAgICAgICAgICAgLy8gSW5ldFNvY2tldEFkZHJlc3MoZkluZm8uZ2V0SG9zdCgpLCBmSW5mby5nZXRQb3J0KCkpOwotICAgICAgICAgICAgICAgICAgICAvLyBzb2NrLmNvbm5lY3QoZGVzdCwgKGludCkgZlNPVGltZW91dCk7Ci0gICAgICAgICAgICAgICAgICAgIHNvY2suc2V0U29UaW1lb3V0KDEpOwotICAgICAgICAgICAgICAgICAgICBvdXQgPSBzb2NrLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBpbiA9IHNvY2suZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmU29ja2V0UmVjZWl2ZXIuREVCVUcoIkNyZWF0ZWQgYSBTb2NrZXQ6ICIgKyBmSG9zdCArICJAIiArIGZQb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc29jayAhPSBudWxsICYmIG91dCAhPSBudWxsICYmIGluICE9IG51bGwgJiYgaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZlNvY2tldFJlY2VpdmVyLkRFQlVHKCJTZXQgYSBTb2NrZXQgdG8gdGhlIFNlcnZlckNvbm5lY3Rpb246ICIgKyBmSG9zdCArICJAIiArIGZQb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmU29ja2V0UmVjZWl2ZXIubm90aWZ5Q29ubmVjdGVkKHNvY2ssIG91dCwgaW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBmU29ja2V0UmVjZWl2ZXIuREVCVUcoIkZhaWxlZCB0byBjcmVhdGUgYSBTb2NrZXQgKCIgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIik6ICIgKyBmSG9zdCArICJAIiArIGZQb3J0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGlzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICBmU29ja2V0UmVjZWl2ZXIubm90aWZ5Q29ubmVjdEZhaWxlZChlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGF0dXMgewotICAgICAgICBwcml2YXRlIGludCBmU3RhdCA9IFNUQVRfSU5JVDsKLQotICAgICAgICBwcml2YXRlIGludCBmTnVtV2FpdGVycyA9IDA7Ci0KLSAgICAgICAgU3RhdHVzKCkgewotICAgICAgICAgICAgLy8gbm9wCi0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgdm9pZCBzZXQoaW50IHN0YXQpIHsKLSAgICAgICAgICAgIGZTdGF0ID0gc3RhdDsKLSAgICAgICAgICAgIHRoaXMubm90aWZ5QWxsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgaW50IGdldCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmU3RhdDsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCBib29sZWFuIGVxdWFscyhpbnQgc3RhdCkgewotICAgICAgICAgICAgcmV0dXJuIChmU3RhdCA9PSBzdGF0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCBib29sZWFuIHdhaXRGb3IoaW50IHN0YXQsIGxvbmcgdGltZW91dCkKLSAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoZlN0YXQgPT0gc3RhdCkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBpZiAoZlN0YXQgPT0gU1RBVF9DTE9TRUQpIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgZk51bVdhaXRlcnMgKz0gMTsKLSAgICAgICAgICAgIGxvbmcgZGVhZGxpbmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0gICAgICAgICAgICBsb25nIHdhaXQgPSB0aW1lb3V0OwotICAgICAgICAgICAgd2hpbGUgKHdhaXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy53YWl0KHdhaXQpOwotICAgICAgICAgICAgICAgIGlmIChmU3RhdCA9PSBzdGF0KSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoZlN0YXQgPT0gU1RBVF9DTE9TRUQpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB3YWl0ID0gZGVhZGxpbmUgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgc3dpdGNoIChmU3RhdCkgewotICAgICAgICAgICAgY2FzZSBTVEFUX0NMT1NFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIkNMT1NFRCI7Ci0gICAgICAgICAgICBjYXNlIFNUQVRfSU5JVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIklOSVQiOwotICAgICAgICAgICAgY2FzZSBTVEFUX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNUSU5HIjsKLSAgICAgICAgICAgIGNhc2UgU1RBVF9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJDT05ORUNURUQiOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gIlVua293biI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUX0NMT1NFRCA9IC0yOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVF9GSU5BTElaSU5HID0gLTE7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUX0lOSVQgPSAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVF9DT05ORUNUSU5HID0gMTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRfQ09OTkVDVEVEID0gMjsKLQotICAgIHByaXZhdGUgZmluYWwgU2VydmVyS2V5IGZLZXk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaG9zdDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKLSAgICAgICAgcmV0dXJuIGhvc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgcG9ydDsKLQotICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHBvcnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0RGlzcGF0Y2hlciBmRGlzcGF0Y2hlcjsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IGZSZXRyeVRpbWU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCB0aW1lb3V0OwotCi0gICAgcHJpdmF0ZSBsb25nIGZBY3RpdmF0ZWRUaW1lOwotCi0gICAgcHJpdmF0ZSBUaHJlYWQgZlRocmVhZDsKLQotICAgIHByaXZhdGUgU29ja2V0T3BlbmVyIGZTb2NrZXRPcGVuZXIgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBUaHJlYWQgZlNvY2tldE9wZW5lclRocmVhZCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIElIVFRQUmVxdWVzdE1lc3NhZ2UgZlJlcXVlc3Q7Ci0KLSAgICBwcml2YXRlIGxvbmcgZkZpcnN0VGltZW91dCA9IDA7Ci0KLSAgICBwcml2YXRlIFNvY2tldCBmU29ja2V0ID0gbnVsbDsKLQotICAgIHByaXZhdGUgSU9FeGNlcHRpb24gZlNvY2tldEV4Y2VwdGlvbiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbSA9IG51bGw7Ci0KLSAgICBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgcmV0dXJuIGZJbnB1dFN0cmVhbTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGZPdXRwdXRTdHJlYW0gPSBudWxsOwotCi0gICAgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKLSAgICAgICAgcmV0dXJuIGZPdXRwdXRTdHJlYW07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBIVFRQUmVzcG9uc2VSZWFkZXIgZlJlYWRlciA9IG51bGw7Ci0KLSAgICBwcml2YXRlIGxvbmcgZk1lc3NhZ2VTZXJpYWw7Ci0KLSAgICBwcml2YXRlIFN0YXR1cyBmU3RhdCA9IG5ldyBTdGF0dXMoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHByb3RlY3RlZCBTZXJ2ZXJDb25uZWN0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCBncm91cCwgaW50IGluZGV4LCBSZXF1ZXN0RGlzcGF0Y2hlciBkaXNwYXRjaGVyLAotICAgICAgICAgICAgaW50IHJldHJ5VGltZSwgaW50IHRpbWVvdXQpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKLSAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKLSAgICAgICAgZktleSA9IG5ldyBTZXJ2ZXJLZXkoZ3JvdXAsIGluZGV4KTsKLSAgICAgICAgZlJldHJ5VGltZSA9IHJldHJ5VGltZTsKLSAgICAgICAgZkRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyOwotICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotICAgICAgICBmUmVxdWVzdCA9IG51bGw7Ci0gICAgICAgIGZNZXNzYWdlU2VyaWFsID0gMDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgSFRUUFJlc3BvbnNlTWVzc2FnZSBjcmVhdGVIVFRQUmVzcG9uc2VNZXNzYWdlKGxvbmcgbXNnU2VyaWFsKTsKLSAgICAKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIGRlYWN0aXZhdGUoKTsKLSAgICAgICAgc2V0U3RhdChTVEFUX0lOSVQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2ZXJLZXkgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4gZktleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0gICAgICAgIHJldHVybiAoZlRocmVhZCAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvLyBzeW5jaHJvbml6ZWQKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWN0aXZhdGUoKSB7Ci0gICAgICAgIGlmIChpc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICBERUJVRygiYWN0aXZhdGU6IGFscmVhZHkgYWN0aXZlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgREVCVUcoImFjdGl2YXRlIik7Ci0gICAgICAgIHNldFN0YXQoU1RBVF9DT05ORUNUSU5HKTsKLSAgICAgICAgZkFjdGl2YXRlZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgZk1lc3NhZ2VTZXJpYWwgPSAwOwotICAgICAgICBzZXRUaW1lb3V0KGZhbHNlKTsKLSAgICAgICAgZlRocmVhZCA9IG5ldyBUaHJlYWQodGhpcywgIlNlcnZlckNvbm5lY3Rpb24tIiArIG5hbWUpOwotICAgICAgICBmVGhyZWFkLnN0YXJ0KCk7Ci0KLSAgICAgICAgZlNvY2tldCA9IG51bGw7Ci0gICAgICAgIGZTb2NrZXRFeGNlcHRpb24gPSBudWxsOwotICAgICAgICBmT3V0cHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgZlJlYWRlciA9IG51bGw7Ci0KLSAgICAgICAgZlNvY2tldE9wZW5lciA9IG5ldyBTb2NrZXRPcGVuZXIoaG9zdCwgcG9ydCwgKGludCkgdGltZW91dCAqIDIsIHRoaXMpOwotICAgICAgICBmU29ja2V0T3BlbmVyVGhyZWFkID0gbmV3IFRocmVhZChmU29ja2V0T3BlbmVyLCAiU29ja2V0T3BlbmVyLSIgKyB0aGlzLnRvU3RyaW5nKCkpOwotICAgICAgICBmU29ja2V0T3BlbmVyVGhyZWFkLnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGVBbmRDb25uZWN0KGxvbmcgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFjdGl2YXRlKCk7Ci0gICAgICAgIHdhaXRVbnRpbENvbm5lY3RlZCh0aW1lb3V0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3YWl0VW50aWxDb25uZWN0ZWQobG9uZyB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgREVCVUcoIndhaXRVbnRpbENvbm5lY3RlZCIpOwotICAgICAgICBpbnQgc3RhdDsKLSAgICAgICAgc3luY2hyb25pemVkIChmU3RhdCkgewotICAgICAgICAgICAgaWYgKGZTdGF0LmVxdWFscyhTVEFUX0NPTk5FQ1RJTkcpKSB7Ci0gICAgICAgICAgICAgICAgZlN0YXQud2FpdEZvcihTVEFUX0NPTk5FQ1RFRCwgdGltZW91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ID0gZlN0YXQuZ2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXQgPT0gU1RBVF9DT05ORUNURUQpIHsKLSAgICAgICAgICAgIERFQlVHKCJjb25uZWN0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ID09IFNUQVRfQ09OTkVDVElORykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIlNlcnZlckNvbm5lY3Rpb24ud2FpdFVudGlsQ29ubmVjdGVkIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdCA9PSBTVEFUX0lOSVQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGhpcyBjb25uZWN0aW9uIGlzIG5vdCBhY3RpdmF0ZWQgeWV0Iik7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdCA9PSBTVEFUX0NMT1NFRCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUaGlzIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBjbG9zZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlYWN0aXZhdGUgdGhpcyBjb25uZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZWFjdGl2YXRlKCkgewotICAgICAgICBERUJVRygiZGVhY3RpdmF0ZSIpOwotICAgICAgICBpZiAoIWlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIERFQlVHKCJkZWFjdGl2YXRlOiBhbHJlYWR5IGRlYWN0aXZlIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdG9wIHRoZSB0aHJlYWQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChmU29ja2V0ICE9IG51bGwgJiYgIWZTb2NrZXQuaXNPdXRwdXRTaHV0ZG93bigpKSB7Ci0gICAgICAgICAgICAgICAgZlNvY2tldC5zaHV0ZG93bk91dHB1dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgIFdBUk5JTkcoIkZhaWxlZCB0byBzaHV0ZG93biBhIHNvY2tldCAoSU9FeGNlcHRpb24pOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGZUaHJlYWQuaW50ZXJydXB0KCk7Ci0gICAgICAgIGZUaHJlYWQgPSBudWxsOwotCi0gICAgICAgIGZTb2NrZXRPcGVuZXIuc2V0VmFsaWQoZmFsc2UpOwotICAgICAgICBmU29ja2V0T3BlbmVyVGhyZWFkLmludGVycnVwdCgpOwotCi0gICAgICAgIGZTb2NrZXRPcGVuZXIgPSBudWxsOwotICAgICAgICBmU29ja2V0T3BlbmVyVGhyZWFkID0gbnVsbDsKLSAgICAgICAgZlNvY2tldCA9IG51bGw7Ci0gICAgICAgIGZPdXRwdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBmUmVhZGVyID0gbnVsbDsKLQotICAgICAgICBmQWN0aXZhdGVkVGltZSA9IDA7Ci0gICAgICAgIGZNZXNzYWdlU2VyaWFsID0gMDsKLSAgICAgICAgc2V0VGltZW91dChmYWxzZSk7Ci0gICAgICAgIHNldFN0YXQoU1RBVF9DTE9TRUQpOwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCB2b2lkIG5vdGlmeUNvbm5lY3RlZChTb2NrZXQgc29jaywgT3V0cHV0U3RyZWFtIG91dCwgSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgaWYgKHNvY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIERFQlVHKCJzZXRTb2NrZXQiKTsKLSAgICAgICAgZlNvY2tldCA9IHNvY2s7Ci0gICAgICAgIGZTb2NrZXRFeGNlcHRpb24gPSBudWxsOwotICAgICAgICBmT3V0cHV0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBTb2NrZXRUaW1lb3V0UmV0cnlPdXRwdXRTdHJlYW0ob3V0KSk7Ci0gICAgICAgIGZJbnB1dFN0cmVhbSA9IGluOwotICAgICAgICBmUmVhZGVyID0gZkRpc3BhdGNoZXIuY3JlYXRlSFRUUFJlc3BvbnNlUmVhZGVyKGluKTsKLSAgICAgICAgc2V0U3RhdChTVEFUX0NPTk5FQ1RFRCk7Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5Q29ubmVjdEZhaWxlZChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFdBUk5JTkcoInNldFNvY2tldEV4Y2VwdGlvbjogZmFpbGVkIHRvIGNyZWF0ZSBhIHNvY2tldCAoSU9FeGNlcHRpb24pOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICBmU29ja2V0ID0gbnVsbDsKLSAgICAgICAgZlNvY2tldEV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgIGZPdXRwdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBmUmVhZGVyID0gbnVsbDsKLSAgICAgICAgZGVhY3RpdmF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRUaW1lb3V0KGJvb2xlYW4gdGltZW91dCkgewotICAgICAgICBpZiAodGltZW91dCkgewotICAgICAgICAgICAgaWYgKGZGaXJzdFRpbWVvdXQgPT0gMCkgewotICAgICAgICAgICAgICAgIGZGaXJzdFRpbWVvdXQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZGaXJzdFRpbWVvdXQgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1RpbWVvdXQoKSB7Ci0gICAgICAgIHJldHVybiAoZkZpcnN0VGltZW91dCAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNJbnZhbGlkKCkgewotICAgICAgICBpZiAoZkZpcnN0VGltZW91dCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGZGaXJzdFRpbWVvdXQgPCBmUmV0cnlUaW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFN0YXQoKSB7Ci0gICAgICAgIHJldHVybiBmU3RhdC5nZXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0U3RhdChpbnQgc3RhdCkgewotICAgICAgICBmU3RhdC5zZXQoc3RhdCk7Ci0gICAgfQotCi0gICAgLy8gc3luY2hyb25pemVkCi0gICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0U2Vzc2lvbihsb25nIG1zZ1NlcmlhbCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBpZiAoZk1lc3NhZ2VTZXJpYWwgIT0gMCkgewotICAgICAgICAgICAgaWYgKG1zZ1NlcmlhbCA9PSBmTWVzc2FnZVNlcmlhbCkgewotICAgICAgICAgICAgICAgIC8vIEF2b2lkIHNlbmRpbmcgdGhlIHNhbWUgbWVzc2FnZQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgbWVzc2FnZSB3aG9zZSByZXNwb25zZSBpcyBub3QgeWV0IGFycml2ZWQuCi0gICAgICAgICAgICAvLyBXYWl0IHVudGlsIGEgcmVzcG9uc2UgYXJyaXZlcywgb3IgdGltZW91dC4KLSAgICAgICAgICAgIGxvbmcgZGVhZGxpbmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0gICAgICAgICAgICBsb25nIHdhaXQgPSB0aW1lb3V0OwotICAgICAgICAgICAgd2hpbGUgKHdhaXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy53YWl0KHdhaXQpOyAvLyA8LS0KLSAgICAgICAgICAgICAgICBpZiAoZk1lc3NhZ2VTZXJpYWwgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2FpdCA9IGRlYWRsaW5lIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZk1lc3NhZ2VTZXJpYWwgIT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJTZXJ2ZXJDb25uZWN0aW9uLnN0YXJ0U2Vzc2lvbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIChmTWVzc2FnZVNlcmlhbCA9PSAwKSAmJiAoZk1lc3NhZ2VTZXJpYWwgIT0gbXNnU2VyaWFsKQotICAgICAgICBmTWVzc2FnZVNlcmlhbCA9IG1zZ1NlcmlhbDsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBERUJVRygiU2Vzc2lvbiBzdGFydGVkOiBtc2dTZXJpYWw9IiArIGZNZXNzYWdlU2VyaWFsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGZpbmlzaFNlc3Npb24oKSB7Ci0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgREVCVUcoIlNlc3Npb24gZmluaXNoZWQ6IG1zZ1NlcmlhbD0iICsgZk1lc3NhZ2VTZXJpYWwpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydCAoZk1lc3NhZ2VTZXJpYWwgIT0gMCk7Ci0gICAgICAgIGZNZXNzYWdlU2VyaWFsID0gMDsgLy8gLS0+c3RhcnRTZXNzaW9uCi0gICAgICAgIHRoaXMubm90aWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZCBhIG1lc3NhZ2UgYXN5bmNocm9ub3VzbHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcQotICAgICAqIEBwYXJhbSB0aW1lb3V0Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwdXRSZXF1ZXN0KElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxLCBsb25nIHRpbWVvdXQpCi0gICAgICAgIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBERUJVRygicHV0UmVxdWVzdDogbXNnU2VyaWFsPSIgKyByZXEuZ2V0U2VyaWFsKCkgKyAiLCB0aWQ9IiArIHJlcS5nZXRUaWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBzZXNzaW9uU3RhcnRlZCA9IHN0YXJ0U2Vzc2lvbihyZXEuZ2V0U2VyaWFsKCksIHRpbWVvdXQpOwotICAgICAgICBhc3NlcnQgKHJlcS5nZXRTZXJpYWwoKSA9PSBmTWVzc2FnZVNlcmlhbCk7Ci0gICAgICAgIGlmIChzZXNzaW9uU3RhcnRlZCkgewotICAgICAgICAgICAgLy8gZk1lc3NhZ2VTZXJpYWwgIT0gbnVsbAotICAgICAgICAgICAgZlJlcXVlc3QgPSByZXE7IC8vIC0tPm5leHRSZXF1ZXN0Ci0gICAgICAgICAgICB0aGlzLm5vdGlmeUFsbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgSFRUUFJlc3BvbnNlTWVzc2FnZSBnZXRSZXNwb25zZShsb25nIHRpbWVvdXQpIAotICAgICAgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIAotICAgICAgewotICAgICAgd2hpbGUgKGZSZXNwb25zZSA9PSBudWxsKSB7Ci0gICAgICB0aGlzLndhaXQoKTsKLSAgICAgIH0KLSAgICAgIEhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UgPSBmUmVzcG9uc2U7Ci0gICAgICBmUmVzcG9uc2UgPSBudWxsOwotICAgICAgZk1lc3NhZ2VTZXJpYWwgPSAwOyAgLy8tLT5zdGFydFNlc3Npb24gKHB1dFJlcXVlc3QpIAotICAgICAgdGhpcy5ub3RpZnlBbGwoKTsKLSAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICAgIH0KLSAgICAqLwotICAgICAgICAKLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBJSFRUUFJlcXVlc3RNZXNzYWdlIG5leHRSZXF1ZXN0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKGZSZXF1ZXN0ID09IG51bGwgfHwgZk1lc3NhZ2VTZXJpYWwgPT0gMCkgewotICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgREVCVUcoIm5leHRSZXF1ZXN0IHdhaXRpbmc6IHJlcXVlc3Q9IiArIGZSZXF1ZXN0ICsgIiwgbXNnU2VyaWFsPSIgKyBmTWVzc2FnZVNlcmlhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLndhaXQoKTsKLSAgICAgICAgfQotICAgICAgICAvLyAoZlJlcXVlc3QgIT0gbnVsbCkgJiYgKGZNZXNzYWdlU2VyaWFsICE9IDApCi0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgREVCVUcoIm5leHRSZXF1ZXN0IHdhaXRpbmcgZG9uZTogcmVxdWVzdD0iICsgZlJlcXVlc3QgKyAiLCBtc2dTZXJpYWw9IiArIGZNZXNzYWdlU2VyaWFsKTsKLSAgICAgICAgfQotICAgICAgICBJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcSA9IGZSZXF1ZXN0OwotICAgICAgICBmUmVxdWVzdCA9IG51bGw7Ci0gICAgICAgIHJldHVybiByZXE7Ci0gICAgfQotCi0gICAgLy8gcnVuKCkKLSAgICBwcml2YXRlIElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlY2VpdmVSZXNwb25zZShsb25nIHRpbWVvdXQsIGJvb2xlYW4gaXNCb2R5RW1wdHkpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgICAgSFRUUFJlc3BvbnNlUmVhZGVyIHJlYWRlcjsKLSAgICAgICAgbG9uZyBtc2dTZXJpYWw7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgYXNzZXJ0IChmU3RhdC5lcXVhbHMoU1RBVF9DT05ORUNURUQpKSAmJiAoZlJlYWRlciAhPSBudWxsKSAmJiAoZk1lc3NhZ2VTZXJpYWwgIT0gMCk7Ci0gICAgICAgICAgICBpZiAoZlJlYWRlciA9PSBudWxsIHx8IGZNZXNzYWdlU2VyaWFsID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkRlYWN0aXZhdGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWFkZXIgPSBmUmVhZGVyOwotICAgICAgICAgICAgbXNnU2VyaWFsID0gZk1lc3NhZ2VTZXJpYWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiAoZk1lc3NhZ2VTZXJpYWwgPT0gMCkgewotICAgICAgICAvLyBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIC8vIGxvbmcgZGVhZGxpbmUgPSBzdGFydCArIHRpbWVvdXQ7Ci0gICAgICAgIC8vIGxvbmcgd2FpdCA9IHRpbWVvdXQ7Ci0gICAgICAgIC8vIHdoaWxlICh3YWl0ID4gMCkgewotICAgICAgICAvLyB0aGlzLndhaXQod2FpdCk7Ci0gICAgICAgIC8vIGlmIChmTWVzc2FnZVNlcmlhbCAhPSAwKSB7Ci0gICAgICAgIC8vIGJyZWFrOwotICAgICAgICAvLyB9Ci0gICAgICAgIC8vIHdhaXQgPSBkZWFkbGluZSAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAvLyB9Ci0gICAgICAgIC8vIHRpbWVvdXQgLT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydDsKLSAgICAgICAgLy8gfQotICAgICAgICAvLyBpZiAoZk1lc3NhZ2VTZXJpYWwgPT0gMCB8fCB0aW1lb3V0IDw9IDApIHsKLSAgICAgICAgLy8gdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIlNlcnZlckNvbm5lY3Rpb24ucmVjZWl2ZVJlc3BvbnNlIik7Ci0gICAgICAgIC8vIH0KLSAgICAgICAgLy8gKGZNZXNzYWdlU2VyaWFsICE9IDApICYmICh0aW1lb3V0ID4gMCkKLQotICAgICAgICBIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlID0gY3JlYXRlSFRUUFJlc3BvbnNlTWVzc2FnZShtc2dTZXJpYWwpOwotICAgICAgICBERUJVRygiVHJ5IHRvIHJlYWQgcmVzcG9uc2UuLi4iKTsKLSAgICAgICAgcmVhZGVyLnJlYWRNZXNzYWdlKHJlc3BvbnNlLCB0aW1lb3V0LCBpc0JvZHlFbXB0eSk7Ci0gICAgICAgIAotICAgICAgICAvLyAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJSZWNlaXZlZCBhIHJlc3BvbnNlOiBtc2dTZXJpYWw9IiArIHJlc3BvbnNlLmdldFNlcmlhbCgpKTsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIyMjUmVzcG9uc2UgZnJvbSBzZXJ2ZXIgZ3JvdXAgIiArIGZHcm91cC5nZXRJbmRleCgpKTsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcmVzcG9uc2Uud3JpdGUoU3lzdGVtLm91dCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIik7Ci0gICAgICAgIC8vICAgICAgICAgICAgICB9Ci0gICAgICAgIC8vICAgICAgICAgICAgICBmSW5mby5kZWNyZW1lbnRQcm9jZXNzaW5nUmVxdWVzdCgpOwotICAgICAgICAvLyAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmdldEZGRlJlc3VsdENvZGUoKSA9PSBGRkZTZXJ2bGV0SGVhZGVyLlJDX1NVQ0NFU1MpIHsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgZkluZm8udXBkYXRlTGFzdEFjdGl2aXR5VGltZSgpOwotICAgICAgICAvLyAgICAgICAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotICAgICAgICAKLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNlbmRSZXF1ZXN0KElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZW91dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgREVCVUcoInNlbmRSZXF1ZXN0Li4uLiIpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdDAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2FpdFVudGlsQ29ubmVjdGVkKHRpbWVvdXQpOwotICAgICAgICBhc3NlcnQgKGZPdXRwdXRTdHJlYW0gIT0gbnVsbCk7Ci0gICAgICAgIGxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgdGltZW91dCAtPSB0MSAtIHQwOwotICAgICAgICBpZiAodGltZW91dCA8PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigpOyAKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgREVCVUcoIlNlbnQgYSByZXF1ZXN0OiBtc2dTZXJpYWw9IiArIHJlcXVlc3QuZ2V0U2VyaWFsKCkgKyAiLCB0aWQ9IiArIHJlcXVlc3QuZ2V0VGlkKCkpOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9iID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgQmlmdXJjYXRlZE91dHB1dFN0cmVhbSBvID0gbmV3IEJpZnVyY2F0ZWRPdXRwdXRTdHJlYW0oZk91dHB1dFN0cmVhbSwgb2IpOwotICAgICAgICAgICAgcmVxdWVzdC53cml0ZSh0aW1lb3V0LCBvKTsKLSAgICAgICAgICAgIG9iLmNsb3NlKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlxuPT09PT09PT09PT09PT09Pj09PT0+PT09PT49PT09Pj09PT09PT09PT09PT0+XG4iKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChvYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiPT09PT09PT09PT09PT09PD09PT08PT09PTw9PT09PD09PT09PT09PT09PT08XG4iKTsKLSAgICAgICAgICAgIERFQlVHKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVxdWVzdC53cml0ZSh0aW1lb3V0LCBmT3V0cHV0U3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICBmT3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0KLSAgICAgICAgZk1lc3NhZ2VTZXJpYWwgPSByZXF1ZXN0LmdldFNlcmlhbCgpOwotCi0gICAgICAgIC8vIGZJbmZvLmluY3JlbWVudFByb2Nlc3NpbmdSZXF1ZXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjaWV2ZXIgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuIEtlZXAgdHJ5aW5nIHRvIHJlYWQgYSByZXNwb25zZSBhbmQKLSAgICAgKiBwYXNzIGl0IHRvIHRoZSBkaXNwYXRjaGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgREVCVUcoInJlY2VpdmVyIHRocmVhZCBzdGFydGVkIik7Ci0gICAgICAgIC8vIGxvbmcgbGFzdEFjdGl2aXR5VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm9vbGVhbiBzZXJ2ZXJFcnJvciA9IGZhbHNlOwotICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAwOwotICAgICAgICAgICAgd2hpbGUgKCFUaHJlYWQuaW50ZXJydXB0ZWQoKSAmJiAhc2VydmVyRXJyb3IpIHsKLSAgICAgICAgICAgICAgICBjb3VudGVyICs9IDE7Ci0gICAgICAgICAgICAgICAgSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0ID0gbmV4dFJlcXVlc3QoKTsKLQotICAgICAgICAgICAgICAgIC8vIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5pc0Nvbm5lY3Rpb25TaHV0ZG93blJlcXVpcmVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0Q29ubmVjdGlvbkhlYWRlcihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVxdWVzdChyZXF1ZXN0LCB0aW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZTb2NrZXQuc2h1dGRvd25PdXRwdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXQoU1RBVF9GSU5BTElaSU5HKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0Q29ubmVjdGlvbkhlYWRlcih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXF1ZXN0KHJlcXVlc3QsIHRpbWVvdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZJbmZvLm5vdGlmeVN1Y2Nlc3NmdWxTZW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxhc3RBY3Rpdml0eVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIHRpbWVvdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgREVCVUcoInNlbmRSZXF1ZXN0KCkgdGltZW91dCIpOwotICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgKGZTdGF0LmVxdWFscyhTVEFUX0NPTk5FQ1RFRCkgfHwgZlN0YXQuZXF1YWxzKFNUQVRfRklOQUxJWklORykpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVjaWV2ZSBhIHJlc3Bvc25lIGZyb20gdGhlIHNlcnZlcgotICAgICAgICAgICAgICAgIGludCBsb29wID0gMDsKLSAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCFUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSAmJiAhc2VydmVyRXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJSZWNlaXZlUmVzcG9uc2UuLi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlID0gcmVjZWl2ZVJlc3BvbnNlKHRpbWVvdXQsIHJlcXVlc3QuaXNSZXNwb25zZUJvZHlFbXB0eSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIGNsaWVudAotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoIlJlc3BvbnNlQXJyaXZlZC4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmlzQ29ubmVjdGlvblRvQmVDbG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHKCJTaW5jZSB0aGUgcmVzcG9uc2UgaXMgbm90IGtlZXAtYWxpdmUsIHdlIGRvIG5vdCByZXVzZSB0aGlzIGNvbm5lY3Rpb24uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdChTVEFUX0ZJTkFMSVpJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZkRpc3BhdGNoZXIucmVzcG9uc2VBcnJpdmVkKHRoaXMsIHJlc3BvbnNlKTsgLy8gSW50ZXJydXB0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaFNlc3Npb24oKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gdGltZW91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXRUaW1lb3V0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcoInJlc3BvbnNlIHJlY2VpdmluZyB0aW1lb3V0ICgiICsgdGltZW91dC5nZXRNZXNzYWdlKCkgKyAiKTogcmV0cnk9IiArIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZWxhcHNlZD0iICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb29wICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgZGVsYXkgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OwotICAgICAgICAgICAgICAgICAgICBpZiAoZGVsYXkgPiA2MCAqIDEwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU2h1dGRvd24gdGhpcyBjb25uZWN0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEhUVFBDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgCURFQlVHKCJUaGUgY29ubmVjdGlvbiBpcyBjbG9zZWQgYnkgdGhlIHBlZXIuIik7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIERFQlVHKCJJT0V4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIEhUVFBNYWxmb3JtZWRSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UgPSBuZXcgSFRUUE1hbGZvcm1lZFJlc3BvbnNlTWVzc2FnZShmTWVzc2FnZVNlcmlhbCwgZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZEaXNwYXRjaGVyLnJlc3BvbnNlQXJyaXZlZCh0aGlzLCByZXNwb25zZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpbnRlcnJ1cHRlZCkgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluaXNoU2Vzc2lvbigpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBERUJVRygicmVhZGVyIHRocmVhZCBpbnRlcnJ1cHRlZCIpOwotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBERUJVRygicmVjZWl2ZXIgdGhyZWFkIHN0b3BwZWQiKTsKLSAgICAgICAgICAgIGRlYWN0aXZhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKGhvc3QpLmFwcGVuZCgnOicpLmFwcGVuZChwb3J0KS5hcHBlbmQoJy4nKS5hcHBlbmQoZktleS50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIERFQlVHKFN0cmluZyBtc2cpIHsKLSAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmFtZSkuYXBwZW5kKCIgWyIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHRoaXMudG9TdHJpbmcoKSkuYXBwZW5kKCJdICIpLmFwcGVuZChtc2cpOwotICAgICAgICAgICAgTE9HR0VSLmRlYnVnKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIFdBUk5JTkcoU3RyaW5nIG1zZykgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZChuYW1lKS5hcHBlbmQoIiBbIik7Ci0gICAgICAgIHNiLmFwcGVuZCh0aGlzLnRvU3RyaW5nKCkpLmFwcGVuZCgiXSAiKS5hcHBlbmQobXNnKTsKLSAgICAgICAgTE9HR0VSLndhcm5pbmcoc2IudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZHVtcCgpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQodGhpcy50b1N0cmluZygpKS5hcHBlbmQoIjogc3RhdD0iKS5hcHBlbmQoZlN0YXQpOwotICAgICAgICBzYi5hcHBlbmQoIiwgdGhyZWFkPSIpOwotICAgICAgICBzYi5hcHBlbmQoKGZUaHJlYWQgPT0gbnVsbCkgPyAibnVsbCIgOiBCb29sZWFuLnRvU3RyaW5nKGZUaHJlYWQuaXNBbGl2ZSgpKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCBzb2NrZXRPcGVuZXI9Iik7Ci0gICAgICAgIHNiLmFwcGVuZCgoZlNvY2tldE9wZW5lciA9PSBudWxsKSA/ICJudWxsIiA6ICJleGlzdHMiKTsKLSAgICAgICAgc2IuYXBwZW5kKCIsIHNvY2tldE9wZW5lclRocmVhZD0iKTsKLSAgICAgICAgc2IuYXBwZW5kKChmU29ja2V0T3BlbmVyVGhyZWFkID09IG51bGwpID8gIm51bGwiIDogQm9vbGVhbi50b1N0cmluZyhmU29ja2V0T3BlbmVyVGhyZWFkLmlzQWxpdmUoKSkpOwotICAgICAgICBzYi5hcHBlbmQoIiwgc29ja2V0PSIpOwotICAgICAgICBzYi5hcHBlbmQoKGZTb2NrZXQgPT0gbnVsbCkgPyAibnVsbCIgOiBCb29sZWFuLnRvU3RyaW5nKGZTb2NrZXQuaXNDb25uZWN0ZWQoKSkpOwotICAgICAgICBzYi5hcHBlbmQoIiwgaW52YWxpZD0iKS5hcHBlbmQoaXNJbnZhbGlkKCkpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9TZXJ2ZXJLZXkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL1NlcnZlcktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2MyNzY5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL1NlcnZlcktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaWRla2kgVEFJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyS2V5IHsKLQlwcml2YXRlIGludCBmR3JvdXBJZDsKLQlwcml2YXRlIGludCBmU2VydmVySW5kZXg7Ci0JCi0JcHVibGljIFNlcnZlcktleShpbnQgZ3JvdXAsIGludCBzZXJ2ZXIpIHsKLQkJZkdyb3VwSWQgPSBncm91cDsKLQkJZlNlcnZlckluZGV4ID0gc2VydmVyOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEdyb3VwSWQoKSB7Ci0JCXJldHVybiBmR3JvdXBJZDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRTZXJ2ZXJJbmRleCgpIHsKLQkJcmV0dXJuIGZTZXJ2ZXJJbmRleDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBTZXJ2ZXJLZXkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU2VydmVyS2V5IGtleSA9IChTZXJ2ZXJLZXkpIG87Ci0JCXJldHVybiAoZkdyb3VwSWQgPT0ga2V5LmZHcm91cElkKSB8fCAoZlNlcnZlckluZGV4ID09IGtleS5mU2VydmVySW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAoZkdyb3VwSWQgPDwgMTYpIHwgZlNlcnZlckluZGV4IHwgKGZHcm91cElkID4+PiAxNik7IAotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoZkdyb3VwSWQpKS5hcHBlbmQoJy4nKS5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhmU2VydmVySW5kZXgpKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvU2Vzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvU2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmMyZDRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL1Nlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpZGVraSBUQUkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklDbGllbnRDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuVGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuTG9nZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBTZXNzaW9uIHsKLSAgICBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoU2Vzc2lvbi5jbGFzcyk7Ci0gICAgCi0gICAgcHJpdmF0ZSBJSFRUUFJlcXVlc3RNZXNzYWdlIGZSZXF1ZXN0TXNnID0gbnVsbDsKLSAgICBwcml2YXRlIElIVFRQUmVzcG9uc2VNZXNzYWdlIGZSZXNwb25zZU1zZyA9IG51bGw7Ci0KLSAgICBzeW5jaHJvbml6ZWQgcHVibGljIElIVFRQUmVxdWVzdE1lc3NhZ2UgZ2V0UmVxdWVzdE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBmUmVxdWVzdE1zZzsKLSAgICB9Ci0gICAgICAgIAotICAgIHN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBzdGFydChJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJlcSA9PSBmUmVxdWVzdE1zZykgewotICAgICAgICAgICAgLy8gUmVzdGFydAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HR0VSLmRlYnVnKCJBIHNlc3Npb24gc3RhcnRlZDogc3RhdD0iICsgZlJlcXVlc3RNc2cgKyAiLCByZXE9IiArIHJlcSk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGZSZXF1ZXN0TXNnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMud2FpdCgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGZSZXF1ZXN0TXNnID09IG51bGwKLSAgICAgICAgZlJlcXVlc3RNc2cgPSByZXE7Ci0gICAgICAgIHRoaXMubm90aWZ5QWxsKCk7IC8vIC0tPiByZWNlaXZlUmVzcG9uc2UoKQotICAgIH0KLSAgICAgICAgCi0gICAgc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIHN0YXJ0KElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZXEgPT0gZlJlcXVlc3RNc2cpIHsKLSAgICAgICAgICAgIC8vIFJlc3RhcnQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPR0dFUi5kZWJ1ZygiQSBzZXNzaW9uIHN0YXJ0ZWQ6IHN0YXQ9IiArIGZSZXF1ZXN0TXNnICsgIiwgcmVxPSIgKyByZXEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmUmVxdWVzdE1zZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb25nIGRlYWRMaW5lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotICAgICAgICAgICAgbG9uZyB3YWl0ID0gdGltZW91dDsKLSAgICAgICAgICAgIHdoaWxlICh3YWl0ID4gMCkgewotICAgICAgICAgICAgICAgIHRoaXMud2FpdCh3YWl0KTsgICAgLy8gPC0tZ2V0QW5kU2VuZFJlc3BvbnNlKCkKLSAgICAgICAgICAgICAgICBpZiAoZlJlc3BvbnNlTXNnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdhaXQgPSBkZWFkTGluZSAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZSZXF1ZXN0TXNnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigiU2Vzc2lvbi5zdGFydCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGZSZXF1ZXN0TXNnID09IG51bGwKLSAgICAgICAgZlJlcXVlc3RNc2cgPSByZXE7Ci0gICAgICAgIHRoaXMubm90aWZ5QWxsKCk7IC8vIC0tPiByZWNlaXZlUmVzcG9uc2UoKQotICAgIH0KLSAgICAgICAgCi0gICAgc3luY2hyb25pemVkIHB1YmxpYyBib29sZWFuIHJlY2VpdmVSZXNwb25zZShJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZSZXF1ZXN0TXNnICE9IG51bGwgJiYgZlJlcXVlc3RNc2cuZ2V0U2VyaWFsKCkgIT0gcmVzcG9uc2UuZ2V0U2VyaWFsKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoZlJlc3BvbnNlTXNnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMud2FpdCgpOwotICAgICAgICB9Ci0gICAgICAgIGZSZXNwb25zZU1zZyA9IHJlc3BvbnNlOwotICAgICAgICB0aGlzLm5vdGlmeUFsbCgpOyAvLyAtLT4gZ2V0QW5kU2VuZFJlc3BvbnNlKCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIHByb3RlY3RlZCBJSFRUUFJlc3BvbnNlTWVzc2FnZSB3YWl0UmVzcG9uc2UobG9uZyB0aW1lb3V0KQotICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBpZiAoZlJlc3BvbnNlTXNnID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvbmcgZGVhZExpbmUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0gICAgICAgICAgICBsb25nIHdhaXQgPSB0aW1lb3V0OwotICAgICAgICAgICAgd2hpbGUgKHdhaXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy53YWl0KHdhaXQpOwotICAgICAgICAgICAgICAgIGlmIChmUmVzcG9uc2VNc2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2FpdCA9IGRlYWRMaW5lIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZlJlc3BvbnNlTXNnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigiUmVzcG9uc2VTeW5jLmdldCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGZSZXNwb25zZU1zZyAhPSBudWxsCi0gICAgICAgIElIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlID0gZlJlc3BvbnNlTXNnOwotICAgICAgICBmUmVzcG9uc2VNc2cgPSBudWxsOwotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIHByb3RlY3RlZCB2b2lkIG5vdGlmeUNvbXBsZXRpb24oKSB7Ci0gICAgICAgIGZSZXF1ZXN0TXNnID0gbnVsbDsKLSAgICAgICAgdGhpcy5ub3RpZnlBbGwoKTsgLy8tLT5zdGFydCgpCi0gICAgfQotCi0gICAgc3luY2hyb25pemVkIHB1YmxpYyBJSFRUUFJlc3BvbnNlTWVzc2FnZSBnZXRBbmRTZW5kUmVzcG9uc2UoSUNsaWVudENvbm5lY3Rpb24gY2xpZW50LCBsb25nIHRpbWVvdXQpCi0gICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPR0dFUi5kZWJ1ZygiZ2V0QW5kU2VuZFJlc3BvbnNlOiBlbnRyZXJlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgdDAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgSUhUVFBSZXNwb25zZU1lc3NhZ2UgcmVzcG9uc2UgPSB3YWl0UmVzcG9uc2UodGltZW91dCk7Ci0gICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIEhUVFBNYWxmb3JtZWRSZXNwb25zZU1lc3NhZ2UpIHsKLSAgICAgICAgICAgIHRocm93ICgoSFRUUE1hbGZvcm1lZFJlc3BvbnNlTWVzc2FnZSkgcmVzcG9uc2UpLmdldElPRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB0aW1lb3V0IC09IHQxIC0gdDA7Ci0gICAgICAgIGlmICh0aW1lb3V0IDw9IDApIHsKLSAgICAgICAgICAgIHRpbWVvdXQgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HR0VSLmRlYnVnKCJnZXRBbmRTZW5kUmVzcG9uc2U6IGdvdCBhIHJlc3BvbnNlIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsaWVudC5zZW5kUmVzcG9uc2UodGltZW91dCwgcmVzcG9uc2UpOwotICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HR0VSLmRlYnVnKCJnZXRBbmRTZW5kUmVzcG9uc2U6IHNlbnQgYSByZXNwb25zZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeUNvbXBsZXRpb24oKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIHB1YmxpYyBJSFRUUFJlc3BvbnNlTWVzc2FnZSBnZXRSZXNwb25zZShsb25nIHRpbWVvdXQpCi0gICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSA9IHdhaXRSZXNwb25zZSh0aW1lb3V0KTsKLSAgICAgICAgbm90aWZ5Q29tcGxldGlvbigpOwotICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBIVFRQTWFsZm9ybWVkUmVzcG9uc2VNZXNzYWdlKSB7Ci0gICAgICAgICAgICB0aHJvdyAoKEhUVFBNYWxmb3JtZWRSZXNwb25zZU1lc3NhZ2UpIHJlc3BvbnNlKS5nZXRJT0V4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9Tb2NrZXRUaW1lb3V0UmV0cnlJbnB1dFN0cmVhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvU29ja2V0VGltZW91dFJldHJ5SW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhMjcxOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvY29yZS9Tb2NrZXRUaW1lb3V0UmV0cnlJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgU29ja2V0VGltZW91dFJldHJ5SW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZChJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzLnJlYWQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZChJbnB1dFN0cmVhbSBpcywgYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzLnJlYWQoYnVmLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IHJlYWQoSW5wdXRTdHJlYW0gaXMsIGJ5dGVbXSBidWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBpcy5yZWFkKGJ1Zik7Ci0gICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW4uYXZhaWxhYmxlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7Ci0gICAgICAgIGluLm1hcmsocmVhZGxpbWl0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gaW4ubWFya1N1cHBvcnRlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkKGluKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWQoaW4sIGJ1Zik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmZzZXQsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkKGluLCBidWYsIG9mZnNldCwgbGVuKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGluLnJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW4uc2tpcChuKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgU29ja2V0VGltZW91dFJldHJ5SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgICAgc3VwZXIoaXMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9jb3JlL1NvY2tldFRpbWVvdXRSZXRyeU91dHB1dFN0cmVhbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvU29ja2V0VGltZW91dFJldHJ5T3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNTVhMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L2NvcmUvU29ja2V0VGltZW91dFJldHJ5T3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgU29ja2V0VGltZW91dFJldHJ5T3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG9zLCBieXRlW10gYnVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvcy53cml0ZShidWYpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBjYXRjaChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3MsIGJ5dGVbXSBidWYsIGludCBvZmZzZXQsIGludCBsZW4pCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG9zLndyaXRlKGJ1Ziwgb2Zmc2V0LCBsZW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBjYXRjaChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3MsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvcy53cml0ZShiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gY2F0Y2goU29ja2V0VGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBjYXRjaChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGNhdGNoKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGUob3V0cHV0U3RyZWFtLCBidWYpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3cml0ZShvdXRwdXRTdHJlYW0sIGJ1Ziwgb2Zmc2V0LCBsZW4pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3cml0ZShvdXRwdXRTdHJlYW0sIGIpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbTsKLSAKLSAgICBTb2NrZXRUaW1lb3V0UmV0cnlPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgewotICAgICAgICB0aGlzLm91dHB1dFN0cmVhbSA9IG91dHB1dFN0cmVhbTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvcHJveHkvQ2xpZW50U3RhdGVNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvcHJveHkvQ2xpZW50U3RhdGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0M2ZkYjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L3Byb3h5L0NsaWVudFN0YXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LnByb3h5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklDbGllbnRTdGF0ZU1hbmFnZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50U3RhdGVNYW5hZ2VyIGltcGxlbWVudHMgSUNsaWVudFN0YXRlTWFuYWdlciB7Ci0gICAgcHJpdmF0ZSBPYmplY3Qga2V5OwotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgY2xpZW50U3RhdGVNYW5hZ2VycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIEhhc2hNYXAgc3RhdGVNYXA7Ci0KLSAgICAvLyBXZSBzaG91bGQgdXNlIHJlYWQtd3JpdGUgbG9jayBpbnN0ZWFkIG9mIG11dGV4LgotICAgIC8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUNsaWVudFN0YXRlTWFuYWdlciNwdXQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHV0KE9iamVjdCBzdGF0ZUtleSwgT2JqZWN0IHN0YXRlVmFsdWUpIHsKLSAgICAgICAgc3RhdGVNYXAucHV0KHN0YXRlS2V5LCBzdGF0ZVZhbHVlKTsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JQ2xpZW50U3RhdGVNYW5hZ2VyI2dldChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldChPYmplY3Qgc3RhdGVLZXkpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRlTWFwLmdldChzdGF0ZUtleSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGllbnRTdGF0ZU1hbmFnZXIoT2JqZWN0IGtleSkgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgdGhpcy5zdGF0ZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSUNsaWVudFN0YXRlTWFuYWdlciBnZXRDbGllbnRTdGF0ZU1hbmFnZXIoT2JqZWN0IGtleSkgewotICAgICAgICBJQ2xpZW50U3RhdGVNYW5hZ2VyIGNzbSA9IChJQ2xpZW50U3RhdGVNYW5hZ2VyKSBjbGllbnRTdGF0ZU1hbmFnZXJzLmdldChrZXkpOwotICAgICAgICBpZiAoY3NtID09IG51bGwpIHsKLSAgICAgICAgICAgIGNzbSA9IG5ldyBDbGllbnRTdGF0ZU1hbmFnZXIoa2V5KTsKLSAgICAgICAgICAgIGNsaWVudFN0YXRlTWFuYWdlcnMucHV0KGtleSwgY3NtKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3NtOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L3Byb3h5L0hUVFBQcm94eUNvbm5lY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9wcm94eS9IVFRQUHJveHlDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NzFlYTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L3Byb3h5L0hUVFBQcm94eUNvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIEtlbnRhcm91IEZVS1VEQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkucHJveHk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuRXh0ZXJuYWxQcm94eUNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklDbGllbnRTdGF0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5Q29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQUHJveHlUcmFuc2NvZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklTZWNyZXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuSFRUUFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZS5DbGllbnRDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZS5TZXJ2ZXJDb25uZWN0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBIVFRQUHJveHlDb25uZWN0aW9uIGV4dGVuZHMgQ2xpZW50Q29ubmVjdGlvbiBpbXBsZW1lbnRzIElIVFRQUHJveHlDb25uZWN0aW9uIHsKLSAgICBwcml2YXRlIGZpbmFsIEhUVFBQcm94eSBmUHJveHk7Ci0KLSAgICBIVFRQUHJveHkgZ2V0UHJveHkoKSB7Ci0gICAgICAgIHJldHVybiBmUHJveHk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5Q29ubmVjdGlvbiNnZXRTZWNyZXRNYW5hZ2VyKCkKLQkgKi8KLSAgICBwdWJsaWMgSVNlY3JldE1hbmFnZXIgZ2V0U2VjcmV0TWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIGZQcm94eS5nZXRTZWNyZXRNYW5hZ2VyKCk7Ci0gICAgfQotICAgIAotICAgIEV4dGVybmFsUHJveHlDb25maWcgZ2V0RXh0ZXJuYWxQcm94eUNvbmZpZygpewotICAgIAlyZXR1cm4gZlByb3h5LmdldEV4dGVybmFsUHJveHlDb25maWcoKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5Q29ubmVjdGlvbiNnZXRMaXN0ZW5Qb3J0KCkKLQkgKi8KLSAgICBwdWJsaWMgaW50IGdldExpc3RlblBvcnQoKXsKLSAgICAJcmV0dXJuIGZQcm94eS5nZXRMaXN0ZW5Qb3J0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgdGltZW91dDsKLQotICAgIHZvaWQgbm90aWZ5U3VjY2Vzc2Z1bFNlcnZlckNvbm5lY3Rpb24oU2VydmVyQ29ubmVjdGlvbiBjb25uKSB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5Q29ubmVjdGlvbiNpbml0KG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuQ2xpZW50U3RhdGVNYW5hZ2VyLCBqYXZhLm5ldC5Tb2NrZXQsIGxvbmcsIGludCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElDbGllbnRTdGF0ZU1hbmFnZXIgY2xpZW50U3RhdGVNYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgU29ja2V0IGNsaWVudFNvY2ssCi0gICAgICAgICAgICAgICAgICAgICBsb25nIGtlZXBBbGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBpbml0U2VydmVyR3JvdXBJZHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHNldENvbm5lY3Rpb25OYW1lKCJIVFRQUHJveHlDb25uZWN0aW9uLSIgKyBjbGllbnRTb2NrLmdldFBvcnQoKSk7Ci0gICAgICAgIHNldENvbm5lY3Rpb25OYW1lKCJbaWQ6IiArIGNsaWVudFNvY2suZ2V0UG9ydCgpICsgIl0gSFRUUFByb3h5Q29ubmVjdGlvbiIpOwotICAgICAgICBIVFRQUmVxdWVzdERpc3BhdGNoZXIgZGlzcGF0Y2hlciA9IG5ldyBIVFRQUmVxdWVzdERpc3BhdGNoZXIodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFN0YXRlTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRRdWV1ZVNpemUoKSwgdGltZW91dCk7Ci0gICAgICAgIElIVFRQUHJveHlUcmFuc2NvZGVyRmFjdG9yeSBmYWN0b3J5ID0gZlByb3h5LmdldFByb3h5VHJhbnNjb2RlckZhY3RvcnkoKTsKLSAgICAgICAgaWYoZmFjdG9yeSE9bnVsbCl7Ci0gICAgICAgIAlkaXNwYXRjaGVyLnNldFRyYW5zY29kZXIoZmFjdG9yeS5uZXdJbnN0YW5jZShkaXNwYXRjaGVyLmdldERpc3BhdGNoZXJJZCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5pdEludGVybmFsKGNsaWVudFNvY2ssIGtlZXBBbGl2ZSwgdGltZW91dCwgZGlzcGF0Y2hlcik7Ci0gICAgfQotCi0gICAgcHVibGljIEhUVFBQcm94eUNvbm5lY3Rpb24oSFRUUFByb3h5IGZQcm94eSwgaW50IHF1ZXVlU2l6ZSwgaW50IHRpbWVvdXQpIHsKLSAgICAgICAgc3VwZXIoZlByb3h5LCBxdWV1ZVNpemUpOwotICAgICAgICB0aGlzLmZQcm94eSA9IGZQcm94eTsKLSAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9wcm94eS9IVFRQUmVxdWVzdERpc3BhdGNoZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9wcm94eS9IVFRQUmVxdWVzdERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwZDIxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC9odHRwcHJveHkvcHJveHkvSFRUUFJlcXVlc3REaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgS2VudGFyb3UgRlVLVURBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5wcm94eTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LkV4dGVybmFsUHJveHlDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5jb3JlLklIVFRQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlcXVlc3RNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkuY29yZS5JSFRUUFJlc3BvbnNlTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LmNvcmUuVGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklDbGllbnRTdGF0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUExvY2FsU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5odHRwcHJveHkucHJveHkuSUhUVFBMb2NhbFNlcnZlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS5wcm94eS5JSFRUUFByb3h5VHJhbnNjb2RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQU2Vzc2lvbk92ZXJyaWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnByb3h5LklIVFRQU2Vzc2lvbk92ZXJyaWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS51dGlsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5LnV0aWwuUGFyc2VVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlLkhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LmNvcmUuSGVhZGVyVG9BZGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlLlJlcXVlc3REaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZS5TZXJ2ZXJDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC5odHRwcHJveHkuY29yZS5TZXNzaW9uOwotCi1wdWJsaWMgY2xhc3MgSFRUUFJlcXVlc3REaXNwYXRjaGVyIGV4dGVuZHMgUmVxdWVzdERpc3BhdGNoZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIKLQkJCS5nZXRMb2dnZXIoSFRUUFJlcXVlc3REaXNwYXRjaGVyLmNsYXNzKTsKLQotCXByaXZhdGUgZmluYWwgSUNsaWVudFN0YXRlTWFuYWdlciBjbGllbnRTdGF0ZU1hbmFnZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEhUVFBQcm94eUNvbm5lY3Rpb24gZkNsaWVudDsKLQkKLQlwcml2YXRlIGZpbmFsIEV4dGVybmFsUHJveHlDb25maWcgZkV4UHJveHlDb25mOwotCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdGltZW91dDsKLQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBIVFRQX1dFTExfS05PV05fUE9SVCA9IDgwOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGludCBIVFRQU19XRUxMX0tOT1dOX1BPUlQgPSA0NDM7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDYWNoZUNvbmZpZyB7Ci0JCXB1YmxpYyBmaW5hbCBTdHJpbmcgdXJsUGF0dGVybjsKLQkJcHVibGljIGZpbmFsIGJ5dGVbXSBjb250cm9sOwotCi0JCXB1YmxpYyBDYWNoZUNvbmZpZyhTdHJpbmcgdXJsUGF0dGVybiwgU3RyaW5nIGNvbnRyb2wpIHsKLQkJCXRoaXMudXJsUGF0dGVybiA9IHVybFBhdHRlcm47Ci0JCQl0aGlzLmNvbnRyb2wgPSBjb250cm9sLmdldEJ5dGVzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDYWNoZUNvbmZpZ1tdIGNhY2hlQ29uZmlncyA9IHsgLy8gbmV3Ci0JCQkJCQkJCQkJCQkJLy8gQ2FjaGVDb25maWcoImh0dHA6Ly9kaXNuZXlcXC5nb1xcLmNvbS8uKiIsCi0JCQkJCQkJCQkJCQkJLy8gIm1heC1hZ2U9IiArIDI0ICogNjAgKgotCQkJCQkJCQkJCQkJCS8vIDYwKSwKLQluZXcgQ2FjaGVDb25maWcoImh0dHA6Ly8uKlxcYWJjbmV3c1xcLmdvXFwuY29tL1ZpZGVvLy4qIiwgIm5vLWNhY2hlIikgfTsKLQotCXByaXZhdGUgSUhUVFBSZXNwb25zZU1lc3NhZ2UgYWRkQ2FjaGVDb250cm9sKFN0cmluZyB1cmlTdHIsCi0JCQlJSFRUUFJlc3BvbnNlTWVzc2FnZSByZXNwb25zZSkgewotCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oIlU6IiArIHVyaVN0cik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVDb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodXJpU3RyLm1hdGNoZXMoY2FjaGVDb25maWdzW2ldLnVybFBhdHRlcm4pKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJtYXRjaC10bzoiICsgY2FjaGVDb25maWdzW2ldLnVybFBhdHRlcm4pOwotCQkJCXJlc3BvbnNlLnNldEhlYWRlcihJSFRUUEhlYWRlci5DQUNIRV9DT05UUk9MX0EsCi0JCQkJCQljYWNoZUNvbmZpZ3NbaV0uY29udHJvbCk7Ci0JCQkJcmV0dXJuIHJlc3BvbnNlOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNwb25zZTsKLQl9Ci0KLQlwcml2YXRlIElIVFRQU2Vzc2lvbk92ZXJyaWRlciBvdmVycmlkZXIgPSBudWxsOwotCXByaXZhdGUgSUhUVFBMb2NhbFNlcnZlciBsb2NhbFNlcnZlciA9IG51bGw7Ci0KLQlwdWJsaWMgSFRUUFJlcXVlc3REaXNwYXRjaGVyKEhUVFBQcm94eUNvbm5lY3Rpb24gY2xpZW50LAotCQkJSUNsaWVudFN0YXRlTWFuYWdlciBjbGllbnRTdGF0ZU1hbmFnZXIsIFNvY2tldCBjbGllbnRTb2NrLAotCQkJaW50IHF1ZXVlU2l6ZSwgaW50IHRpbWVvdXQpIHsKLQkJc3VwZXIoIkhUVFBSZXF1ZXN0RGlzcGF0Y2hlci0iICsgY2xpZW50U29jay5nZXRMb2NhbFBvcnQoKSwKLQkJCQluZXcgU2Vzc2lvbigpLCBjbGllbnQsIGNsaWVudFNvY2ssIHF1ZXVlU2l6ZSk7Ci0JCXRoaXMuZkNsaWVudCA9IGNsaWVudDsKLQkJdGhpcy5mRXhQcm94eUNvbmYgPSBjbGllbnQuZ2V0RXh0ZXJuYWxQcm94eUNvbmZpZygpOwotCQl0aGlzLmNsaWVudFN0YXRlTWFuYWdlciA9IGNsaWVudFN0YXRlTWFuYWdlcjsKLQkJdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLQkJCi0JCS8vdGhpcy5sb2NhbFNlcnZlciA9IG5ldyBIVFRQTG9jYWxTZXJ2ZXJTV0YoY2xpZW50LmdldFNlY3JldE1hbmFnZXIoKSk7Ci0JCS8vdGhpcy5vdmVycmlkZXIgPSBuZXcgU1dGQm9vdGxvYWRlcihnZXREaXNwYXRjaGVySWQoKSk7Ci0KLQkJSUhUVFBMb2NhbFNlcnZlckZhY3RvcnkgbG9jYWxTZXJ2ZXJGYWN0b3J5ID0gY2xpZW50LmdldFByb3h5KCkuZ2V0TG9jYWxTZXJ2ZXJGYWN0b3J5KCk7Ci0JCUlIVFRQU2Vzc2lvbk92ZXJyaWRlckZhY3Rvcnkgb3ZlcnJpZGVyRmFjdG9yeSA9IGNsaWVudC5nZXRQcm94eSgpLmdldFNlc3Npb25PdmVycmlkZXJGYWN0b3J5KCk7Ci0JCQotCQlpZihudWxsIT1sb2NhbFNlcnZlckZhY3RvcnkpewotCQkJdGhpcy5sb2NhbFNlcnZlciA9IGxvY2FsU2VydmVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQl9Ci0JCWlmKG51bGwhPW92ZXJyaWRlckZhY3RvcnkpewotCQkJdGhpcy5vdmVycmlkZXIgPSBvdmVycmlkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKGdldERpc3BhdGNoZXJJZCgpKTsKLQkJfQkJCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NMb2NhbFNlcnZlclJlcXVlc3QoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0KQotCQkJdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmKG51bGw9PWxvY2FsU2VydmVyKXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gbG9jYWxTZXJ2ZXIucHJvY2Vzc1JlcXVlc3QoZ2V0RGlzcGF0Y2hlcklkKCksIGZDbGllbnQsIHJlcXVlc3QsCi0JCQkJdHJhbnNjb2Rlcik7Ci0JfQotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgc2VydmVyQ29ubmVjdGlvbkNhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBIVFRQU2VydmVyQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKFN0cmluZyBob3N0LCBpbnQgcG9ydCkgewotCQlIVFRQU2VydmVyQ29ubmVjdGlvbiBzYzsKLQkJaW50IGxlbiA9IHNlcnZlckNvbm5lY3Rpb25DYWNoZS5zaXplKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBsZW4pIHsKLQkJCXNjID0gKEhUVFBTZXJ2ZXJDb25uZWN0aW9uKSBzZXJ2ZXJDb25uZWN0aW9uQ2FjaGUuZ2V0KGkpOwotCQkJaWYgKGhvc3QuZXF1YWxzKHNjLmdldEhvc3QoKSkgJiYgKHBvcnQgPT0gc2MuZ2V0UG9ydCgpKSkgewotCQkJCWlmIChzYy5nZXRTdGF0KCkgPCAwKSB7Ci0JCQkJCXNjLmRlYWN0aXZhdGUoKTsKLQkJCQkJc2MgPSBIVFRQU2VydmVyQ29ubmVjdGlvbi5uZXdDb25uZWN0aW9uKHRoaXMsIGhvc3QsIHBvcnQsCi0JCQkJCQkJdGltZW91dCk7Ci0JCQkJCXNlcnZlckNvbm5lY3Rpb25DYWNoZS5zZXQoaSwgc2MpOwotCQkJCX0KLQkJCQlyZXR1cm4gc2M7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChzYy5nZXRTdGF0KCkgPCAwKSB7Ci0JCQkJCXNjLmRlYWN0aXZhdGUoKTsKLQkJCQkJc2VydmVyQ29ubmVjdGlvbkNhY2hlLnJlbW92ZShpKTsKLQkJCQkJbGVuLS07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzYyA9IEhUVFBTZXJ2ZXJDb25uZWN0aW9uLm5ld0Nvbm5lY3Rpb24odGhpcywgaG9zdCwgcG9ydCwgdGltZW91dCk7Ci0JCXNlcnZlckNvbm5lY3Rpb25DYWNoZS5hZGQoc2MpOwotCQlyZXR1cm4gc2M7Ci0JfQotCi0JcHJpdmF0ZSBIVFRQU2VydmVyQ29ubmVjdGlvbiBuZXdDb25uZWN0aW9uRm9yU2VydmVyKAotCQkJSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0LCBib29sZWFuIG1vZGVDb25uZWN0KSB7Ci0JCVN0cmluZyBob3N0OwotCQlpbnQgcG9ydDsKLQkJU3RyaW5nIHVyaVN0ciA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSVN0cmluZygpOwotCQlTdHJpbmcgYXV0aG9yaXR5ID0gUGFyc2VVUkkuZ2V0QXV0aG9yaXR5KHVyaVN0cik7Ci0JCUlIVFRQSGVhZGVyIGhvc3RIZWFkZXIgPSByZXF1ZXN0LmdldEhlYWRlcihJSFRUUEhlYWRlci5IT1NUX0EpOwotCQlpZiAobW9kZUNvbm5lY3QpIHsKLQkJCWhvc3QgPSBQYXJzZVVSSS5wYXJzZUhvc3QodXJpU3RyKTsKLQkJCXBvcnQgPSBQYXJzZVVSSS5wYXJzZVBvcnQodXJpU3RyLCBIVFRQU19XRUxMX0tOT1dOX1BPUlQpOwotCQl9IGVsc2UgaWYgKGhvc3RIZWFkZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIGhvc3RTdHIgPSBuZXcgU3RyaW5nKGhvc3RIZWFkZXIuZ2V0VmFsdWUoKSk7Ci0JCQlob3N0ID0gUGFyc2VVUkkucGFyc2VIb3N0KGhvc3RTdHIpOwotCQkJcG9ydCA9IFBhcnNlVVJJLnBhcnNlUG9ydChob3N0U3RyLCBIVFRQX1dFTExfS05PV05fUE9SVCk7Ci0JCX0gZWxzZSBpZiAoYXV0aG9yaXR5ICE9IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBVUkkgdXJpID0gbnVsbDsgdHJ5IHsgdXJpID0gbmV3IFVSSSh1cmlTdHIpOyB9IGNhdGNoCi0JCQkgKiAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsgV0FSTklORygiVVJJIGlzIGludmFsaWQ6IiArIHVyaVN0cik7Ci0JCQkgKiByZXR1cm4gbnVsbDsgfSBob3N0ID0gdXJpLmdldEhvc3QoKTsgcG9ydCA9IHVyaS5nZXRQb3J0KCk7Ci0JCQkgKi8KLQkJCWhvc3QgPSBQYXJzZVVSSS5wYXJzZUhvc3QoYXV0aG9yaXR5KTsKLQkJCXBvcnQgPSBQYXJzZVVSSS5wYXJzZVBvcnQoYXV0aG9yaXR5LCBIVFRQX1dFTExfS05PV05fUE9SVCk7Ci0KLQkJCUhlYWRlclRvQWRkIGhlYWRlciA9IG5ldyBIZWFkZXJUb0FkZCgpOwotCQkJLy8gaGVhZGVyLmluaXQoSFRUUEhlYWRlci5IT1NULCBob3N0KTsKLQkJCS8vIHJlcXVlc3QuYWRkSGVhZGVyKGhlYWRlcik7Ci0JCQlyZXF1ZXN0LnNldEhlYWRlcihJSFRUUEhlYWRlci5IT1NUX0EsIGhvc3QuZ2V0Qnl0ZXMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoYXV0aG9yaXR5ICE9IG51bGwpIHsKLQkJCVN0cmluZyBhYnNQYXRoID0gUGFyc2VVUkkuZ2V0QWJzb2x1dGVQYXRoKHVyaVN0cik7Ci0JCQlyZXF1ZXN0LnNldFJlcXVlc3RVUklTdHJpbmcoYWJzUGF0aCk7Ci0JCX0KLQotCQlJSFRUUEhlYWRlciBwY0hlYWRlciA9IHJlcXVlc3QuZ2V0SGVhZGVyKElIVFRQSGVhZGVyLlBST1hZX0NPTk5FQ1RJT05fQSk7Ci0JCWlmIChwY0hlYWRlciAhPSBudWxsKSB7Ci0JCQlwY0hlYWRlci5zZXRSZW1vdmVkKHRydWUpOwotCQkJcmVxdWVzdC5zZXRIZWFkZXIoSUhUVFBIZWFkZXIuQ09OTkVDVElPTl9BLCBwY0hlYWRlci5nZXRWYWx1ZSgpKTsKLQkJfQotCi0JCUlIVFRQSGVhZGVyIHByYWdtYUhlYWRlciA9IHJlcXVlc3QuZ2V0SGVhZGVyKElIVFRQSGVhZGVyLlBSQUdNQV9BKTsKLQkJaWYgKHByYWdtYUhlYWRlciAhPSBudWxsKQotCQkJcHJhZ21hSGVhZGVyLnNldFJlbW92ZWQodHJ1ZSk7Ci0KLQkJcmV0dXJuIGdldENvbm5lY3Rpb24oaG9zdCwgcG9ydCk7Ci0JfQotCi0JcHJpdmF0ZSBIVFRQU2VydmVyQ29ubmVjdGlvbiBuZXdDb25uZWN0aW9uRm9yUHJveHkoKSB7Ci0JCXJldHVybiBnZXRDb25uZWN0aW9uKGZFeFByb3h5Q29uZi5nZXRFeHRlcm5hbFByb3h5SG9zdCgpLCBmRXhQcm94eUNvbmYKLQkJCQkuZ2V0RXh0ZXJuYWxQcm94eVBvcnQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJSFRUUFByb3h5VHJhbnNjb2RlciB0cmFuc2NvZGVyID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIHNldFRyYW5zY29kZXIoSUhUVFBQcm94eVRyYW5zY29kZXIgdHJhbnNjb2RlcikgewotCQl0aGlzLnRyYW5zY29kZXIgPSB0cmFuc2NvZGVyOwotCX0KLQotCXByaXZhdGUgSUhUVFBSZXNwb25zZU1lc3NhZ2UgdHJhbnNjb2RlKElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCwKLQkJCUlIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlKSB7Ci0JCWlmICh0cmFuc2NvZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiB0cmFuc2NvZGVyLnRyYW5zY29kZShnZXREaXNwYXRjaGVySWQoKSwgcmVxdWVzdCwgcmVzcG9uc2UpOwotCQl9Ci0JCXJldHVybiByZXNwb25zZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VuZEdhdGV3YXlUaW1lb3V0KElIVFRQUmVxdWVzdE1lc3NhZ2UgcmVxdWVzdCkKLQkJCXRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlmQ2xpZW50LnNlbmRSZXNwb25zZShuZXcgSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKHJlcXVlc3QKLQkJCQkuZ2V0U2VyaWFsKCksIElIVFRQSGVhZGVyLkhUVFBfVkVSU0lPTl8xXzBfQSwgIjUwNCIuZ2V0Qnl0ZXMoKSwKLQkJCQkiR2F0ZXdheSBUaW1lb3V0Ii5nZXRCeXRlcygpLAotCQkJCUlIVFRQUmVzcG9uc2VNZXNzYWdlLkVNUFRZX0JPRFkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VuZEJhZEdhdGV3YXkoSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0KQotCQkJdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWZDbGllbnQuc2VuZFJlc3BvbnNlKG5ldyBIVFRQUmVzcG9uc2VJbk1lbW9yeU1lc3NhZ2UocmVxdWVzdAotCQkJCS5nZXRTZXJpYWwoKSwgSUhUVFBIZWFkZXIuSFRUUF9WRVJTSU9OXzFfMF9BLCAiNTAyIi5nZXRCeXRlcygpLAotCQkJCSJCYWQgR2F0ZXdheSIuZ2V0Qnl0ZXMoKSwKLQkJCQlJSFRUUFJlc3BvbnNlTWVzc2FnZS5FTVBUWV9CT0RZKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbmROb3RGb3VuZChJSFRUUFJlcXVlc3RNZXNzYWdlIHJlcXVlc3QpCi0JCQl0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJZkNsaWVudAotCQkJCS5zZW5kUmVzcG9uc2UobmV3IEhUVFBSZXNwb25zZUluTWVtb3J5TWVzc2FnZShyZXF1ZXN0Ci0JCQkJCQkuZ2V0U2VyaWFsKCksIElIVFRQSGVhZGVyLkhUVFBfVkVSU0lPTl8xXzBfQSwgIjQwNCIKLQkJCQkJCS5nZXRCeXRlcygpLCAiTm90IEZvdW5kIi5nZXRCeXRlcygpLAotCQkJCQkJSUhUVFBSZXNwb25zZU1lc3NhZ2UuRU1QVFlfQk9EWSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gU2VuZGVyIHRocmVhZC4KLQkJLy8gUGlja3VwIGEgbWVzc2FnZSAoUXVldWVkTXNnIHwgUmV0cnlNc2cpIGFuZAotCQkvLyBUaGUgc2VudCByZXF1ZXN0IGlzIHB1dCBpbnRvIHRoZSB3YWl0aW5nIHF1ZXVlLgotCQl0cnkgewotCQkJSUhUVFBSZXF1ZXN0TWVzc2FnZSByZXF1ZXN0ID0gbnVsbDsKLQkJCUlIVFRQUmVzcG9uc2VNZXNzYWdlIHJlc3BvbnNlID0gbnVsbDsKLQkJCVNlcnZlckNvbm5lY3Rpb24gY29ubiA9IG51bGw7Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCS8vIEdldCBuZXh0IHJlcXVlc3QKLQkJCQlpZiAocmVxdWVzdCA9PSBudWxsKSB7Ci0JCQkJCURFQlVHKCJUcnlpbmcgdG8gZ2V0IG5leHQgcmVxdWVzdCIpOwotCQkJCQkvLyBXYWl0IHdoaWxlIChmTmV4dE1zZyA9PSBudWxsICYmIGZSZXRyeU1zZyA9PSBudWxsICYmCi0JCQkJCS8vIGZBcnJpdmVkTXNncy5pc0VtcHR5KCkpCi0JCQkJCXJlcXVlc3QgPSBnZXROZXh0UmVxdWVzdCgpOwotCQkJCX0KLQkJCQlhc3NlcnQgKHJlcXVlc3QgIT0gbnVsbCk7Ci0JCQkJaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJc2IuYXBwZW5kKCJuZXh0UmVxdWVzdDogbXNnU2VyaWFsPSIpLmFwcGVuZCgKLQkJCQkJCQlyZXF1ZXN0LmdldFNlcmlhbCgpKTsKLQkJCQkJc2IuYXBwZW5kKCIsIHRpZD0iKS5hcHBlbmQocmVxdWVzdC5nZXRUaWQoKSk7Ci0JCQkJCURFQlVHKHNiLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQlTdHJpbmcgdXJpU3RyID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJU3RyaW5nKCk7Ci0KLQkJCQlib29sZWFuIG1vZGVDb25uZWN0OwotCQkJCWlmIChJSFRUUEhlYWRlci5NRVRIT0RfQ09OTkVDVC5lcXVhbHMocmVxdWVzdAotCQkJCQkJLmdldE1ldGhvZEFzU3RyaW5nKCkpKSB7Ci0JCQkJCW1vZGVDb25uZWN0ID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQltb2RlQ29ubmVjdCA9IGZhbHNlOwotCQkJCX0KLQotCQkJCWlmIChudWxsIT1vdmVycmlkZXIgJiYgb3ZlcnJpZGVyLnJlcGxhY2VSZXF1ZXN0KGNsaWVudFN0YXRlTWFuYWdlciwgcmVxdWVzdCkpIHsKLQkJCQkJcmVxdWVzdCA9IG92ZXJyaWRlci5nZXRTZXNzaW9uUmVxdWVzdCgpOwotCQkJCQlyZXNwb25zZSA9IG92ZXJyaWRlci5nZXRTZXNzaW9uUmVzcG9uc2UoKTsKLQkJCQkJaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZkNsaWVudC5zZW5kUmVzcG9uc2UodGltZW91dCwgcmVzcG9uc2UpOwotCQkJCQkJCWZDbGllbnQubm90aWZ5U3VjY2Vzc2Z1bFNlcnZlckNvbm5lY3Rpb24oY29ubik7Ci0JCQkJCQkJREVCVUcoIlNVQ0NFU1MiKTsKLQkJCQkJCX0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgewotCQkJCQkJCXNlbmRHYXRld2F5VGltZW91dChyZXF1ZXN0KTsKLQkJCQkJCQlERUJVRygiVGltZW91dC4gRmFpbGVkIHRvIHNlbmQgb3JpZ2luYWwgU1dGIHRvIHRoZSBjbGllbnQuIik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXF1ZXN0ID0gbnVsbDsKLQkJCQkJCWNsZWFyTmV4dFJlcXVlc3QoKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChwcm9jZXNzTG9jYWxTZXJ2ZXJSZXF1ZXN0KHJlcXVlc3QpKSB7Ci0JCQkJCXJlcXVlc3QgPSBudWxsOwotCQkJCQljbGVhck5leHRSZXF1ZXN0KCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCS8vIFNlbmQgYSByZXF1ZXN0IHRvIGEgc2VydmVyCi0JCQkJaWYgKGZFeFByb3h5Q29uZi5nZXRFeHRlcm5hbFByb3h5RmxhZygpKSB7Ci0JCQkJCWNvbm4gPSBuZXdDb25uZWN0aW9uRm9yUHJveHkoKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb25uID0gbmV3Q29ubmVjdGlvbkZvclNlcnZlcihyZXF1ZXN0LCBtb2RlQ29ubmVjdCk7Ci0JCQkJfQotCQkJCWlmIChjb25uID09IG51bGwpIHsKLQkJCQkJcmVxdWVzdCA9IG51bGw7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXRyeSB7Ci0JCQkJCWlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJCQkJREVCVUcoIlRyeWluZyB0byBjb25uZWN0IHRvICIgKyBjb25uKTsKLQkJCQkJfQotCQkJCQljb25uLmFjdGl2YXRlQW5kQ29ubmVjdCh0aW1lb3V0KTsKLQkJCQkJaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCQkJCQlERUJVRygiVHJ5aW5nIHRvIHNlbmQgYSByZXF1ZXN0IHRvICIgKyBjb25uKTsKLQkJCQkJfQotCQkJCQlpZiAoY29ubi5nZXRTdGF0KCkgPT0gU2VydmVyQ29ubmVjdGlvbi5TVEFUX0NPTk5FQ1RFRCkgewotCQkJCQkJaWYgKG1vZGVDb25uZWN0Ci0JCQkJCQkJCSYmICFmRXhQcm94eUNvbmYuZ2V0RXh0ZXJuYWxQcm94eUZsYWcoKSkgewotCQkJCQkJCWZDbGllbnQuYWxsb3dUdW5uZWwocmVxdWVzdCwgY29ubiwgdGltZW91dCk7Ci0JCQkJCQkJY2xlYXJOZXh0UmVxdWVzdCgpOwotCQkJCQkJCXJlcXVlc3QgPSBudWxsOwotCQkJCQkJCWNvbm4uZGVhY3RpdmF0ZSgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJc3RhcnRTZXNzaW9uQW5kU2VuZFJlcXVlc3QocmVxdWVzdCwgY29ubiwgdGltZW91dCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlmQ2xpZW50LnNlbmRSZXNwb25zZShuZXcgSFRUUFJlc3BvbnNlSW5NZW1vcnlNZXNzYWdlKAotCQkJCQkJCQlyZXF1ZXN0LmdldFNlcmlhbCgpLAotCQkJCQkJCQlJSFRUUEhlYWRlci5IVFRQX1ZFUlNJT05fMV8wX0EsCi0JCQkJCQkJCSI1MDMiLmdldEJ5dGVzKCksICJTZXJ2aWNlIFVuYXZhaWxhYmxlIgotCQkJCQkJCQkJCS5nZXRCeXRlcygpLAotCQkJCQkJCQlJSFRUUFJlc3BvbnNlTWVzc2FnZS5FTVBUWV9CT0RZKSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlERUJVRygiU2VudCBhIHJlcXVlc3QgdG8gIiArIGNvbm4pOwotCQkJCX0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gdGltZW91dCkgewotCQkJCQlERUJVRygic2VuZFJlcXVlc3QoKSB0aW1lb3V0LCB0cnkgYWdhaW4iKTsKLQkJCQkJc2VuZEdhdGV3YXlUaW1lb3V0KHJlcXVlc3QpOwotCQkJCQljb25uLmRlYWN0aXZhdGUoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCURFQlVHKCJjb25uZWN0aW9uIGNsb3NlZCIpOwotCQkJCQlzZW5kTm90Rm91bmQocmVxdWVzdCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8vIEdldCBhIHJlc3BvbnNlIGZyb20gYSBzZXJ2ZXIsIGFuZCBzZW5kIGl0IGJhY2sgdG8gdGhlIGNsaWVudC4KLQkJCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQkJREVCVUcoIlRyeWluZyB0byByZWNlaXZlIGEgcmVzcG9uc2UgZnJvbSAiICsgY29ubik7Ci0JCQkJfQotCi0JCQkJdHJ5IHsKLQkJCQkJcmVzcG9uc2UgPSBmU2Vzc2lvbi5nZXRSZXNwb25zZSh0aW1lb3V0KTsKLQkJCQkJcmVzcG9uc2UgPSBhZGRDYWNoZUNvbnRyb2wodXJpU3RyLCByZXNwb25zZSk7Ci0JCQkJCWlmIChyZXNwb25zZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAobW9kZUNvbm5lY3QpIHsKLQkJCQkJCQlpZiAoIjIwMCIuZXF1YWxzKHJlc3BvbnNlLmdldFN0YXR1c0NvZGVBc1N0cmluZygpKSkgewotCQkJCQkJCQlmQ2xpZW50LmFsbG93VHVubmVsKHJlcXVlc3QsIGNvbm4sIHRpbWVvdXQpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWZDbGllbnQuc2VuZFJlc3BvbnNlKDAsIHJlc3BvbnNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUlIVFRQUmVzcG9uc2VNZXNzYWdlIG5ld1Jlc3BvbnNlID0gdHJhbnNjb2RlKAotCQkJCQkJCQkJcmVxdWVzdCwgcmVzcG9uc2UpOwotCQkJCQkJCWlmIChudWxsIT1vdmVycmlkZXIgJiYgb3ZlcnJpZGVyLnJlcGxhY2VSZXNwb25zZSgKLQkJCQkJCQkJCWNsaWVudFN0YXRlTWFuYWdlciwgcmVxdWVzdCwgcmVzcG9uc2UsCi0JCQkJCQkJCQl0aW1lb3V0KSkgewotCQkJCQkJCQluZXdSZXNwb25zZSA9IG92ZXJyaWRlcgotCQkJCQkJCQkJCS5nZXRTZXNzaW9uUmVzcG9uc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZkNsaWVudC5zZW5kUmVzcG9uc2UodGltZW91dCwgbmV3UmVzcG9uc2UpOwotCQkJCQkJfQotCi0JCQkJCQlyZXF1ZXN0ID0gbnVsbDsKLQkJCQkJCWNsZWFyTmV4dFJlcXVlc3QoKTsKLQkJCQkJCWZDbGllbnQubm90aWZ5U3VjY2Vzc2Z1bFNlcnZlckNvbm5lY3Rpb24oY29ubik7Ci0KLQkJCQkJCWlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlNVQ0NFU1NcbiIpOwotCQkJCQkJCXNiLmFwcGVuZCgiUmVjZWl2ZWQgYSByZXNwb25zZSBmcm9tICIpLmFwcGVuZChjb25uKTsKLQkJCQkJCQlERUJVRyhzYi50b1N0cmluZygpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgewotCQkJCQlzZW5kR2F0ZXdheVRpbWVvdXQocmVxdWVzdCk7Ci0JCQkJCWlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJc2IKLQkJCQkJCQkJLmFwcGVuZCgKLQkJCQkJCQkJCQkiVGltZW91dC4gRmFpbGVkIHRvIHNlbmQvcmVjZWl2ZSBhIG1lc3NhZ2UgdG8gYSBzZXJ2ZXIgKCIpCi0JCQkJCQkJCS5hcHBlbmQoY29ubik7Ci0JCQkJCQlzYi5hcHBlbmQoIikgVHJ5IGFub3RoZXIgc2VydmVyLiIpOwotCQkJCQkJREVCVUcoc2IudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQkJLy8gVE9ETwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKGZDbGllbnQuaXNIYW5kbGluZ1JlcXVlc3QoKSkgewotCQkJCQkJc2VuZEJhZEdhdGV3YXkocmVxdWVzdCk7Ci0JCQkJCX0KLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQkJLy8gY29ubi5kZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGludGVycnVwdGVkKSB7Ci0JCQkvLyBub3AKLQkJCURFQlVHKCJJbnRlcnJ1cHRlZCIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQlERUJVRygiUmVxdWVzdERpc3BhdGNoZXIgaXMgc3RvcHBlZCBieSBJT0V4Y2VwdGlvbi4iKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJLy8gZkNsaWVudC5yZXNldENvbm5lY3Rpb24oKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWludCBsZW4gPSBzZXJ2ZXJDb25uZWN0aW9uQ2FjaGUuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCUhUVFBTZXJ2ZXJDb25uZWN0aW9uIGMgPSAoSFRUUFNlcnZlckNvbm5lY3Rpb24pIHNlcnZlckNvbm5lY3Rpb25DYWNoZQotCQkJCQkJLmdldChpKTsKLQkJCQljLmRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJCURFQlVHKCJSZXF1ZXN0RGlzcGF0Y2hlciBzdG9wcGVkIik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIHNiLmFwcGVuZCgiSFRUUFJlcXVlc3REaXNwYXRjaGVyLSIpLmFwcGVuZChnZXREaXNwYXRjaGVySWQoKSk7Ci0JCXNiLmFwcGVuZCgiW2lkOiIpLmFwcGVuZChnZXREaXNwYXRjaGVySWQoKSkuYXBwZW5kKAotCQkJCSJdIEhUVFBSZXF1ZXN0RGlzcGF0Y2hlciIpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBERUJVRyhTdHJpbmcgbXNnKSB7Ci0JCWlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc2IuYXBwZW5kKHRoaXMudG9TdHJpbmcoKSkuYXBwZW5kKCI6ICIpLmFwcGVuZChtc2cpOwotCQkJTE9HR0VSLmRlYnVnKHNiLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgV0FSTklORyhTdHJpbmcgbXNnKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKHRoaXMudG9TdHJpbmcoKSkuYXBwZW5kKCI6ICIpLmFwcGVuZChtc2cpOwotCQlMT0dHRVIud2FybmluZyhzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBJTkZPKFN0cmluZyBtc2cpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQodGhpcy50b1N0cmluZygpKS5hcHBlbmQoIjogIikuYXBwZW5kKG1zZyk7Ci0JCUxPR0dFUi5pbmZvKHNiLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmh0dHBwcm94eS9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL2h0dHBwcm94eS9wcm94eS9IVFRQU2VydmVyQ29ubmVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L3Byb3h5L0hUVFBTZXJ2ZXJDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYmMyM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuaHR0cHByb3h5L3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvaHR0cHByb3h5L3Byb3h5L0hUVFBTZXJ2ZXJDb25uZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwuaHR0cHByb3h5LnByb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlLkhUVFBSZXNwb25zZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlLkhUVFBSZXNwb25zZVN0cmVhbU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLmh0dHBwcm94eS5jb3JlLlNlcnZlckNvbm5lY3Rpb247Ci0KLQotcHVibGljIGNsYXNzIEhUVFBTZXJ2ZXJDb25uZWN0aW9uIGV4dGVuZHMgU2VydmVyQ29ubmVjdGlvbiB7Ci0gICAgcHJpdmF0ZSBIVFRQU2VydmVyQ29ubmVjdGlvbihTdHJpbmcgaG9zdCwgaW50IHBvcnQsIEhUVFBSZXF1ZXN0RGlzcGF0Y2hlciBkaXNwYXRjaGVyLCBpbnQgcmV0cnlUaW1lLCBpbnQgdGltZW91dCkgewotICAgICAgICBzdXBlcigiW2lkOiIgKyBkaXNwYXRjaGVyLmdldERpc3BhdGNoZXJJZCgpICsgIl0gSFRUUFNlcnZlckNvbm5lY3Rpb24iLCBob3N0LCBwb3J0LCAwLCAwLCBkaXNwYXRjaGVyLAotICAgICAgICAgICAgICAgIHJldHJ5VGltZSwgdGltZW91dCk7Ci0gICAgfQotCi0gICAgc3RhdGljIEhUVFBTZXJ2ZXJDb25uZWN0aW9uIG5ld0Nvbm5lY3Rpb24oSFRUUFJlcXVlc3REaXNwYXRjaGVyIGRpc3BhdGNoZXIsIFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIVFRQU2VydmVyQ29ubmVjdGlvbihob3N0LCBwb3J0LCBkaXNwYXRjaGVyLCB0aW1lb3V0LCB0aW1lb3V0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSFRUUFJlc3BvbnNlTWVzc2FnZSBjcmVhdGVIVFRQUmVzcG9uc2VNZXNzYWdlKGxvbmcgbXNnU2VyaWFsKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSFRUUFJlc3BvbnNlU3RyZWFtTWVzc2FnZShtc2dTZXJpYWwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZDU5YjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZDc1YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRWNsaXBzZSBBQ1RGIEp4cGF0aCBGcmFnbWVudCAoSW5jdWJhdGlvbikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGg7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjAucXVhbGlmaWVyCi1GcmFnbWVudC1Ib3N0OiBvcmcuZWNsaXBzZS5hY3RmLmNvcmUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODFkYmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvYWJvdXRfZmlsZXMvYXNsLXYyMC50eHQgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvYWJvdXRfZmlsZXMvYXNsLXYyMC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL2Fib3V0X2ZpbGVzL2FzbC12MjAudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmU3YzVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0X2ZpbGVzLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBhYm91dF9maWxlcy8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL2ZyYWdtZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9mcmFnbWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYWJiMGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL2ZyYWdtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxmcmFnbWVudD4KLTwhLS0gICBwbHVnaW4taWQ9IiIKLSAgIHBsdWdpbi12ZXJzaW9uPSIiPgotLS0+ICAgCi08L2ZyYWdtZW50PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvanhwYXRoL0RPTUV4Tm9kZUl0ZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9qeHBhdGgvRE9NRXhOb2RlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjZWMxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9qeHBhdGgvRE9NRXhOb2RlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGg7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLmNvbXBpbGVyLk5vZGVUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkubW9kZWwuTm9kZVBvaW50ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5tb2RlbC5kb20uRE9NTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkubW9kZWwuZG9tLkRPTU5vZGVQb2ludGVyOwotCi0KLQotcHVibGljIGNsYXNzIERPTUV4Tm9kZUl0ZXJhdG9yIGV4dGVuZHMgRE9NTm9kZUl0ZXJhdG9yIHsKLSAgICBET01FeE5vZGVJdGVyYXRvcihOb2RlUG9pbnRlciBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgTm9kZVRlc3QgdGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJldmVyc2UsCi0gICAgICAgICAgICAgICAgICAgICAgTm9kZVBvaW50ZXIgc3RhcnRXaXRoKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgdGVzdCwgcmV2ZXJzZSwgc3RhcnRXaXRoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTm9kZVBvaW50ZXIgZ2V0Tm9kZVBvaW50ZXIoKSB7Ci0gICAgICAgIERPTU5vZGVQb2ludGVyIHB0T3JnID0gKERPTU5vZGVQb2ludGVyKSBzdXBlci5nZXROb2RlUG9pbnRlcigpOwotICAgICAgICByZXR1cm4gbmV3IERPTUV4Tm9kZVBvaW50ZXIocHRPcmcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2p4cGF0aC9ET01FeE5vZGVQb2ludGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9qeHBhdGgvRE9NRXhOb2RlUG9pbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZiYTQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2p4cGF0aC9ET01FeE5vZGVQb2ludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLkpYUGF0aENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5Qb2ludGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkuQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5jb21waWxlci5Ob2RlTmFtZVRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5jb21waWxlci5Ob2RlVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLmNvbXBpbGVyLk5vZGVUeXBlVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLm1vZGVsLk5vZGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLm1vZGVsLk5vZGVQb2ludGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkubW9kZWwuYmVhbnMuTnVsbFBvaW50ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5tb2RlbC5kb20uRE9NTm9kZVBvaW50ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotcHVibGljIGNsYXNzIERPTUV4Tm9kZVBvaW50ZXIgZXh0ZW5kcyBET01Ob2RlUG9pbnRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzEwNzIyNjYwNDc0MDI0ODIwOUw7Ci0KLSAgICBwcml2YXRlIE5vZGUgZ2V0RE9NTm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIChOb2RlKSBnZXRJbW1lZGlhdGVOb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIERPTUV4Tm9kZVBvaW50ZXIoTm9kZSBub2RlLCBMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIHN1cGVyKG5vZGUsIGxvY2FsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIERPTUV4Tm9kZVBvaW50ZXIoTm9kZSBub2RlLCBMb2NhbGUgbG9jYWxlLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgc3VwZXIobm9kZSwgbG9jYWxlLCBpZCk7Ci0gICAgfQotCi0gICAgcHVibGljIERPTUV4Tm9kZVBvaW50ZXIoTm9kZVBvaW50ZXIgcGFyZW50LCBOb2RlIG5vZGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBub2RlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRE9NRXhOb2RlUG9pbnRlcihET01Ob2RlUG9pbnRlciBwdE9yZykgewotICAgICAgICBzdXBlcihwdE9yZy5nZXRQYXJlbnQoKSwgKE5vZGUpIHB0T3JnLmdldEltbWVkaWF0ZU5vZGUoKSk7Ci0gICAgfQotICAgIAotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgT3ZlcnJpZGluZyBNZXRob2RzLgotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gdGVzdE5vZGUoTm9kZVRlc3QgdGVzdCkgewotICAgICAgICBpZiAodGVzdCBpbnN0YW5jZW9mIE5vZGVUeXBlVGVzdCkgewotICAgICAgICAgICAgTm9kZVR5cGVUZXN0IG50dCA9IChOb2RlVHlwZVRlc3QpIHRlc3Q7Ci0gICAgICAgICAgICBpZiAobnR0LmdldE5vZGVUeXBlKCkgID09IENvbXBpbGVyLk5PREVfVFlQRV9OT0RFKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHRlc3QgaW5zdGFuY2VvZiBOb2RlTmFtZVRlc3QpIHsKLSAgICAgICAgICAgIE5vZGVOYW1lVGVzdCBubnQgPSAoTm9kZU5hbWVUZXN0KSB0ZXN0OwotICAgICAgICAgICAgU3RyaW5nIG5zVGVzdCA9IG5udC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuc1Rlc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRlc3QgPSBuZXcgTm9kZU5hbWVUZXN0KG5udC5nZXROb2RlTmFtZSgpLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnRlc3ROb2RlKHRlc3QpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQb2ludGVyIGdldFBvaW50ZXJCeUlEKEpYUGF0aENvbnRleHQgY29udGV4dCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IGdldERPTU5vZGUoKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvYy5nZXRFbGVtZW50QnlJZChpZCk7Ci0gICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTnVsbFBvaW50ZXIoZ2V0TG9jYWxlKCksIGlkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IERPTUV4Tm9kZVBvaW50ZXIoZWxlbWVudCwgZ2V0TG9jYWxlKCksIGlkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTm9kZVBvaW50ZXIgZ2V0UGFyZW50KCkgewotICAgICAgICBOb2RlUG9pbnRlciBwb2ludGVyID0gZ2V0SW1tZWRpYXRlUGFyZW50UG9pbnRlcigpOwotICAgICAgICB3aGlsZSAocG9pbnRlciAhPSBudWxsICYmIHBvaW50ZXIuaXNDb250YWluZXIoKSkgewotICAgICAgICAgICAgcG9pbnRlciA9IHBvaW50ZXIuZ2V0SW1tZWRpYXRlUGFyZW50UG9pbnRlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb2ludGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlUG9pbnRlciBnZXRJbW1lZGlhdGVQYXJlbnRQb2ludGVyKCkgewotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHJldHVybiBwYXJlbnQ7Ci0gICAgICAgIE5vZGUgbm9kZSA9IGdldERPTU5vZGUoKTsKLSAgICAgICAgTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gbmV3IERPTUV4Tm9kZVBvaW50ZXIocGFyZW50Tm9kZSwgZ2V0TG9jYWxlKCkpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldFJvb3ROb2RlKCkgewotICAgICAgICBOb2RlIG5vZGUgPSBnZXRET01Ob2RlKCk7Ci0gICAgICAgIHJldHVybiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE5vZGVJdGVyYXRvciBjaGlsZEl0ZXJhdG9yKE5vZGVUZXN0IHRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV2ZXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZVBvaW50ZXIgc3RhcnRXaXRoKSB7Ci0gICAgICAgIGlmICh0ZXN0IGluc3RhbmNlb2YgTm9kZU5hbWVUZXN0KSB7Ci0gICAgICAgICAgICBOb2RlTmFtZVRlc3Qgbm50ID0gKE5vZGVOYW1lVGVzdCkgdGVzdDsKLSAgICAgICAgICAgIFN0cmluZyBuc1Rlc3QgPSBubnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobnNUZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0ZXN0ID0gbmV3IE5vZGVOYW1lVGVzdChubnQuZ2V0Tm9kZU5hbWUoKSwgIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRE9NRXhOb2RlSXRlcmF0b3IodGhpcywgdGVzdCwgcmV2ZXJzZSwgc3RhcnRXaXRoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgTm9kZSBub2RlID0gZ2V0RE9NTm9kZSgpOwotICAgICAgICBTdHJpbmcgbnMgPSBub2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAvLyBUcmVhdCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UsICIiLCBhcyBudWxsLgotICAgICAgICBpZiAobnMubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBuczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9qeHBhdGgvRE9NRXhOb2RlUG9pbnRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2p4cGF0aC9ET01FeE5vZGVQb2ludGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTU1M2JmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2p4cGF0aC9ET01FeE5vZGVQb2ludGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLkpYUGF0aENvbnRleHRSZWZlcmVuY2VJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5tb2RlbC5Ob2RlUG9pbnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLm1vZGVsLk5vZGVQb2ludGVyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotcHVibGljIGNsYXNzIERPTUV4Tm9kZVBvaW50ZXJGYWN0b3J5IGltcGxlbWVudHMgTm9kZVBvaW50ZXJGYWN0b3J5IHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgSlhQYXRoQ29udGV4dFJlZmVyZW5jZUltcGwuYWRkTm9kZVBvaW50ZXJGYWN0b3J5KG5ldyBET01FeE5vZGVQb2ludGVyRmFjdG9yeSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkFDVE9SWV9PUkRFUiA9IDA7Ci0gICAgcHVibGljIGludCBnZXRPcmRlcigpIHsKLSAgICAgICAgcmV0dXJuIEZBQ1RPUllfT1JERVI7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGVQb2ludGVyIGNyZWF0ZU5vZGVQb2ludGVyKFFOYW1lIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBub2RlT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIGlmICghKG5vZGVPYmogaW5zdGFuY2VvZiBOb2RlKSkgcmV0dXJuIG51bGw7Ci0gICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBub2RlT2JqOwotICAgICAgICByZXR1cm4gbmV3IERPTUV4Tm9kZVBvaW50ZXIobm9kZSwgbG9jYWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZVBvaW50ZXIgY3JlYXRlTm9kZVBvaW50ZXIoTm9kZVBvaW50ZXIgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgbm9kZU9iaikgewotICAgICAgICBpZiAoIShub2RlT2JqIGluc3RhbmNlb2YgTm9kZSkpIHJldHVybiBudWxsOwotICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgbm9kZU9iajsKLSAgICAgICAgcmV0dXJuIG5ldyBET01FeE5vZGVQb2ludGVyKHBhcmVudCwgbm9kZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgRE9NRXhOb2RlUG9pbnRlckZhY3RvcnkoKSB7Ci0gICAgfQotfQotICAgIAotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9qeHBhdGgvWFBhdGhTZXJ2aWNlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2p4cGF0aC9YUGF0aFNlcnZpY2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTNjYzM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2p4cGF0aC9YUGF0aFNlcnZpY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC54cGF0aC5YUGF0aFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoU2VydmljZUZhY3Rvcnk7Ci0KLQotCi1wdWJsaWMgY2xhc3MgWFBhdGhTZXJ2aWNlRmFjdG9yeUltcGwgZXh0ZW5kcyBYUGF0aFNlcnZpY2VGYWN0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBYUGF0aFNlcnZpY2UgeHBhdGhTZXJ2aWNlSW5zdGFuY2U7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgWFBhdGhTZXJ2aWNlIGdldFNlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiB4cGF0aFNlcnZpY2VJbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhQYXRoU2VydmljZUZhY3RvcnkgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmICh4cGF0aFNlcnZpY2VJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB4cGF0aFNlcnZpY2VJbnN0YW5jZSA9IFhQYXRoU2VydmljZUltcGwubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGlmICh4cGF0aFNlcnZpY2VJbnN0YW5jZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFhQYXRoU2VydmljZUZhY3RvcnlJbXBsKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgWFBhdGhTZXJ2aWNlRmFjdG9yeUltcGwoKSB7Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2p4cGF0aC9YUGF0aFNlcnZpY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC5qeHBhdGgvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9qeHBhdGgvWFBhdGhTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTAyNDg2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmp4cGF0aC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2p4cGF0aC9YUGF0aFNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuanhwYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLkNvbXBpbGVkRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLkpYUGF0aENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5Qb2ludGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5kb20uRW1wdHlOb2RlTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnhwYXRoLlhQYXRoU2VydmljZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLQotCi1jbGFzcyBYUGF0aFNlcnZpY2VJbXBsIGV4dGVuZHMgWFBhdGhTZXJ2aWNlIHsKLSAgICBzdGF0aWMgewotICAgICAgICBET01FeE5vZGVQb2ludGVyRmFjdG9yeS5pbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBjb21waWxlKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBKWFBhdGhDb250ZXh0LmNvbXBpbGUocGF0aCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgTm9kZUxpc3QgewotICAgICAgICBwcml2YXRlIExpc3Q8Tm9kZT4gbm9kZUxpc3Q7Ci0KLSAgICAgICAgcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gbm9kZUxpc3Quc2l6ZSgpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBub2RlTGlzdC5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZUxpc3Quc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgTm9kZUxpc3RJbXBsKExpc3Q8Tm9kZT4gbm9kZUxpc3QpIHsKLSAgICAgICAgICAgIGlmIChub2RlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5ub2RlTGlzdCA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMubm9kZUxpc3QgPSBub2RlTGlzdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotICAgIHB1YmxpYyBOb2RlTGlzdCBldmFsRm9yTm9kZUxpc3QoT2JqZWN0IGNvbXBpbGVkLCBOb2RlIGJhc2UpIHsKLSAgICAgICAgQ29tcGlsZWRFeHByZXNzaW9uIGNlID0gKENvbXBpbGVkRXhwcmVzc2lvbikgY29tcGlsZWQ7Ci0gICAgICAgIEpYUGF0aENvbnRleHQgYmN0eCA9IEpYUGF0aENvbnRleHQubmV3Q29udGV4dChiYXNlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIFBvaW50ZXIgcHRyID0gbmV3IERPTUV4Tm9kZVBvaW50ZXIoYmFzZSwgbnVsbCk7Ci0gICAgICAgIEpYUGF0aENvbnRleHQgY3R4ID0gYmN0eC5nZXRSZWxhdGl2ZUNvbnRleHQocHRyKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBjZS5pdGVyYXRlUG9pbnRlcnMoY3R4KTsKLSAgICAgICAgaWYgKCFpdC5oYXNOZXh0KCkpIHJldHVybiBFbXB0eU5vZGVMaXN0SW1wbC5nZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0PE5vZGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgUG9pbnRlciBwdCA9IChQb2ludGVyKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IHB0LmdldE5vZGUoKTsKLSAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBOb2RlKSkgY29udGludWU7Ci0gICAgICAgICAgICBOb2RlIG4gPSAoTm9kZSkgbzsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQobik7Ci0gICAgICAgIH0gd2hpbGUgKGl0Lmhhc05leHQoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgTm9kZUxpc3RJbXBsKHJlc3VsdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBldmFsRm9yU3RyaW5nKE9iamVjdCBjb21waWxlZCwgTm9kZSBiYXNlKSB7Ci0gICAgICAgIENvbXBpbGVkRXhwcmVzc2lvbiBjZSA9IChDb21waWxlZEV4cHJlc3Npb24pIGNvbXBpbGVkOwotICAgICAgICBKWFBhdGhDb250ZXh0IGJjdHggPSBKWFBhdGhDb250ZXh0Lm5ld0NvbnRleHQoYmFzZS5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICBQb2ludGVyIHB0ciA9IG5ldyBET01FeE5vZGVQb2ludGVyKGJhc2UsIG51bGwpOwotICAgICAgICBKWFBhdGhDb250ZXh0IGN0eCA9IGJjdHguZ2V0UmVsYXRpdmVDb250ZXh0KHB0cik7Ci0gICAgICAgIHJldHVybiBjZS5nZXRWYWx1ZShjdHgpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBYUGF0aFNlcnZpY2UgbmV3SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgWFBhdGhTZXJ2aWNlSW1wbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgWFBhdGhTZXJ2aWNlSW1wbCgpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmNWFhYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2VlY2I4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRWNsaXBzZSBBQ1RGIFZvY2FiIFBsdWctaW4gKEluY3ViYXRpb24pCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWI7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuVm9jYWJQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MWRiY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIAotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzM5YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotCQkJICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTlmOTUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5hY3RmLnVpLnByZWZlcmVuY2VzLlJvb3RQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIudWkucHJlZmVyZW5jZXMuVm9jYWJQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIucHJlZmVyZW5jZXMuVm9jYWJQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IkRPTSBWb2NhYnVsYXJ5Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIudWkucHJlZmVyZW5jZXMuVm9jYWJQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvdm9jYWIvaW1wbC9BYnN0cmFjdE9wZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL3ZvY2FiL2ltcGwvQWJzdHJhY3RPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWFiZjZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvdm9jYWIvaW1wbC9BYnN0cmFjdE9wZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLnZvY2FiLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklPcGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSVByb3Bvc2l0aW9uOwotCi0KLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcGVyYXRvciBpbXBsZW1lbnRzIElPcGVyYXRvciB7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdDxJUHJvcG9zaXRpb24+IHByb3BzID0gbmV3IEFycmF5TGlzdDxJUHJvcG9zaXRpb24+KCk7Ci0gICAgCi0gICAgcHVibGljIEFic3RyYWN0T3BlcmF0b3IoSVByb3Bvc2l0aW9uLi4uIGFyZ3MpewotICAgICAgICBmb3IoSVByb3Bvc2l0aW9uIHA6IGFyZ3MpewotICAgICAgICAgICAgcHJvcHMuYWRkKHApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZChJUHJvcG9zaXRpb24gcHJvcCl7Ci0gICAgICAgIHByb3BzLmFkZChwcm9wKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBzaXplKCl7Ci0gICAgICAgIHJldHVybiBwcm9wcy5zaXplKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvcG9zaXRpb24gZ2V0KGludCBpbmRleCl7Ci0gICAgICAgIHJldHVybiBwcm9wcy5nZXQoaW5kZXgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvdm9jYWIvaW1wbC9BYnN0cmFjdE9wZXJhdG9yMS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC92b2NhYi9pbXBsL0Fic3RyYWN0T3BlcmF0b3IxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNWY1YjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC92b2NhYi9pbXBsL0Fic3RyYWN0T3BlcmF0b3IxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLnZvY2FiLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSU9wZXJhdG9yMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSVByb3Bvc2l0aW9uOwotCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3BlcmF0b3IxIGltcGxlbWVudHMgSU9wZXJhdG9yMSB7Ci0KLSAgICBwcml2YXRlIElQcm9wb3NpdGlvbiBwcm9wb3NpdGlvbjsKLSAgICAKLSAgICBwdWJsaWMgQWJzdHJhY3RPcGVyYXRvcjEoSVByb3Bvc2l0aW9uIHByb3Bvc2l0aW9uKXsKLSAgICAgICAgdGhpcy5wcm9wb3NpdGlvbiA9IHByb3Bvc2l0aW9uOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVByb3Bvc2l0aW9uIGdldFByb3Bvc2l0aW9uKCkgewotICAgICAgICByZXR1cm4gcHJvcG9zaXRpb247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFByb3Bvc2l0aW9uKElQcm9wb3NpdGlvbiBwcm9wb3NpdGlvbil7Ci0gICAgICAgIHRoaXMucHJvcG9zaXRpb24gPSBwcm9wb3NpdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL3ZvY2FiL2ltcGwvQW5kT3BlcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvdm9jYWIvaW1wbC9BbmRPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGFlOWI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvdm9jYWIvaW1wbC9BbmRPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC52b2NhYi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JUHJvcG9zaXRpb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgQW5kT3BlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdG9yIHsKLQotICAgIHB1YmxpYyBBbmRPcGVyYXRvcihJUHJvcG9zaXRpb24uLi4gYXJncyl7Ci0gICAgICAgIHN1cGVyKGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSl7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPHNpemUoKTsgaSsrKXsKLSAgICAgICAgICAgIElQcm9wb3NpdGlvbiBwID0gZ2V0KGkpOwotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBwLmV2YWwobm9kZSk7Ci0gICAgICAgICAgICBpZihyZXN1bHQgPT0gZmFsc2UpewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiYW5kIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvdm9jYWIvaW1wbC9GYWxzZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvdm9jYWIvaW1wbC9GYWxzZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhMTI1MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL3ZvY2FiL2ltcGwvRmFsc2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLnZvY2FiLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklQcm9wb3NpdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBGYWxzZUltcGwgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEZhbHNlSW1wbCBpbnN0YW5jZSA9IG5ldyBGYWxzZUltcGwoKTsKLQotICAgIHByaXZhdGUgRmFsc2VJbXBsKCl7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSl7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiZmFsc2UiOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRmFsc2VJbXBsIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gaW5zdGFuY2U7IAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC92b2NhYi9pbXBsL0Z1bmN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL3ZvY2FiL2ltcGwvRnVuY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyZjhiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL3ZvY2FiL2ltcGwvRnVuY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwudm9jYWIuaW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JUHJvcG9zaXRpb247Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBGdW5jdGlvbiBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIHByaXZhdGUgT2JqZWN0W10gYXJnczsKLQotICAgIHByaXZhdGUgTWV0aG9kIG1ldGhvZDsKLQotICAgIHB1YmxpYyBGdW5jdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nLi4uIGFyZ3MpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5hcmdzID0gbmV3IE9iamVjdFthcmdzLmxlbmd0aCsxXTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8YXJncy5sZW5ndGg7IGkrKyl7Ci0gICAgICAgICAgICB0aGlzLmFyZ3NbaSsxXSA9IGFyZ3NbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpewotICAgICAgICBpZiAobWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgIENsYXNzW10gY2xhc3NlcyA9IG5ldyBDbGFzc1thcmdzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjbGFzc2VzW2ldID0gYXJnc1tpXS5nZXRDbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBub2RlLmdldFRlcm1zKCkuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKGdldE5hbWUoKSwgY2xhc3Nlcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihtZXRob2QgIT0gbnVsbCl7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaXMuYXJnc1swXSA9IG5vZGU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChCb29sZWFuKW1ldGhvZC5pbnZva2Uobm9kZS5nZXRUZXJtcygpLCAoT2JqZWN0W10pYXJncyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL3Rocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlscyB0byBpbnZva2UgbWV0aG9kIFwiIitnZXROYW1lKCkrIlwiIGZvciAiK25vZGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvdm9jYWIvaW1wbC9JbXBseU9wZXJhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL3ZvY2FiL2ltcGwvSW1wbHlPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzJhNzMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvdm9jYWIvaW1wbC9JbXBseU9wZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLnZvY2FiLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSVByb3Bvc2l0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIEltcGx5T3BlcmF0b3IgZXh0ZW5kcyBPck9wZXJhdG9yIHsKLQotICAgIHB1YmxpYyBJbXBseU9wZXJhdG9yKElQcm9wb3NpdGlvbiBsZWZ0LCBJUHJvcG9zaXRpb24gcmlnaHQpIHsKLSAgICAgICAgc3VwZXIobmV3IE5vdE9wZXJhdG9yKGxlZnQpLCByaWdodCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gImltcGxpZXMiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvdm9jYWIvaW1wbC9Ob3RPcGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC92b2NhYi9pbXBsL05vdE9wZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzODRkYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC92b2NhYi9pbXBsL05vdE9wZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLnZvY2FiLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklQcm9wb3NpdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBOb3RPcGVyYXRvciBleHRlbmRzIEFic3RyYWN0T3BlcmF0b3IxIHsKLQotCi0gICAgcHVibGljIE5vdE9wZXJhdG9yKElQcm9wb3NpdGlvbiBwcm9wb3NpdGlvbikgewotICAgICAgICBzdXBlcihwcm9wb3NpdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKXsKLSAgICAgICAgcmV0dXJuICFnZXRQcm9wb3NpdGlvbigpLmV2YWwobm9kZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gIm5vdCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC92b2NhYi9pbXBsL09yT3BlcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvdm9jYWIvaW1wbC9Pck9wZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYTJhMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC92b2NhYi9pbXBsL09yT3BlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwudm9jYWIuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSVByb3Bvc2l0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIE9yT3BlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdG9yIHsKLQotICAgIHB1YmxpYyBPck9wZXJhdG9yKElQcm9wb3NpdGlvbi4uLiBhcmdzKXsKLSAgICAgICAgc3VwZXIoYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKXsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8c2l6ZSgpOyBpKyspewotICAgICAgICAgICAgSVByb3Bvc2l0aW9uIHAgPSBnZXQoaSk7Ci0gICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHAuZXZhbChub2RlKTsKLSAgICAgICAgICAgIGlmKHJlc3VsdCA9PSB0cnVlKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gIm9yIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvQWJzdHJhY3RUZXJtcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9BYnN0cmFjdFRlcm1zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMmZiMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9BYnN0cmFjdFRlcm1zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQWJzdHJhY3RUZXJtcyBpcyB0aGUgZGVmYXVsdCB0ZXJtIGRlZmluaXRpb24uIEFsbCBtZXRob2RzIHJldHVybiA8aT5mYWxzZTwvaT4uCi0gKiBFYWNoIGNsYXNzIGV4dGVuZHMgQWJzdHJhY3RUZXJtcyBzaG91bGQgaW1wbGVtZW50cyBtZXRob2RzIHdoaWNoIHVzZWQgaW4KLSAqIGl0c2VsZi4KLSAqIAotICogQHNlZSBWb2NhYnVsYXJ5Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRlcm1zIHsKLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc0NsaWNrYWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbGlja2FibGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBub2RlIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb25kaXRpb24KLQkgKiBAc2VlIFZvY2FidWxhcnkjaXNFZGl0YWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNoYXNDb250ZW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDb250ZW50KElFdmFsVGFyZ2V0IHRhcmdldCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldCB0aGUgbm9kZSB0byBiZSBldmFsdWF0ZWQKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29uZGl0aW9uCi0JICogQHNlZSBWb2NhYnVsYXJ5I2lzRW5hYmxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKElFdmFsVGFyZ2V0IHRhcmdldCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldCB0aGUgbm9kZSB0byBiZSBldmFsdWF0ZWQKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29uZGl0aW9uCi0JICogQHNlZSBWb2NhYnVsYXJ5I2lzSW5wdXRhYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lucHV0YWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc1NlbGVjdGFibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0YWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc0J1dHRvbigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCdXR0b24oSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBub2RlIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb25kaXRpb24KLQkgKiBAc2VlIFZvY2FidWxhcnkjaXNDaGVja2JveCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDaGVja2JveChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc0xhYmVsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsKElFdmFsVGFyZ2V0IHRhcmdldCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldCB0aGUgbm9kZSB0byBiZSBldmFsdWF0ZWQKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29uZGl0aW9uCi0JICogQHNlZSBWb2NhYnVsYXJ5I2lzTGluaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMaW5rKElFdmFsVGFyZ2V0IHRhcmdldCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldCB0aGUgbm9kZSB0byBiZSBldmFsdWF0ZWQKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29uZGl0aW9uCi0JICogQHNlZSBWb2NhYnVsYXJ5I2lzUmFkaW8oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmFkaW8oSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBub2RlIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb25kaXRpb24KLQkgKiBAc2VlIFZvY2FidWxhcnkjaXNDb21ib2JveCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21ib2JveChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc1N1Ym1pdCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdWJtaXQoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBub2RlIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb25kaXRpb24KLQkgKiBAc2VlIFZvY2FidWxhcnkjaXNUZXh0YXJlYSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUZXh0YXJlYShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc1RleHRib3goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGV4dGJveChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc1Bhc3N3b3JkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Bhc3N3b3JkKElFdmFsVGFyZ2V0IHRhcmdldCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldCB0aGUgbm9kZSB0byBiZSBldmFsdWF0ZWQKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29uZGl0aW9uCi0JICogQHNlZSBWb2NhYnVsYXJ5I2lzVmFsaWROb2RlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkTm9kZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc1Zpc2libGVOb2RlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGVOb2RlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldCB0aGUgbm9kZSB0byBiZSBldmFsdWF0ZWQKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29uZGl0aW9uCi0JICogQHNlZSBWb2NhYnVsYXJ5I2lzRW1iZWRkZWRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWRPYmplY3QoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBub2RlIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb25kaXRpb24KLQkgKiBAc2VlIFZvY2FidWxhcnkjaXNJbWFnZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbWFnZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc011bHRpbGluZUVkaXQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTXVsdGlsaW5lRWRpdChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBub2RlIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb25kaXRpb24KLQkgKiBAc2VlIFZvY2FidWxhcnkjaXNSZWR1Y2libGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVkdWNpYmxlKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc0Nvbm5lY3RhYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RhYmxlKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNmaW5kKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaW5kKFN0cmluZyBzdHIsIGJvb2xlYW4gZXhhY3QsIElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNzdGFydHNXaXRoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdGFydHNXaXRoKFN0cmluZyBzdHIsIGJvb2xlYW4gZXhhY3QsIElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc0hlYWRpbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSGVhZGluZyhpbnQgbGV2ZWwsIElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNub2RlTG9jYXRpb24oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG5vZGVMb2NhdGlvbihOb2RlIHJlZk5vZGUsIGJvb2xlYW4gYmFja3dhcmQsIElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc0hlYWRpbmdKdW1wUG9pbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSGVhZGluZ0p1bXBQb2ludChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBub2RlIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb25kaXRpb24KLQkgKiBAc2VlIFZvY2FidWxhcnkjaGFzUmVhZGluZ0NvbnRlbnQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1JlYWRpbmdDb250ZW50KElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc0xpc3RJdGVtSnVtcFBvaW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xpc3RJdGVtSnVtcFBvaW50KElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc0Jsb2NrSnVtcFBvaW50RigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCbG9ja0p1bXBQb2ludEYoSUV2YWxUYXJnZXQgbm9kZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldCB0aGUgbm9kZSB0byBiZSBldmFsdWF0ZWQKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29uZGl0aW9uCi0JICogQHNlZSBWb2NhYnVsYXJ5I2lzQmxvY2tKdW1wUG9pbnRCKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Jsb2NrSnVtcFBvaW50QihJRXZhbFRhcmdldCBub2RlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBub2RlIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb25kaXRpb24KLQkgKiBAc2VlIFZvY2FidWxhcnkjaXNGaWxlRWRpdCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaWxlRWRpdChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBub2RlIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb25kaXRpb24KLQkgKiBAc2VlIFZvY2FidWxhcnkjaXNDaGVja2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoSUV2YWxUYXJnZXQgbm9kZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldCB0aGUgbm9kZSB0byBiZSBldmFsdWF0ZWQKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29uZGl0aW9uCi0JICogQHNlZSBWb2NhYnVsYXJ5I2lzTGlzdEl0ZW0oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGlzdEl0ZW0oSUV2YWxUYXJnZXQgbm9kZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldCB0aGUgbm9kZSB0byBiZSBldmFsdWF0ZWQKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29uZGl0aW9uCi0JICogQHNlZSBWb2NhYnVsYXJ5I2lzTGlzdFRvcCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMaXN0VG9wKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc1NlbGVjdE9wdGlvbigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZWxlY3RPcHRpb24oSUV2YWxUYXJnZXQgbm9kZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldCB0aGUgbm9kZSB0byBiZSBldmFsdWF0ZWQKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29uZGl0aW9uCi0JICogQHNlZSBWb2NhYnVsYXJ5I2lzVmlzaXRlZExpbmsoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmlzaXRlZExpbmsoSUV2YWxUYXJnZXQgbm9kZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldCB0aGUgbm9kZSB0byBiZSBldmFsdWF0ZWQKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29uZGl0aW9uCi0JICogQHNlZSBWb2NhYnVsYXJ5I2lzTXVsdGlTZWxlY3RhYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpU2VsZWN0YWJsZShJRXZhbFRhcmdldCBub2RlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBub2RlIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb25kaXRpb24KLQkgKiBAc2VlIFZvY2FidWxhcnkjaXNBY2Nlc3NLZXkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWNjZXNzS2V5KGNoYXIga2V5LCBJRXZhbFRhcmdldCBub2RlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBub2RlIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb25kaXRpb24KLQkgKiBAc2VlIFZvY2FidWxhcnkjaXNNZWRpYSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZWRpYShJRXZhbFRhcmdldCBub2RlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBub2RlIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb25kaXRpb24KLQkgKiBAc2VlIFZvY2FidWxhcnkjaXNGbGFzaFRvcE5vZGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmxhc2hUb3BOb2RlKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc0ZsYXNoTGFzdE5vZGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmxhc2hMYXN0Tm9kZShJRXZhbFRhcmdldCBub2RlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBub2RlIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb25kaXRpb24KLQkgKiBAc2VlIFZvY2FidWxhcnkjaXNNU0FBRmxhc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTVNBQUZsYXNoKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc1JlYWNoYWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFjaGFibGUoSUV2YWxUYXJnZXQgbm9kZSwgTm9kZSB0YXJnZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG5vZGUgdG8gYmUgZXZhbHVhdGVkCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBub2RlIG1hdGNoZXMgdGhlIGNvbmRpdGlvbgotCSAqIEBzZWUgVm9jYWJ1bGFyeSNpc0FsdGVyYWJsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbHRlcmFibGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvRGVsZWdhdGlvblRlcm1zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL0RlbGVnYXRpb25UZXJtcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWE4YjNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvRGVsZWdhdGlvblRlcm1zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBkZWxlZ2F0ZXMgdGhlIGV2YWx1YXRpb24gdG8gdGhlIGRlbGVnYXRpb24gdGFyZ2V0LgotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGlvblRlcm1zIGV4dGVuZHMgQWJzdHJhY3RUZXJtcyB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIElFdmFsVGFyZ2V0IGRlbGVnYXRpb25UYXJnZXQ7Ci0KLSAgICAvL3ByaXZhdGUgQWJzdHJhY3RUZXJtcyBuZXh0Q2FuZGlkYXRlOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRlbGVnYXRpb25UYXJnZXQgdGhlIGRlbGVnYXRpb24gdGFyZ2V0LgotICAgICAqLwotICAgIHB1YmxpYyBEZWxlZ2F0aW9uVGVybXMoSUV2YWxUYXJnZXQgZGVsZWdhdGlvblRhcmdldCkgewotICAgICAgICB0aGlzLmRlbGVnYXRpb25UYXJnZXQgPSBkZWxlZ2F0aW9uVGFyZ2V0OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2lzQ2xpY2thYmxlKG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NsaWNrYWJsZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0NsaWNrYWJsZShkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtcyNpc0VkaXRhYmxlKG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzRWRpdGFibGUoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaGFzQ29udGVudChvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29udGVudChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5oYXNDb250ZW50KGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2hhc1JlYWRpbmdDb250ZW50KG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZWFkaW5nQ29udGVudChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5oYXNSZWFkaW5nQ29udGVudChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtcyNpc0VuYWJsZWQob3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0VuYWJsZWQoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNJbnB1dGFibGUob3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5wdXRhYmxlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzSW5wdXRhYmxlKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2lzU2VsZWN0YWJsZShvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RhYmxlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzU2VsZWN0YWJsZShkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtcyNpc011bHRpU2VsZWN0YWJsZShvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNNdWx0aVNlbGVjdGFibGUoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNNdWx0aVNlbGVjdGFibGUoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNCdXR0b24ob3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQnV0dG9uKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzQnV0dG9uKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2lzTGlzdEl0ZW0ob3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdEl0ZW0oSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNMaXN0SXRlbShkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtcyNpc0xpc3RUb3Aob3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdFRvcChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0xpc3RUb3AoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNDaGVja2JveChvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2JveChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0NoZWNrYm94KGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2lzQ2hlY2tlZChvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzQ2hlY2tlZChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNMYWJlbChvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0xhYmVsKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2lzTGluayhvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaW5rKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzTGluayhkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtcyNpc1Zpc2l0ZWRMaW5rKG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2l0ZWRMaW5rKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzVmlzaXRlZExpbmsoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNSYWRpbyhvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNSYWRpbyhJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc1JhZGlvKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2lzQ29tYm9ib3gob3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29tYm9ib3goSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNDb21ib2JveChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtcyNpc1N1Ym1pdChvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdWJtaXQoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNTdWJtaXQoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNGaWxlRWRpdChvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNGaWxlRWRpdChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0ZpbGVFZGl0KGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2lzVGV4dGFyZWEob3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVGV4dGFyZWEoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNUZXh0YXJlYShkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtcyNpc1RleHRib3gob3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVGV4dGJveChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc1RleHRib3goZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNQYXNzd29yZChvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXNzd29yZChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc1Bhc3N3b3JkKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2lzVmFsaWROb2RlKG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkTm9kZShJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc1ZhbGlkTm9kZShkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtcyNpc1Zpc2libGVOb2RlKG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGVOb2RlKElFdmFsVGFyZ2V0IHRhcmdldCkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzVmlzaWJsZU5vZGUoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNFbWJlZGRlZE9iamVjdChvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbWJlZGRlZE9iamVjdChJRXZhbFRhcmdldCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0VtYmVkZGVkT2JqZWN0KGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2lzSW1hZ2Uob3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzSW1hZ2UoSUV2YWxUYXJnZXQgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNJbWFnZShkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtcyNpc011bHRpbGluZUVkaXQob3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTXVsdGlsaW5lRWRpdChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNNdWx0aWxpbmVFZGl0KGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2lzU2VsZWN0T3B0aW9uKG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdE9wdGlvbihJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNTZWxlY3RPcHRpb24oZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNSZWR1Y2libGUob3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVkdWNpYmxlKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc1JlZHVjaWJsZShkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtcyNpc0Nvbm5lY3RhYmxlKG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RhYmxlKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0Nvbm5lY3RhYmxlKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2ZpbmQoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbiwgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGZpbmQoU3RyaW5nIHN0ciwgYm9vbGVhbiBleGFjdCwgSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmZpbmQoc3RyLCBleGFjdCwgZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjc3RhcnRzV2l0aChqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuLCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc3RhcnRzV2l0aChTdHJpbmcgc3RyLCBib29sZWFuIGV4YWN0LCBJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuc3RhcnRzV2l0aChzdHIsIGV4YWN0LCBkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtcyNpc0hlYWRpbmcoaW50LCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNIZWFkaW5nKGludCBsZXZlbCwgSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzSGVhZGluZyhsZXZlbCwgZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNIZWFkaW5nSnVtcFBvaW50KG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hlYWRpbmdKdW1wUG9pbnQoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzSGVhZGluZ0p1bXBQb2ludChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtcyNub2RlTG9jYXRpb24ob3JnLnczYy5kb20uTm9kZSwgYm9vbGVhbiwgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG5vZGVMb2NhdGlvbihOb2RlIHJlZk5vZGUsIGJvb2xlYW4gYmFja3dhcmQsIElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5ub2RlTG9jYXRpb24ocmVmTm9kZSwgYmFja3dhcmQsIGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2lzQWNjZXNzS2V5KGNoYXIsIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc0tleShjaGFyIGtleSwgSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzQWNjZXNzS2V5KGtleSwgZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNMaXN0SXRlbUp1bXBQb2ludChvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaXN0SXRlbUp1bXBQb2ludChJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNMaXN0SXRlbUp1bXBQb2ludChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtcyNpc0Jsb2NrSnVtcFBvaW50RihvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNCbG9ja0p1bXBQb2ludEYoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzQmxvY2tKdW1wUG9pbnRGKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2lzQmxvY2tKdW1wUG9pbnRCKG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5JRXZhbFRhcmdldCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jsb2NrSnVtcFBvaW50QihJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNCbG9ja0p1bXBQb2ludEIoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNNZWRpYShvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNNZWRpYShJRXZhbFRhcmdldCBub2RlKSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNNZWRpYShkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuQWJzdHJhY3RUZXJtcyNpc0ZsYXNoVG9wTm9kZShvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNGbGFzaFRvcE5vZGUoSUV2YWxUYXJnZXQgbm9kZSkgewotICAgICAgICBpZiAoZGVsZWdhdGlvblRhcmdldCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzRmxhc2hUb3BOb2RlKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5BYnN0cmFjdFRlcm1zI2lzRmxhc2hMYXN0Tm9kZShvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuSUV2YWxUYXJnZXQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNGbGFzaExhc3ROb2RlKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc0ZsYXNoTGFzdE5vZGUoZGVsZWdhdGlvblRhcmdldCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNNU0FBRmxhc2gob3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTVNBQUZsYXNoKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRpb25UYXJnZXQuZ2V0VGVybXMoKS5pc01TQUFGbGFzaChkZWxlZ2F0aW9uVGFyZ2V0KTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNSZWFjaGFibGUob3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0LCBvcmcudzNjLmRvbS5Ob2RlKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVhY2hhYmxlKElFdmFsVGFyZ2V0IG5vZGUsIE5vZGUgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChkZWxlZ2F0aW9uVGFyZ2V0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0aW9uVGFyZ2V0LmdldFRlcm1zKCkuaXNSZWFjaGFibGUoZGVsZWdhdGlvblRhcmdldCwgdGFyZ2V0KTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLkFic3RyYWN0VGVybXMjaXNBbHRlcmFibGUob3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLklFdmFsVGFyZ2V0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWx0ZXJhYmxlKElFdmFsVGFyZ2V0IG5vZGUpIHsKLSAgICAgICAgaWYgKGRlbGVnYXRpb25UYXJnZXQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gZGVsZWdhdGlvblRhcmdldC5nZXRUZXJtcygpLmlzQWx0ZXJhYmxlKGRlbGVnYXRpb25UYXJnZXQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9JRXZhbFRhcmdldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9JRXZhbFRhcmdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjU1YTdkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvSUV2YWxUYXJnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWI7Ci0KLS8qKgotICogSUV2YWxUYXJnZXQgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZWxlbWVudCBvciBub2RlIHRvIGJlCi0gKiBjaGVja2VkIHRocm91Z2ggdGhlIFZvY2FidWxhcnkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUV2YWxUYXJnZXQgewotCS8qKgotCSAqIEByZXR1cm4gdGhlIGFzc29jaWF0ZWQgdGVybS4KLQkgKi8KLQlBYnN0cmFjdFRlcm1zIGdldFRlcm1zKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL0lPcGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9JT3BlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwMmRhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL0lPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYjsKLQotLyoqCi0gKiBJT3BlcmF0b3IgaW50ZXJmYWNlIGRlZmluZXMgdGhlIG1ldGhvZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIG9wZXJhdG9yCi0gKiBiZXR3ZWVuIHByb3Bvc2l0aW9ucy4gRm9yIGV4YW1wbGUsICJhbmQgb3BlcmF0b3IiIGFuZCAib3Igb3BlcmF0b3IiLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPcGVyYXRvciBleHRlbmRzIElQcm9wb3NpdGlvbiB7Ci0JLyoqCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYXJndW1lbnRzIGZvciB0aGUgb3BlcmF0b3IuCi0JICovCi0JaW50IHNpemUoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBwcm9wb3NpdGlvbi4KLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBzcGVjaWZpZWQgYnkgdGhlIGluZGV4LgotCSAqLwotCUlQcm9wb3NpdGlvbiBnZXQoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEFkZCBhIHByb3Bvc2l0aW9uIHRvIHRoZSBhcmd1bWVudHMgb2YgdGhpcyBvcGVyYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcAotCSAqICAgICAgICAgICAgdGhlIHByb3Bvc2l0aW9uIHRvIGJlIGFkZGVkLgotCSAqLwotCXZvaWQgYWRkKElQcm9wb3NpdGlvbiBwcm9wKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvSU9wZXJhdG9yMS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9JT3BlcmF0b3IxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMWVmN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9JT3BlcmF0b3IxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiOwotCi0KLS8qKgotICogSU9wZXJhdG9yMSBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgb3BlcmF0b3IKLSAqIHdoaWNoIGhhcyBhbiBhcmd1bWVudC4gRm9yIGV4YW1wbGUsICJub3Qgb3BlcmF0b3IiLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPcGVyYXRvcjEgZXh0ZW5kcyBJUHJvcG9zaXRpb257Ci0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgcHJvcG9zaXRpb24gdG8gYmUgdXNlZCBmb3IgYXJndW1lbnQgb2YgdGhlIG9wZXJhdG9yLgotICAgICAqLwotICAgIElQcm9wb3NpdGlvbiBnZXRQcm9wb3NpdGlvbigpOwotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBwcm9wIHRoZSBwcm9wb3NpdGlvbiB0byBiZSB1c2VkIGZvciBhcmd1bWVudCBvZiB0aGUgb3BlcmF0b3IuCi0gICAgICovCi0gICAgdm9pZCBzZXRQcm9wb3NpdGlvbihJUHJvcG9zaXRpb24gcHJvcCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL0lQcm9wb3NpdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi9JUHJvcG9zaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4ZjRlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL0lQcm9wb3NpdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYjsKLQotLyoqCi0gKiBJUHJvcG9zaXRpb24gaW50ZXJmYWNlIHRoZSBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSByZXByZXNlbnRhdGlvbiBvZgotICogYSBwcm9wb3NpdGlvbi4gSXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlIGluIGV2YWx1YXRpbmcuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3Bvc2l0aW9uIHsKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcm9wb3NpdGlvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCB0byBiZSBldmFsdWF0ZWQuCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSB0YXJnZXQgaXMgbWF0Y2hlZCB3aXRoIHRoZSBwcm9wb3NpdGlvbi4KLQkgKi8KLQlib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgdGFyZ2V0KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvVm9jYWJQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvVm9jYWJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI0OTYyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL1ZvY2FiUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgVm9jYWJQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYiI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgVm9jYWJQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBWb2NhYlBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCUBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZvY2FiUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL1ZvY2FidWxhcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvVm9jYWJ1bGFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzZmYjJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvVm9jYWJ1bGFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC52b2NhYi5pbXBsLkFuZE9wZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC52b2NhYi5pbXBsLkZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC52b2NhYi5pbXBsLk9yT3BlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLnVpLnByZWZlcmVuY2VzLlZvY2FiUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFZvY2FidWxhcnkgdHJlYXRzIHRoZSBtZWFuaW5nIG9mIGluc3RhbmNlcyBvZiB7QGxpbmsgSUV2YWxUYXJnZXR9IGJ5IHVzaW5nCi0gKiB7QGxpbmsgSVByb3Bvc2l0aW9ufS4ge0BsaW5rIElQcm9wb3NpdGlvbn0gcmVwcmVzZW50cyBhIHF1ZXN0aW9uIHdoZXRoZXIgYQotICoge0BsaW5rIElFdmFsVGFyZ2V0fSBpbnN0YW5jZSBpcyBtYXRjaGVkIHdpdGggdGhlIHByb3Bvc2l0aW9uIG9yIG5vdC4gQWN0dWFsCi0gKiBtZWFuaW5nIGlzIHByb3ZpZGVkIGJ5IHRoZSB0ZXJtIGltcGxlbWVudGF0aW9uIHdoaWNoIGV4dGVuZHMKLSAqIHtAbGluayBBYnN0cmFjdFRlcm1zfS4gRWFjaCBpbnN0YW5jZSBvZiB0aGUge0BsaW5rIElFdmFsVGFyZ2V0fSBpcwotICogYXNzb2NpYXRlZCB3aXRoIGEgdGVybSBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogVGhlIGZvbGxvd2luZyBpcyB0aGUgZmxvdyB0byBnZXQgdGhlIG1lYW5pbmcgb2YgdGhlIHtAbGluayBJRXZhbFRhcmdldH0KLSAqIGluc3RhbmNlLgotICogCi0gKiA8cHJlPgotICogIDEuIGdldCBhbiB7QGxpbmsgSVByb3Bvc2l0aW9ufSBmcm9tIFZvY2FidWxhcnkuCi0gKiAgMi4gY2FsbCB7QGxpbmsgSVByb3Bvc2l0aW9uI2V2YWwoSUV2YWxUYXJnZXQpfSBtZXRob2Qgd2l0aCBhbiB7QGxpbmsgSUV2YWxUYXJnZXR9LgotICogIDMuIHtAbGluayBJUHJvcG9zaXRpb24jZXZhbChJRXZhbFRhcmdldCl9IG1ldGhvZCBnZXRzIHRoZSBhc3NvY2lhdGVkIHRlcm0uCi0gKiAgNC4ge0BsaW5rIElQcm9wb3NpdGlvbiNldmFsKElFdmFsVGFyZ2V0KX0gbWV0aG9kIGNhbGxzIHRoZSBtZXRob2QgY29ycmVzcG9uZGluZyB0byBpdHNlbGYgd2l0aCB0aGUge0BsaW5rIElFdmFsVGFyZ2V0fS4KLSAqICAgICBGb3IgZXhhbXBsZSwge0BsaW5rIFZvY2FidWxhcnkjaXNDbGlja2FibGUoKX0gY2FsbHMge0BsaW5rIEFic3RyYWN0VGVybXMjaXNDbGlja2FibGUoSUV2YWxUYXJnZXQpfS4KLSAqIDwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgVm9jYWJ1bGFyeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIElQcm9wb3NpdGlvbj4gcHJvcE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVByb3Bvc2l0aW9uPigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNDbGlja2FibGUgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkuaXNDbGlja2FibGUobm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzQ2xpY2thYmxlIjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElzSW5wdXRhYmxlIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLQkJcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzSW5wdXRhYmxlKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJpc0lucHV0YWJsZSI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJc1NlbGVjdGFibGUgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkuaXNTZWxlY3RhYmxlKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJpc1NlbGVjdGFibGUiOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNNdWx0aVNlbGVjdGFibGUgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkuaXNNdWx0aVNlbGVjdGFibGUobm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzTXVsdGlTZWxlY3RhYmxlIjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElzVmFsaWROb2RlIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLQkJcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzVmFsaWROb2RlKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJpc1ZhbGlkTm9kZSI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBIYXNDb250ZW50IGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLQkJcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXRUZXJtcygpLmhhc0NvbnRlbnQobm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImhhc0NvbnRlbnQiOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGFzUmVhZGluZ0NvbnRlbnQgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkuaGFzUmVhZGluZ0NvbnRlbnQobm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImhhc1JlYWRpbmdDb250ZW50IjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElzVmlzaWJsZU5vZGUgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkuaXNWaXNpYmxlTm9kZShub2RlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiAiaXNWaXNpYmxlTm9kZSI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0VtYmVkZGVkT2JqZWN0IGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLQkJcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzRW1iZWRkZWRPYmplY3Qobm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzRW1iZWRkZWRPYmplY3QiOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNSZWR1Y2libGUgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkuaXNSZWR1Y2libGUobm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzUmVkdWNpYmxlIjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElzQmxvY2tKdW1wUG9pbnRGIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLQkJcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzQmxvY2tKdW1wUG9pbnRGKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJpc0Jsb2NrSnVtcFBvaW50RiI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0Jsb2NrSnVtcFBvaW50QiBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0JCXB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotCQkJcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0Jsb2NrSnVtcFBvaW50Qihub2RlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiAiaXNCbG9ja0p1bXBQb2ludEIiOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNNZWRpYSBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0JCXB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotCQkJcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc01lZGlhKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJpc01lZGlhIjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElzUmVhY2hhYmxlIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLQkJcHJpdmF0ZSBOb2RlIHRhcmdldDsKLQotCQlwdWJsaWMgSXNSZWFjaGFibGUoTm9kZSB0YXJnZXQpIHsKLQkJCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzUmVhY2hhYmxlKG5vZGUsIHRhcmdldCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzUmVhY2hhYmxlIjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElzQ29ubmVjdGFibGUgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkuaXNDb25uZWN0YWJsZShub2RlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiAiaXNDb25uZWN0YWJsZSI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0FsdGVyYWJsZSBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7IC8vIFRPRE8gYXdlc29tZQotCQkvLyBtZXRob2QKLQkJLy8gbmFtZS4uLiA6KAotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkuaXNBbHRlcmFibGUobm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzQWx0ZXJhYmxlIjsKLQkJfQotCX0KLQotCXN0YXRpYyB7Ci0JCVdpZGdldHNWb2NhYnVsYXJ5LmluaXRpYWxpemUoKTsKLQotCQlhZGQoIkNsaWNrYWJsZSIsIG5ldyBJc0NsaWNrYWJsZSgpKTsKLQkJYWRkKCJDbGlja2FibGUiLCBvcigiQnV0dG9uIiwgIkNoZWNrYm94IiwgIlN1Ym1pdCIsICJMaW5rIikpOwotCQlhZGQoIklucHV0YWJsZSIsIG5ldyBJc0lucHV0YWJsZSgpKTsKLQkJYWRkKCJJbnB1dGFibGUiLCBvcigiVGV4dGJveCIsICJUZXh0YXJlYSIsICJQYXNzd29yZCIpKTsKLQkJYWRkKCJTZWxlY3RhYmxlIiwgbmV3IElzU2VsZWN0YWJsZSgpKTsKLQkJYWRkKCJNdWx0aVNlbGVjdGFibGUiLCBuZXcgSXNNdWx0aVNlbGVjdGFibGUoKSk7Ci0JCWFkZCgiU2VsZWN0YWJsZSIsIG9yKCJDb21ib2JveCIsICJSYWRpbyIpKTsKLQkJYWRkKCJFZGl0YWJsZSIsIG9yKCJJbnB1dGFibGUiLCAiU2VsZWN0YWJsZSIsICJNdWx0aVNlbGVjdGFibGUiKSk7Ci0JCWFkZCgiVmFsaWROb2RlIiwgbmV3IElzVmFsaWROb2RlKCkpOwotCQlhZGQoIkhhc0NvbnRlbnQiLCBuZXcgSGFzQ29udGVudCgpKTsKLQkJYWRkKCJIYXNSZWFkaW5nQ29udGVudCIsIG5ldyBIYXNSZWFkaW5nQ29udGVudCgpKTsKLQkJYWRkKCJWaXNpYmxlTm9kZSIsIG5ldyBJc1Zpc2libGVOb2RlKCkpOwotCQlhZGQoIkVtYmVkZGVkT2JqZWN0IiwgbmV3IElzRW1iZWRkZWRPYmplY3QoKSk7Ci0JCWFkZCgiUmVkdWNpYmxlIiwgbmV3IElzUmVkdWNpYmxlKCkpOwotCQlhZGQoIkJsb2NrSnVtcFBvaW50RiIsIG5ldyBJc0Jsb2NrSnVtcFBvaW50RigpKTsKLQkJYWRkKCJCbG9ja0p1bXBQb2ludEIiLCBuZXcgSXNCbG9ja0p1bXBQb2ludEIoKSk7Ci0JCWFkZCgiTWVkaWEiLCBuZXcgSXNNZWRpYSgpKTsKLQkJYWRkKCJDb25uZWN0YWJsZSIsIG5ldyBJc0Nvbm5lY3RhYmxlKCkpOwotCQlhZGQoIkFsdGVyYWJsZSIsIG5ldyBJc0FsdGVyYWJsZSgpKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBhZGRGdW5jKFN0cmluZyBuYW1lLCBTdHJpbmcgZnVuY05hbWUsIFN0cmluZy4uLiBhcmdzKSB7Ci0JCWFkZChuYW1lLCBuZXcgRnVuY3Rpb24oZnVuY05hbWUsIGFyZ3MpKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBhZGQoU3RyaW5nIG5hbWUsIElQcm9wb3NpdGlvbiBwcm9wKSB7Ci0JCUlQcm9wb3NpdGlvbiBleGlzdFByb3AgPSBwcm9wTWFwLmdldChuYW1lKTsKLQkJaWYgKGV4aXN0UHJvcCA9PSBudWxsKSB7Ci0JCQlwcm9wTWFwLnB1dChuYW1lLCBwcm9wKTsKLQkJfSBlbHNlIHsKLQkJCUlQcm9wb3NpdGlvbiBuZXdQcm9wID0gbmV3IE9yT3BlcmF0b3IoZXhpc3RQcm9wLCBwcm9wKTsKLQkJCXByb3BNYXAucHV0KG5hbWUsIG5ld1Byb3ApOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVByb3Bvc2l0aW9uIG9yKFN0cmluZy4uLiBhcmdzKSB7Ci0JCU9yT3BlcmF0b3IgcmV0ID0gbmV3IE9yT3BlcmF0b3IoKTsKLQkJZm9yIChTdHJpbmcgcyA6IGFyZ3MpIHsKLQkJCXJldC5hZGQoZ2V0KHMpKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8vIHByaXZhdGUgc3RhdGljIElQcm9wb3NpdGlvbiBhbmQoU3RyaW5nLi4uIGFyZ3MpIHsKLQkvLyBBbmRPcGVyYXRvciByZXQgPSBuZXcgQW5kT3BlcmF0b3IoKTsKLQkvLyBmb3IgKFN0cmluZyBzIDogYXJncykgewotCS8vIHJldC5hZGQoZ2V0KHMpKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIHJldDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgdGhlIGluc3RhbmNlcyBvZiBJUHJvcHNpdGlvbiB0byBiZSBjb25jYXRlbmF0ZWQgYnkgIk9SIgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbG9naWNhbCBPUiBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBvcihJUHJvcG9zaXRpb24uLi4gYXJncykgewotCQlPck9wZXJhdG9yIHJldCA9IG5ldyBPck9wZXJhdG9yKCk7Ci0JCWZvciAoSVByb3Bvc2l0aW9uIGlwIDogYXJncykgewotCQkJcmV0LmFkZChpcCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgdGhlIGluc3RhbmNlcyBvZiBJUHJvcHNpdGlvbiB0byBiZSBjb25jYXRlbmF0ZWQgYnkgIkFORCIKLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxvZ2ljYWwgQU5EIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGFuZChJUHJvcG9zaXRpb24uLi4gYXJncykgewotCQlBbmRPcGVyYXRvciByZXQgPSBuZXcgQW5kT3BlcmF0b3IoKTsKLQkJZm9yIChJUHJvcG9zaXRpb24gaXAgOiBhcmdzKSB7Ci0JCQlyZXQuYWRkKGlwKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZpbmRQcm9wb3NpdGlvbiBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHN0cjsKLQotCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZXhhY3Q7Ci0KLQkJcHVibGljIEZpbmRQcm9wb3NpdGlvbihTdHJpbmcgc3RyLCBib29sZWFuIGV4YWN0KSB7Ci0JCQl0aGlzLnN0ciA9IHN0cjsKLQkJCXRoaXMuZXhhY3QgPSBleGFjdDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotCQkJcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5maW5kKHN0ciwgZXhhY3QsIG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJmaW5kKCIgKyBzdHIgKyAiKSI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGFydHNXaXRoUHJvcG9zaXRpb24gaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBzdHI7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGV4YWN0OwotCi0JCXB1YmxpYyBTdGFydHNXaXRoUHJvcG9zaXRpb24oU3RyaW5nIHN0ciwgYm9vbGVhbiBleGFjdCkgewotCQkJdGhpcy5zdHIgPSBzdHI7Ci0JCQl0aGlzLmV4YWN0ID0gZXhhY3Q7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkuc3RhcnRzV2l0aChzdHIsIGV4YWN0LCBub2RlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiAic3RhcnRzV2l0aCgiICsgc3RyICsgIikiOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZUxvY2F0aW9uUHJvcG9zaXRpb24gaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotCQlwcml2YXRlIGZpbmFsIE5vZGUgcmVmTm9kZTsKLQkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGJhY2t3YXJkOwotCi0JCXB1YmxpYyBOb2RlTG9jYXRpb25Qcm9wb3NpdGlvbihOb2RlIHJlZk5vZGUsIGJvb2xlYW4gYmFja3dhcmQpIHsKLQkJCXRoaXMucmVmTm9kZSA9IHJlZk5vZGU7Ci0JCQl0aGlzLmJhY2t3YXJkID0gYmFja3dhcmQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkubm9kZUxvY2F0aW9uKHJlZk5vZGUsIGJhY2t3YXJkLCBub2RlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiAibm9kZUxvY2F0aW9uKCIgKyByZWZOb2RlICsgIjoiICsgYmFja3dhcmQgKyAiKSI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0FjY2Vzc0tleSBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0JCXByaXZhdGUgZmluYWwgY2hhciBrZXk7Ci0KLQkJcHVibGljIElzQWNjZXNzS2V5KGNoYXIga2V5KSB7Ci0JCQl0aGlzLmtleSA9IGtleTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotCQkJcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0FjY2Vzc0tleShrZXksIG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJhY2Nlc3NLZXkoIiArIGtleSArICIpIjsKLQkJfQotCX0KLQotCS8vIHB1YmxpYyBpbnRlcmZhY2UKLQotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGdldChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gcHJvcE1hcC5nZXQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBpcyBjbGlja2FibGUgb3Igbm90Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNDbGlja2FibGUoKSB7Ci0JCXJldHVybiBnZXQoIkNsaWNrYWJsZSIpOwotCX0KLQotCS8qKgotCSAqIEhhdmluZyBjb250ZW50IG1lYW5zIHRoYXQgdGhlIGVsZW1lbnQgaGFzIGNvbnRlbnQgdG8gYmUgZGlzcGxheWVkIGluIHRoZQotCSAqIGFpQnJvd3NlcgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcG9zaXRpb259IHdoaWNoIGV2YWx1YXRlcyB3aGV0aGVyIGEKLQkgKiAgICAgICAgIG5vZGUgaGFzIGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBoYXNDb250ZW50KCkgewotCQlyZXR1cm4gZ2V0KCJIYXNDb250ZW50Iik7Ci0JfQotCi0JLyoqCi0JICogdGV4dCBib3gsIHRleHQgYXJlYSwgcGFzc3dvcmQsIGNvbWJvIGJveCwgY2hlY2sgYm94LCByYWRpbyBidXR0b24sIGFuZCBzbyBvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGNhbiBiZSBlZGl0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGdldCgiRWRpdGFibGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGhhcyBzb21lIG9wdGlvbnMgdG8gYmUgc2VsZWN0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNTZWxlY3RhYmxlKCkgewotCQlyZXR1cm4gZ2V0KCJTZWxlY3RhYmxlIik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBpcyBlbWJlZGRlZCBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNFbWJlZGRlZE9iamVjdCgpIHsKLQkJcmV0dXJuIGdldCgiRW1iZWRkZWRPYmplY3QiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGlzIHZhbGlkIGZvciBhaUJyb3dzZXIncyB0cmVlIGl0ZW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNWYWxpZE5vZGUoKSB7Ci0JCXJldHVybiBnZXQoIlZhbGlkTm9kZSIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcG9zaXRpb259IHdoaWNoIGV2YWx1YXRlcyB3aGV0aGVyIGEKLQkgKiAgICAgICAgIG5vZGUgaXMgdmlzaWJsZSBvciBub3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNWaXNpYmxlTm9kZSgpIHsKLQkJcmV0dXJuIGdldCgiVmlzaWJsZU5vZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXh0IGJveCwgdGV4dCBhcmVhLCBwYXNzd29yZAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcG9zaXRpb259IHdoaWNoIGV2YWx1YXRlcyB3aGV0aGVyIGEKLQkgKiAgICAgICAgIG5vZGUgY2FuIGJlIGlucHV0IHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNJbnB1dGFibGUoKSB7Ci0JCXJldHVybiBnZXQoIklucHV0YWJsZSIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcG9zaXRpb259IHdoaWNoIGV2YWx1YXRlcyB3aGV0aGVyIGEKLQkgKiAgICAgICAgIG5vZGUgaXMgYnV0dG9uIG9yIG5vdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0J1dHRvbigpIHsKLQkJcmV0dXJuIGdldCgiQnV0dG9uIik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBpcyBsaXN0IGl0ZW0gb3Igbm90Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNMaXN0SXRlbSgpIHsKLQkJcmV0dXJuIGdldCgiTGlzdEl0ZW0iKTsKLQl9Ci0KLQkvKioKLQkgKiBPTCwgVUwsIERMIHRhZ3MKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGlzIGxpc3QgZWxlbWVudCBvciBub3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0xpc3RUb3AoKSB7Ci0JCXJldHVybiBnZXQoIkxpc3RUb3AiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGlzIGNoZWNrIGJveCBvciBub3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0NoZWNrYm94KCkgewotCQlyZXR1cm4gZ2V0KCJDaGVja2JveCIpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGlzIGNoZWNrZWQgb3Igbm90Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNDaGVja2VkKCkgewotCQlyZXR1cm4gZ2V0KCJDaGVja2VkIik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBpcyBsYWJlbCBlbGVtZW50IG9yIG5vdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzTGFiZWwoKSB7Ci0JCXJldHVybiBnZXQoIkxhYmVsIik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBpcyBhbmNob3IgZWxlbWVudCBvciBub3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0xpbmsoKSB7Ci0JCXJldHVybiBnZXQoIkxpbmsiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGlzIHZpc2l0ZWQgbGluayBvciBub3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc1Zpc2l0ZWRMaW5rKCkgewotCQlyZXR1cm4gZ2V0KCJWaXNpdGVkTGluayIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcG9zaXRpb259IHdoaWNoIGV2YWx1YXRlcyB3aGV0aGVyIGEKLQkgKiAgICAgICAgIG5vZGUgaXMgcmFkaW8gYnV0dG9uIG9yIG5vdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzUmFkaW8oKSB7Ci0JCXJldHVybiBnZXQoIlJhZGlvIik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBpcyBzdWJtaXQgYnV0dG9uIG9yIG5vdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzU3VibWl0KCkgewotCQlyZXR1cm4gZ2V0KCJTdWJtaXQiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGlzIGZpbGUgZWRpdCBvciBub3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0ZpbGVFZGl0KCkgewotCQlyZXR1cm4gZ2V0KCJGaWxlRWRpdCIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcG9zaXRpb259IHdoaWNoIGV2YWx1YXRlcyB3aGV0aGVyIGEKLQkgKiAgICAgICAgIG5vZGUgaXMgY29tYm8gYm94IG9yIG5vdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzQ29tYm9ib3goKSB7Ci0JCXJldHVybiBnZXQoIkNvbWJvYm94Iik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBpcyB0ZXh0IGFyZWEgb3Igbm90Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNUZXh0YXJlYSgpIHsKLQkJcmV0dXJuIGdldCgiVGV4dGFyZWEiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGlzIHRleHQgYm94IG9yIG5vdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzVGV4dGJveCgpIHsKLQkJcmV0dXJuIGdldCgiVGV4dGJveCIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcG9zaXRpb259IHdoaWNoIGV2YWx1YXRlcyB3aGV0aGVyIGEKLQkgKiAgICAgICAgIG5vZGUgaXMgcGFzc3dvcmQgb3Igbm90Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNQYXNzd29yZCgpIHsKLQkJcmV0dXJuIGdldCgiUGFzc3dvcmQiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGlzIG9wdGlvbiBvZiBzZWxlY3QgZm9ybSBvciBub3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc1NlbGVjdE9wdGlvbigpIHsKLQkJcmV0dXJuIGdldCgiU2VsZWN0T3B0aW9uIik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBpcyBpbWFnZSBlbGVtZW50IG9yIG5vdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzSW1hZ2UoKSB7Ci0JCXJldHVybiBnZXQoIkltYWdlIik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBpcyB0ZXh0IGVkaXQgY29udHJvbCBoYXZpbmcgbXVsdGlwbGUgbGluZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc011bHRpbGluZUVkaXQoKSB7Ci0JCXJldHVybiBnZXQoIk11bHRpbGluZUVkaXQiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGNhbiBiZSBvbWl0dGVkIHRvIGNyZWF0ZSBzaW1wbGlmaWVkIHRyZWUgYnkgZmVubmVjIGF1dG8gdHJhbnNsYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzUmVkdWNpYmxlKCkgewotCQlyZXR1cm4gZ2V0KCJSZWR1Y2libGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGlzIGhlYWRpbmcgZWxlbWVudCBvciBub3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0hlYWRpbmcoKSB7Ci0JCXJldHVybiBnZXQoIkhlYWRpbmciKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGlzIGhlYWRpbmcgbGV2ZWwgMSBlbGVtZW50IG9yIG5vdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzSGVhZGluZzEoKSB7Ci0JCXJldHVybiBnZXQoIkhlYWRpbmcxIik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBpcyBoZWFkaW5nIGxldmVsIDIgZWxlbWVudCBvciBub3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0hlYWRpbmcyKCkgewotCQlyZXR1cm4gZ2V0KCJIZWFkaW5nMiIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcG9zaXRpb259IHdoaWNoIGV2YWx1YXRlcyB3aGV0aGVyIGEKLQkgKiAgICAgICAgIG5vZGUgaXMgaGVhZGluZyBsZXZlbCAzIGVsZW1lbnQgb3Igbm90Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNIZWFkaW5nMygpIHsKLQkJcmV0dXJuIGdldCgiSGVhZGluZzMiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGlzIGhlYWRpbmcgbGV2ZWwgNCBlbGVtZW50IG9yIG5vdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzSGVhZGluZzQoKSB7Ci0JCXJldHVybiBnZXQoIkhlYWRpbmc0Iik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBpcyBoZWFkaW5nIGxldmVsIDUgZWxlbWVudCBvciBub3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0hlYWRpbmc1KCkgewotCQlyZXR1cm4gZ2V0KCJIZWFkaW5nNSIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcG9zaXRpb259IHdoaWNoIGV2YWx1YXRlcyB3aGV0aGVyIGEKLQkgKiAgICAgICAgIG5vZGUgaXMgaGVhZGluZyBsZXZlbCA2IGVsZW1lbnQgb3Igbm90Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNIZWFkaW5nNigpIHsKLQkJcmV0dXJuIGdldCgiSGVhZGluZzYiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gYmUgZm91bmQKLQkgKiBAcGFyYW0gZXhhY3QgaWYgdHJ1ZSB0aGVuIGNhc2Utc2Vuc2l0aXZlCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBoYXMgdGhlIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGZpbmQoU3RyaW5nIHN0ciwgYm9vbGVhbiBleGFjdCkgewotCQlyZXR1cm4gbmV3IEZpbmRQcm9wb3NpdGlvbihzdHIsIGV4YWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gYmUgZm91bmQKLQkgKiBAcGFyYW0gZXhhY3QgaWYgdHJ1ZSB0aGVuIGNhc2Utc2Vuc2l0aXZlCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBoYXMgc3RyaW5nIHdoaWNoIHN0YXJ0cyB3aXRoIHN0cgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIHN0YXJ0c1dpdGgoU3RyaW5nIHN0ciwgYm9vbGVhbiBleGFjdCkgewotCQlyZXR1cm4gbmV3IFN0YXJ0c1dpdGhQcm9wb3NpdGlvbihzdHIsIGV4YWN0KTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJlZk5vZGUgdGhlIHJlZmVyZW5jZSBub2RlIHRvIGJlIGNvbXBhcmVkCi0JICogQHBhcmFtIGJhY2t3YXJkIHRoZSB0YXJnZXQgbm9kZSBpcyBhcHBlYXJlZCBiZWZvcmUgdGhlIHJlZk5vZGUgb3Igbm90Ci0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBpcyBhcHBlYXJlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHJlZmVyZW5jZSBub2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gbm9kZUxvY2F0aW9uKE5vZGUgcmVmTm9kZSwgYm9vbGVhbiBiYWNrd2FyZCkgewotCQlyZXR1cm4gbmV3IE5vZGVMb2NhdGlvblByb3Bvc2l0aW9uKHJlZk5vZGUsIGJhY2t3YXJkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ga2V5IHRoZSBjaGFyYWN0ZXIgb2YgdGhlIGFjY2VzcyBrZXkKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGhhcyB0aGUgYWNjZXNzIGtleQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzQWNjZXNzS2V5KGNoYXIga2V5KSB7Ci0JCXJldHVybiBuZXcgSXNBY2Nlc3NLZXkoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGNhbiBiZSByZWFkIHdpdGggbmV4dCBzaWJsaW5nIG9yIG5vdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb3Bvc2l0aW9uIGlzQ29ubmVjdGFibGUoKSB7Ci0JCXJldHVybiBnZXQoIkNvbm5lY3RhYmxlIik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBoYXMgY29udGVudCBjYW4gYmUgcmVhZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBoYXNSZWFkaW5nQ29udGVudCgpIHsKLQkJcmV0dXJuIGdldCgiSGFzUmVhZGluZ0NvbnRlbnQiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGlzIHN1aXRhYmxlIGZvciBibG9jayBqdW1wIHBvaW50IGluIGZvcndhcmQgZGlyZWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNCbG9ja0p1bXBQb2ludEYoKSB7Ci0JCXJldHVybiBnZXQoIkJsb2NrSnVtcFBvaW50RiIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcG9zaXRpb259IHdoaWNoIGV2YWx1YXRlcyB3aGV0aGVyIGEKLQkgKiAgICAgICAgIG5vZGUgaXMgc3VpdGFibGUgZm9yIGJsb2NrIGp1bXAgcG9pbnQgaW4gYmFja3dhcmQgZGlyZWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNCbG9ja0p1bXBQb2ludEIoKSB7Ci0JCXJldHVybiBnZXQoIkJsb2NrSnVtcFBvaW50QiIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcG9zaXRpb259IHdoaWNoIGV2YWx1YXRlcyB3aGV0aGVyIGEKLQkgKiAgICAgICAgIG5vZGUgaXMgbXVsdGkgc2VsZWN0YWJsZSBsaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNNdWx0aVNlbGVjdGFibGUoKSB7Ci0JCXJldHVybiBnZXQoIk11bHRpU2VsZWN0YWJsZSIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcG9zaXRpb259IHdoaWNoIGV2YWx1YXRlcyB3aGV0aGVyIGEKLQkgKiAgICAgICAgIG5vZGUgaXMgc291bmQgb3IgdmlkZW8gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNNZWRpYSgpIHsKLQkJcmV0dXJuIGdldCgiTWVkaWEiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGlzIEZsYXNoIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0ZsYXNoVG9wTm9kZSgpIHsKLQkJcmV0dXJuIGdldCgiRmxhc2hUb3BOb2RlIik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElQcm9wb3NpdGlvbn0gd2hpY2ggZXZhbHVhdGVzIHdoZXRoZXIgYQotCSAqICAgICAgICAgbm9kZSBpcyB0aGUgbGFzdCBub2RlIG9mIEZsYXNoIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0ZsYXNoTGFzdE5vZGUoKSB7Ci0JCXJldHVybiBnZXQoIkZsYXNoTGFzdE5vZGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSVByb3Bvc2l0aW9ufSB3aGljaCBldmFsdWF0ZXMgd2hldGhlciBhCi0JICogICAgICAgICBub2RlIGlzIEZsYXNoIGVsZW1lbnQgZnJvbSBNU0FBCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvcG9zaXRpb24gaXNNU0FBRmxhc2goKSB7Ci0JCXJldHVybiBnZXQoIk1TQUFGbGFzaCIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlTm9kZSB0aGUgbm9kZSB0byBiZSBjaGVja2VkIGZvciByZWFjaGluZwotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcG9zaXRpb259IHdoaWNoIGV2YWx1YXRlcyB3aGV0aGVyIGEKLQkgKiAgICAgICAgIG5vZGUgY2FuIGJlIHJlYWQgd2l0aCBuZXh0IGVsZW1lbnQgaW4gSFRNTCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc1JlYWNoYWJsZShOb2RlIGJhc2VOb2RlKSB7Ci0JCXJldHVybiBuZXcgSXNSZWFjaGFibGUoYmFzZU5vZGUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHtAbGluayBJUHJvcG9zaXRpb259IHdoaWNoIGV2YWx1YXRlcyB3aGV0aGVyIGEKLQkgKiAgICAgICAgIG5vZGUgY2FuIGJlIGFkZGVkIGFsdGVybmF0aXZlIHRleHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wb3NpdGlvbiBpc0FsdGVyYWJsZSgpIHsKLQkJcmV0dXJuIGdldCgiQWx0ZXJhYmxlIik7Ci0JfQotCi0JcHVibGljIGVudW0gRmxhc2hNb2RlIHsKLQkJTVNBQSwgRkxBU0hfRE9NLCBOT19GTEFTSAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG1vZGUgZm9yIG5vcm1hbCBGbGFzaAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmxhc2hNb2RlIGdldE5vcm1hbEZsYXNoTW9kZSgpIHsKLQkJU3RyaW5nIG1vZGUgPSBWb2NhYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5OT1JNQUxfRkxBU0gpOwotCQlpZiAoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlZBTFVFX01TQUFfRkxBU0guZXF1YWxzKG1vZGUpKQotCQkJcmV0dXJuIEZsYXNoTW9kZS5NU0FBOwotCQlpZiAoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlZBTFVFX0ZMQVNIX0RPTS5lcXVhbHMobW9kZSkpCi0JCQlyZXR1cm4gRmxhc2hNb2RlLkZMQVNIX0RPTTsKLQkJaWYgKFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5WQUxVRV9OT19GTEFTSC5lcXVhbHMobW9kZSkpCi0JCQlyZXR1cm4gRmxhc2hNb2RlLk5PX0ZMQVNIOwotCQlyZXR1cm4gRmxhc2hNb2RlLk5PX0ZMQVNIOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG1vZGUgZm9yIHdpbmRvd2xlc3MgZmxhc2ggbW9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmxhc2hNb2RlIGdldFdpbmRvd2xlc3NGbGFzaE1vZGUoKSB7Ci0JCVN0cmluZyBtb2RlID0gVm9jYWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuV05ETEVTU19GTEFTSCk7Ci0JCWlmIChWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuVkFMVUVfRkxBU0hfRE9NLmVxdWFscyhtb2RlKSkKLQkJCXJldHVybiBGbGFzaE1vZGUuRkxBU0hfRE9NOwotCQlpZiAoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlZBTFVFX05PX0ZMQVNILmVxdWFscyhtb2RlKSkKLQkJCXJldHVybiBGbGFzaE1vZGUuTk9fRkxBU0g7Ci0JCXJldHVybiBGbGFzaE1vZGUuTk9fRkxBU0g7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBzeXN0ZW0gcmVhZHMgbm8gYWx0IGltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZE5vQWx0SW1hZ2UoKSB7Ci0JCXJldHVybiBWb2NhYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuUkVBRF9OT19BTFQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgc3lzdGVtIHJlYWQgbnVsbCBhbHQgaW1hZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkTnVsbEFsdEltYWdlKCkgewotCQlyZXR1cm4gVm9jYWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlJFQURfTlVMTF9BTFQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgc3lzdGVtIHJlYWRzIG5vIGFsdCBpbWFnZSBsaW5rCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZE5vQWx0SW1hZ2VMaW5rKCkgewotCQlyZXR1cm4gVm9jYWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlJFQURfTk9fQUxUX0xJTkspOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgc3lzdGVtIHJlYWRzIG51bGwgYWx0IGltYWdlIGxpbmsKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkTnVsbEFsdEltYWdlTGluaygpIHsKLQkJcmV0dXJuIFZvY2FiUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCVZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5SRUFEX05VTExfQUxUX0xJTkspOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTa2lwSWNvbkxpbmsoKSB7Ci0JCXJldHVybiBWb2NhYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuU0tJUF9JQ09OX0xJTkspOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvV2lkZ2V0c1ZvY2FidWxhcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvV2lkZ2V0c1ZvY2FidWxhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5MzBiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL1dpZGdldHNWb2NhYnVsYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYjsKLQotLyoqCi0gKiBXaWRnZXRzVm9jYWJ1bGFyeSBkZWZpbmVzIHByb3Bvc2l0aW9ucyByZWxhdGVkIHRvIHdpZGdldHMgc3VjaCBhcyBidXR0b24gYW5kCi0gKiByYWRpbyBidXR0b24uCi0gKi8KLXB1YmxpYyBjbGFzcyBXaWRnZXRzVm9jYWJ1bGFyeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNCdXR0b24gaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkuaXNCdXR0b24obm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzQnV0dG9uIjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElzTGlzdEl0ZW0gaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkuaXNMaXN0SXRlbShub2RlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiAiaXNMaXN0SXRlbSI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0xpc3RUb3AgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkuaXNMaXN0VG9wKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJpc0xpc3RUb3AiOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNDaGVja2JveCBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0JCXB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotCQkJcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0NoZWNrYm94KG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJpc0NoZWNrYm94IjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElzQ2hlY2tlZCBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0JCXB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotCQkJcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0NoZWNrZWQobm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzQ2hlY2tlZCI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJc1JhZGlvIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLQkJcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzUmFkaW8obm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzUmFkaW8iOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNDb21ib2JveCBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0JCXB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotCQkJcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0NvbWJvYm94KG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJpc0NvbWJvYm94IjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElzU3VibWl0IGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLQkJcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzU3VibWl0KG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJpc1N1Ym1pdCI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0ZpbGVFZGl0IGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLQkJcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzRmlsZUVkaXQobm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzRmlsZUVkaXQiOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNMYWJlbCBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0JCXB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotCQkJcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0xhYmVsKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJpc0xhYmVsIjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElzTGluayBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0JCXB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotCQkJcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0xpbmsobm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzTGluayI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJc1Zpc2l0ZWRMaW5rIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLQkJcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzVmlzaXRlZExpbmsobm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzVmlzaXRlZExpbmsiOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNUZXh0YXJlYSBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0JCXB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotCQkJcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc1RleHRhcmVhKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJpc1RleHRhcmVhIjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElzVGV4dGJveCBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0JCXB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotCQkJcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc1RleHRib3gobm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzVGV4dGJveCI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJc1Bhc3N3b3JkIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLQkJcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzUGFzc3dvcmQobm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzUGFzc3dvcmQiOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNNdWx0aWxpbmVFZGl0IGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLQkJcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzTXVsdGlsaW5lRWRpdChub2RlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiAiaXNNdWx0aSI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJc1NlbGVjdE9wdGlvbiBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0JCXB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotCQkJcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc1NlbGVjdE9wdGlvbihub2RlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiAiaXNTZWxlY3RPcHRpb24iOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNJbWFnZSBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0JCXB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotCQkJcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0ltYWdlKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJpc0ltYWdlIjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElzRmxhc2hUb3BOb2RlIGltcGxlbWVudHMgSVByb3Bvc2l0aW9uIHsKLQkJcHVibGljIGJvb2xlYW4gZXZhbChJRXZhbFRhcmdldCBub2RlKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXRUZXJtcygpLmlzRmxhc2hUb3BOb2RlKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJpc0ZsYXNoVG9wTm9kZSI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJc0ZsYXNoTGFzdE5vZGUgaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkuaXNGbGFzaExhc3ROb2RlKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuICJpc0ZsYXNoTGFzdE5vZGUiOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNNU0FBRmxhc2ggaW1wbGVtZW50cyBJUHJvcG9zaXRpb24gewotCQlwdWJsaWMgYm9vbGVhbiBldmFsKElFdmFsVGFyZ2V0IG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldFRlcm1zKCkuaXNNU0FBRmxhc2gobm9kZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gImlzTVNBQUZsYXNoIjsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElzSGVhZGluZyBpbXBsZW1lbnRzIElQcm9wb3NpdGlvbiB7Ci0JCXByaXZhdGUgaW50IGxldmVsID0gMDsKLQotCQlwdWJsaWMgSXNIZWFkaW5nKCkgewotCQl9Ci0KLQkJcHVibGljIElzSGVhZGluZyhpbnQgbGV2ZWwpIHsKLQkJCXRoaXMubGV2ZWwgPSBsZXZlbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGV2YWwoSUV2YWxUYXJnZXQgbm9kZSkgewotCQkJcmV0dXJuIG5vZGUuZ2V0VGVybXMoKS5pc0hlYWRpbmcobGV2ZWwsIG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJaWYgKGxldmVsICE9IDApCi0JCQkJcmV0dXJuICJpc0hlYWRpbmciICsgbGV2ZWw7Ci0JCQlyZXR1cm4gImlzSGVhZGluZyI7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlWb2NhYnVsYXJ5LmFkZCgiQnV0dG9uIiwgbmV3IElzQnV0dG9uKCkpOwotCQlWb2NhYnVsYXJ5LmFkZCgiTGlzdEl0ZW0iLCBuZXcgSXNMaXN0SXRlbSgpKTsKLQkJVm9jYWJ1bGFyeS5hZGQoIkxpc3RUb3AiLCBuZXcgSXNMaXN0VG9wKCkpOwotCQlWb2NhYnVsYXJ5LmFkZCgiQ2hlY2tib3giLCBuZXcgSXNDaGVja2JveCgpKTsKLQkJVm9jYWJ1bGFyeS5hZGQoIkNoZWNrZWQiLCBuZXcgSXNDaGVja2VkKCkpOwotCQlWb2NhYnVsYXJ5LmFkZCgiUmFkaW8iLCBuZXcgSXNSYWRpbygpKTsKLQkJVm9jYWJ1bGFyeS5hZGQoIkNvbWJvYm94IiwgbmV3IElzQ29tYm9ib3goKSk7Ci0JCVZvY2FidWxhcnkuYWRkKCJTdWJtaXQiLCBuZXcgSXNTdWJtaXQoKSk7Ci0JCVZvY2FidWxhcnkuYWRkKCJGaWxlRWRpdCIsIG5ldyBJc0ZpbGVFZGl0KCkpOwotCQlWb2NhYnVsYXJ5LmFkZCgiTGFiZWwiLCBuZXcgSXNMYWJlbCgpKTsKLQkJVm9jYWJ1bGFyeS5hZGQoIkxpbmsiLCBuZXcgSXNMaW5rKCkpOwotCQlWb2NhYnVsYXJ5LmFkZCgiVmlzaXRlZExpbmsiLCBuZXcgSXNWaXNpdGVkTGluaygpKTsKLQkJVm9jYWJ1bGFyeS5hZGQoIlRleHRhcmVhIiwgbmV3IElzVGV4dGFyZWEoKSk7Ci0JCVZvY2FidWxhcnkuYWRkKCJUZXh0Ym94IiwgbmV3IElzVGV4dGJveCgpKTsKLQkJVm9jYWJ1bGFyeS5hZGQoIlBhc3N3b3JkIiwgbmV3IElzUGFzc3dvcmQoKSk7Ci0JCVZvY2FidWxhcnkuYWRkKCJNdWx0aWxpbmVFZGl0IiwgbmV3IElzTXVsdGlsaW5lRWRpdCgpKTsKLQkJVm9jYWJ1bGFyeS5hZGQoIlNlbGVjdE9wdGlvbiIsIG5ldyBJc1NlbGVjdE9wdGlvbigpKTsKLQkJVm9jYWJ1bGFyeS5hZGQoIkltYWdlIiwgbmV3IElzSW1hZ2UoKSk7Ci0JCVZvY2FidWxhcnkuYWRkKCJIZWFkaW5nIiwgbmV3IElzSGVhZGluZygpKTsKLQkJVm9jYWJ1bGFyeS5hZGQoIkhlYWRpbmcxIiwgbmV3IElzSGVhZGluZygxKSk7Ci0JCVZvY2FidWxhcnkuYWRkKCJIZWFkaW5nMiIsIG5ldyBJc0hlYWRpbmcoMikpOwotCQlWb2NhYnVsYXJ5LmFkZCgiSGVhZGluZzMiLCBuZXcgSXNIZWFkaW5nKDMpKTsKLQkJVm9jYWJ1bGFyeS5hZGQoIkhlYWRpbmc0IiwgbmV3IElzSGVhZGluZyg0KSk7Ci0JCVZvY2FidWxhcnkuYWRkKCJIZWFkaW5nNSIsIG5ldyBJc0hlYWRpbmcoNSkpOwotCQlWb2NhYnVsYXJ5LmFkZCgiSGVhZGluZzYiLCBuZXcgSXNIZWFkaW5nKDYpKTsKLQotCQlWb2NhYnVsYXJ5LmFkZCgiRmxhc2hUb3BOb2RlIiwgbmV3IElzRmxhc2hUb3BOb2RlKCkpOwotCQlWb2NhYnVsYXJ5LmFkZCgiRmxhc2hMYXN0Tm9kZSIsIG5ldyBJc0ZsYXNoTGFzdE5vZGUoKSk7Ci0JCVZvY2FidWxhcnkuYWRkKCJNU0FBRmxhc2giLCBuZXcgSXNNU0FBRmxhc2goKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi91aS9wcmVmZXJlbmNlcy9Wb2NhYlByZWZlcmVuY2VDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvdWkvcHJlZmVyZW5jZXMvVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNjc2MzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC92b2NhYi91aS9wcmVmZXJlbmNlcy9Wb2NhYlByZWZlcmVuY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiLnVpLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENvbnN0YW50IGRlZmluaXRpb25zIGZvciBwbHVnLWluIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBWb2NhYlByZWZlcmVuY2VDb25zdGFudHMgewotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PUk1BTF9GTEFTSCA9ICJub3JtYWxfZmxhc2giOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdORExFU1NfRkxBU0ggPSAid25kbGVzc19mbGFzaCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9GTEFTSF9ET00gPSAiZmxhc2hfZG9tIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX01TQUFfRkxBU0ggPSAibXNhYV9mbGFzaCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9OT19GTEFTSCA9ICJub19mbGFzaCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX05PX0FMVCA9ICJyZWFkX25vX2FsdCI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9OVUxMX0FMVCA9ICJyZWFkX251bGxfYWx0IjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX05PX0FMVF9MSU5LID0gInJlYWRfbm9fYWx0X2xpbmsiOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfTlVMTF9BTFRfTElOSyA9ICJyZWFkX251bGxfYWx0X2xpbmsiOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfSUNPTl9MSU5LID0gInNraXBfaWNvbl9saW5rIjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvdWkvcHJlZmVyZW5jZXMvVm9jYWJQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvdWkvcHJlZmVyZW5jZXMvVm9jYWJQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzMDU0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL3VpL3ByZWZlcmVuY2VzL1ZvY2FiUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi5Wb2NhYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0KLS8qKgotICogQ2xhc3MgdXNlZCB0byBpbml0aWFsaXplIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWb2NhYlByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCUBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBWb2NhYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLk5PUk1BTF9GTEFTSCwgVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlZBTFVFX01TQUFfRkxBU0gpOwotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5XTkRMRVNTX0ZMQVNILCBWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuVkFMVUVfRkxBU0hfRE9NKTsKLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuUkVBRF9OT19BTFQsIHRydWUpOwotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5SRUFEX05VTExfQUxULCBmYWxzZSk7Ci0gICAgICAgIHN0b3JlLnNldERlZmF1bHQoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlJFQURfTk9fQUxUX0xJTkssIHRydWUpOwotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5SRUFEX05VTExfQUxUX0xJTkssIHRydWUpOwotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5TS0lQX0lDT05fTElOSywgdHJ1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC52b2NhYi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3ZvY2FiL3VpL3ByZWZlcmVuY2VzL1ZvY2FiUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvdWkvcHJlZmVyZW5jZXMvVm9jYWJQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWZkZDhiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLnZvY2FiL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvdm9jYWIvdWkvcHJlZmVyZW5jZXMvVm9jYWJQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwudm9jYWIuVm9jYWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Cb29sZWFuRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUmFkaW9Hcm91cEZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgcHJlZmVyZW5jZSBwYWdlIHRoYXQKLSAqIGlzIGNvbnRyaWJ1dGVkIHRvIHRoZSBQcmVmZXJlbmNlcyBkaWFsb2cuIEJ5IAotICogc3ViY2xhc3NpbmcgPHNhbXA+RmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTwvc2FtcD4sIHdlCi0gKiBjYW4gdXNlIHRoZSBmaWVsZCBzdXBwb3J0IGJ1aWx0IGludG8gSkZhY2UgdGhhdCBhbGxvd3MKLSAqIHVzIHRvIGNyZWF0ZSBhIHBhZ2UgdGhhdCBpcyBzbWFsbCBhbmQga25vd3MgaG93IHRvIAotICogc2F2ZSwgcmVzdG9yZSBhbmQgYXBwbHkgaXRzZWxmLgotICogPHA+Ci0gKiBUaGlzIHBhZ2UgaXMgdXNlZCB0byBtb2RpZnkgcHJlZmVyZW5jZXMgb25seS4gVGhleQotICogYXJlIHN0b3JlZCBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSB0aGF0IGJlbG9uZ3MgdG8KLSAqIHRoZSBtYWluIHBsdWctaW4gY2xhc3MuIFRoYXQgd2F5LCBwcmVmZXJlbmNlcyBjYW4KLSAqIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHZpYSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgVm9jYWJQcmVmZXJlbmNlUGFnZQotCWV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZQotCWltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXB1YmxpYyBWb2NhYlByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcihHUklEKTsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKFZvY2FiUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldERlc2NyaXB0aW9uKCJET00gVm9jYWJ1bGFyeSBQcmVmZXJlbmNlcyIpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBmaWVsZCBlZGl0b3JzLiBGaWVsZCBlZGl0b3JzIGFyZSBhYnN0cmFjdGlvbnMgb2YKLQkgKiB0aGUgY29tbW9uIEdVSSBibG9ja3MgbmVlZGVkIHRvIG1hbmlwdWxhdGUgdmFyaW91cyB0eXBlcwotCSAqIG9mIHByZWZlcmVuY2VzLiBFYWNoIGZpZWxkIGVkaXRvciBrbm93cyBob3cgdG8gc2F2ZSBhbmQKLQkgKiByZXN0b3JlIGl0c2VsZi4KLQkgKi8KLQlAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0gICAgICAgIAotICAgICAgICBhZGRGaWVsZChuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5OT1JNQUxfRkxBU0gsIAotICAgICAgICAgICAgICAgICJFeHRyYWN0IG5vcm1hbCBGbGFzaCBjb250ZW50IGluZm9ybWF0aW9uIGJ5IiwgMSwgCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdW117Ci0gICAgICAgICAgICAgICAgICAgIHsiTVNBQSIsIFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5WQUxVRV9NU0FBX0ZMQVNIfSwKLSAgICAgICAgICAgICAgICAgICAgeyJGbGFzaCBET00iLCBWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuVkFMVUVfRkxBU0hfRE9NfSwgCi0gICAgICAgICAgICAgICAgICAgIHsiTm9uZSIsIFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5WQUxVRV9OT19GTEFTSH19LCAKLSAgICAgICAgICAgICAgICBnZXRGaWVsZEVkaXRvclBhcmVudCgpKSk7Ci0gICAgICAgIAotICAgICAgICBhZGRGaWVsZChuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5XTkRMRVNTX0ZMQVNILCAKLSAgICAgICAgICAgICAgICAiRXh0cmFjdCB3aW5kb3dsZXNzIEZsYXNoIGNvbnRlbnQgaW5mb3JtYXRpb24gYnkiLCAxLCAKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW11bXXsKLSAgICAgICAgICAgICAgICAgICAgeyJGbGFzaCBET00iLCBWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuVkFMVUVfRkxBU0hfRE9NfSwgCi0gICAgICAgICAgICAgICAgICAgIHsiTm9uZSIsIFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5WQUxVRV9OT19GTEFTSH19LCAKLSAgICAgICAgICAgICAgICBnZXRGaWVsZEVkaXRvclBhcmVudCgpKSk7Ci0KLSAgICAgICAgYWRkRmllbGQobmV3IEJvb2xlYW5GaWVsZEVkaXRvcihWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuUkVBRF9OT19BTFQsCi0gICAgICAgICAgICAgICAgIlJlYWQgaW1hZ2Ugd2l0aCBubyBhbHQgdGV4dCIsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKLSAgICAgICAgYWRkRmllbGQobmV3IEJvb2xlYW5GaWVsZEVkaXRvcihWb2NhYlByZWZlcmVuY2VDb25zdGFudHMuUkVBRF9OVUxMX0FMVCwKLSAgICAgICAgICAgICAgICAiUmVhZCBpbWFnZSB3aXRoIG51bGwgYWx0IHRleHQiLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKSk7Ci0gICAgICAgIGFkZEZpZWxkKG5ldyBCb29sZWFuRmllbGRFZGl0b3IoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlJFQURfTk9fQUxUX0xJTkssCi0gICAgICAgICAgICAgICAgIlJlYWQgaW1hZ2UgbGluayB3aXRoIG5vIGFsdCB0ZXh0IiwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkpOwotICAgICAgICBhZGRGaWVsZChuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKFZvY2FiUHJlZmVyZW5jZUNvbnN0YW50cy5SRUFEX05VTExfQUxUX0xJTkssCi0gICAgICAgICAgICAgICAgIlJlYWQgaW1hZ2UgbGluayB3aXRoIG51bGwgYWx0IHRleHQiLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKSk7Ci0gICAgICAgIGFkZEZpZWxkKG5ldyBCb29sZWFuRmllbGRFZGl0b3IoVm9jYWJQcmVmZXJlbmNlQ29uc3RhbnRzLlNLSVBfSUNPTl9MSU5LLAotICAgICAgICAgICAgICAgICJTa2lwIGltYWdlIGxpbmsgZm9sbG93aW5nIHRleHQgbGluayB3aXRoIHRoZSBzYW1lIGxpbmsiLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MmIxNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4KLWJ1aWxkCi1jb20uZXhwCi1jb20uaWxrCi1jb20ubGliCi1jb20ucGRiCi1KYXZhQ29tLmV4cAotSmF2YUNvbS5pbGsKLUphdmFDb20ubGliCi1KYXZhQ29tLnBkYgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDk4MTQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2g8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL0phdmFDb20uZGxsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL0phdmFDb20uZGxsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmYxZTk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9KYXZhQ29tLmRsbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9LZXlIb29rLmRsbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9LZXlIb29rLmRsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmNWM2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvS2V5SG9vay5kbGwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OTllODcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRWNsaXBzZSBBQ1RGIFdpbjMyIENPTSBDbHV0Y2ggUGx1Zy1pbiAoSW5jdWJhdGlvbikKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gKLUJ1bmRsZS1WZXJzaW9uOiAwLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guQ29tUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLAotIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5rZXlob29rLAotIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5tc2FhCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODFkYmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSA1LCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICAKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi10aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzkxZWM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgSmF2YUNvbS5kbGwsXAotICAgICAgICAgICAgICAgS2V5SG9vay5kbGwKLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTgzOTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSoucGRiCi1vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX0NvbVNlcnZpY2UuaAotb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9IYW5kbGVyLmgKLW9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyLmgKLW9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JRGlzcGF0Y2hJbXBsLmgKLW9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JRW51bVVua25vd25JbXBsLmgKLW9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JT2xlQ29udGFpbmVySW1wbC5oCi1vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX2ltcGxfSVJlc291cmNlSW1wbC5oCi1vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX2ltcGxfSVVua25vd25JbXBsLmgKLW9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JVXJsSGlzdG9yeVN0ZzJJbXBsLmgKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL0NvbS5oIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvQ29tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Mjg0ZjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvQ29tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fQ09NX0hfXwotI2RlZmluZSBfX0NPTV9IX18KLSNpbmNsdWRlIDxqbmkuaD4KLSNpbmNsdWRlIDxhdGxiYXNlLmg+Ci0jaW5jbHVkZSA8YXRsY29udi5oPgotCi1leHRlcm4gY29uc3QgY2hhciBjbGFzc25hbWVfSURpc3BhdGNoW107Ci1leHRlcm4gY29uc3QgY2hhciBjbGFzc25hbWVfSVVua25vd25bXTsKLWV4dGVybiBjb25zdCBjaGFyIGNsYXNzbmFtZV9JUmVzb3VyY2VbXTsKLWV4dGVybiBjb25zdCBjaGFyIGNsYXNzbmFtZV9JT2xlQ29udGFpbmVyW107Ci1leHRlcm4gY29uc3QgY2hhciBjbGFzc25hbWVfSUVudW1Vbmtub3duW107Ci1leHRlcm4gY29uc3QgY2hhciBjbGFzc25hbWVfRGlzcGF0Y2hFeGNlcHRpb25bXTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgY2xhc3NuYW1lX1JlZkNvbnRhaW5lcltdOwotZXh0ZXJuIGNvbnN0IGNoYXIgY2xhc3NuYW1lX1JlZlN0cmluZ1tdOwotZXh0ZXJuIGNvbnN0IGNoYXIgY2xhc3NuYW1lX1JlZkJ5dGVbXTsKLWV4dGVybiBjb25zdCBjaGFyIGNsYXNzbmFtZV9SZWZTaG9ydFtdOwotZXh0ZXJuIGNvbnN0IGNoYXIgY2xhc3NuYW1lX1JlZkludFtdOwotZXh0ZXJuIGNvbnN0IGNoYXIgY2xhc3NuYW1lX1JlZkxvbmdbXTsKLWV4dGVybiBjb25zdCBjaGFyIGNsYXNzbmFtZV9SZWZGbG9hdFtdOwotZXh0ZXJuIGNvbnN0IGNoYXIgY2xhc3NuYW1lX1JlZkRvdWJsZVtdOwotCi1leHRlcm4gamNsYXNzIGNsYXNzX0lEaXNwYXRjaDsKLWV4dGVybiBqY2xhc3MgY2xhc3NfSVVua25vd247Ci1leHRlcm4gamNsYXNzIGNsYXNzX0lSZXNvdXJjZTsKLWV4dGVybiBqY2xhc3MgY2xhc3NfSU9sZUNvbnRhaW5lcjsKLWV4dGVybiBqY2xhc3MgY2xhc3NfSUVudW1Vbmtub3duOwotZXh0ZXJuIGpjbGFzcyBjbGFzc19EaXNwYXRjaEV4Y2VwdGlvbjsKLQotZXh0ZXJuIGpjbGFzcyBjbGFzc19SZWZDb250YWluZXI7Ci1leHRlcm4gamNsYXNzIGNsYXNzX1JlZlN0cmluZzsKLWV4dGVybiBqY2xhc3MgY2xhc3NfUmVmQnl0ZTsKLWV4dGVybiBqY2xhc3MgY2xhc3NfUmVmU2hvcnQ7Ci1leHRlcm4gamNsYXNzIGNsYXNzX1JlZkludDsKLWV4dGVybiBqY2xhc3MgY2xhc3NfUmVmTG9uZzsKLWV4dGVybiBqY2xhc3MgY2xhc3NfUmVmRmxvYXQ7Ci1leHRlcm4gamNsYXNzIGNsYXNzX1JlZkRvdWJsZTsKLQotCi1leHRlcm4gamNsYXNzIGNsYXNzX2phdmFfbGFuZ19vYmplY3Q7Ci1leHRlcm4gamNsYXNzIGNsYXNzX2phdmFfbGFuZ19zdHJpbmc7Ci1leHRlcm4gamNsYXNzIGNsYXNzX2phdmFfbGFuZ19ib29sZWFuOwotZXh0ZXJuIGpjbGFzcyBjbGFzc19qYXZhX2xhbmdfYnl0ZTsKLWV4dGVybiBqY2xhc3MgY2xhc3NfamF2YV9sYW5nX3Nob3J0OwotZXh0ZXJuIGpjbGFzcyBjbGFzc19qYXZhX2xhbmdfaW50ZWdlcjsKLWV4dGVybiBqY2xhc3MgY2xhc3NfamF2YV9sYW5nX2xvbmc7Ci1leHRlcm4gamNsYXNzIGNsYXNzX2phdmFfbGFuZ19mbG9hdDsKLWV4dGVybiBqY2xhc3MgY2xhc3NfamF2YV9sYW5nX2RvdWJsZTsKLQotZXh0ZXJuIGptZXRob2RJRCB0b1N0cmluZzsKLWV4dGVybiBqbWV0aG9kSUQgYm9vbGVhblZhbHVlOwotZXh0ZXJuIGptZXRob2RJRCBib29sZWFuQ29uc3RydWN0b3I7Ci1leHRlcm4gam1ldGhvZElEIGJ5dGVWYWx1ZTsKLWV4dGVybiBqbWV0aG9kSUQgYnl0ZUNvbnN0cnVjdG9yOwotZXh0ZXJuIGptZXRob2RJRCBzaG9ydFZhbHVlOwotZXh0ZXJuIGptZXRob2RJRCBzaG9ydENvbnN0cnVjdG9yOwotZXh0ZXJuIGptZXRob2RJRCBpbnRWYWx1ZTsKLWV4dGVybiBqbWV0aG9kSUQgaW50Q29uc3RydWN0b3I7Ci1leHRlcm4gam1ldGhvZElEIGxvbmdWYWx1ZTsKLWV4dGVybiBqbWV0aG9kSUQgbG9uZ0NvbnN0cnVjdG9yOwotZXh0ZXJuIGptZXRob2RJRCBmbG9hdFZhbHVlOwotZXh0ZXJuIGptZXRob2RJRCBmbG9hdENvbnN0cnVjdG9yOwotZXh0ZXJuIGptZXRob2RJRCBkb3VibGVWYWx1ZTsKLWV4dGVybiBqbWV0aG9kSUQgZG91YmxlQ29uc3RydWN0b3I7Ci0KLWV4dGVybiBqbWV0aG9kSUQgZ2V0UHRyTWV0aG9kOwotCi1leHRlcm4gam1ldGhvZElEIG5ld0lVbmtub3duOwotZXh0ZXJuIGptZXRob2RJRCBuZXdJRGlzcGF0Y2g7Ci0KLS8qIENvbW1vbi5jcHAgKi8KLWV4dGVybiB2b2lkIEdVSURfZnJvbV91dWlkYml0cyhqbG9uZyBqdXVpZG1zYiwgamxvbmcganV1aWRsc2IsIEdVSUQgKnBndWlkKTsKLWV4dGVybiB2b2lkIHRocm93X0Rpc3BhdGNoRXhjZXB0aW9uKEpOSUVudiogZW52LCBjb25zdCB3Y2hhcl90KiBmbXQsIC4uLik7Ci1leHRlcm4gaW50IGNoZWNrX2hyZXN1bHQoSk5JRW52KiBlbnYsIEhSRVNVTFQgciwgRVhDRVBJTkZPICpwZXhjZXBJbmZvKTsKLWV4dGVybiB2b2lkKiBnZXRQdHIoSk5JRW52KiBlbnYsIGpvYmplY3Qgbyk7Ci1leHRlcm4gd2NoYXJfdCogam9iamVjdF90b19zdHJpbmcoSk5JRW52KiBlbnYsIGpvYmplY3Qgbyk7Ci1leHRlcm4gSk5JRW52KiBnZXRFbnYoKTsKLQotLyogSkNUeXBlQnJpZGdlLmNwcCAqLwotZXh0ZXJuIGludCBqMnYoSk5JRW52KiBlbnYsIGpvYmplY3QgbywgVkFSSUFOVCogdik7Ci1leHRlcm4gam9iamVjdCB2MmooSk5JRW52KiBlbnYsIGpvYmplY3QgamlkaXNwLCBWQVJJQU5UKiB2KTsKLWV4dGVybiBpbnQgamNfdmFyaWFudF9jbGVhcihWQVJJQU5UKiBwdiwgaW50IHJlbGVhc2VJVW5rbm93bik7Ci0KLS8qIEpDVHlwZUJyaWRnZUFycmF5LmNwcCAqLwotZXh0ZXJuIGpvYmplY3QgamNfbWFrZV9hcnJheShKTklFbnYqIGVudiwgam9iamVjdCBqaWRpc3AsIFZBUklBTlQqIHYpOwotCi0vKiBJVW5rbm93bi5jcHAgKi8KLWV4dGVybiBqb2JqZWN0IGNyZWF0ZV9JVW5rbm93bihKTklFbnYqIGVudiwgam9iamVjdCBqaXVuaywgSVVua25vd24qIGl1bmspOwotZXh0ZXJuIGludCByZWxlYXNlSW5RdWV1ZXMoKTsKLWV4dGVybiBpbnQgaW5pdGlhbGl6ZV9JVW5rbm93bihKTklFbnYqIGVudik7Ci0KLS8qIElEaXNwYXRjaC5jcHAgKi8KLWV4dGVybiBqb2JqZWN0IGNyZWF0ZV9JRGlzcGF0Y2goSk5JRW52KiBlbnYsIGpvYmplY3QgamlkaXNwLCBJRGlzcGF0Y2gqIGlkaXNwKTsKLQotCi0jZW5kaWYgLyogX19DT01fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvQ29tbW9uLmNwcCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL0NvbW1vbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDU2MmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvQ29tbW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAgQ29tbW9uIGxpYnJhcnkKLSovCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlICJvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX0NvbVNlcnZpY2UuaCIKLSNpbmNsdWRlICJDb20uaCIKLQotI2RlZmluZSBCQVNFQ0xBU1MobmFtZSkgIm9yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvIiAjbmFtZQotCi0KLWNvbnN0IGNoYXIgY2xhc3NuYW1lX0lEaXNwYXRjaFtdID0gQkFTRUNMQVNTKElEaXNwYXRjaCk7Ci1jb25zdCBjaGFyIGNsYXNzbmFtZV9JVW5rbm93bltdID0gQkFTRUNMQVNTKElVbmtub3duKTsKLWNvbnN0IGNoYXIgY2xhc3NuYW1lX0lSZXNvdXJjZVtdID0gQkFTRUNMQVNTKElSZXNvdXJjZSk7Ci1jb25zdCBjaGFyIGNsYXNzbmFtZV9JT2xlQ29udGFpbmVyW10gPSBCQVNFQ0xBU1MoSU9sZUNvbnRhaW5lcik7Ci1jb25zdCBjaGFyIGNsYXNzbmFtZV9JRW51bVVua25vd25bXSA9IEJBU0VDTEFTUyhJRW51bVVua25vd24pOwotY29uc3QgY2hhciBjbGFzc25hbWVfRGlzcGF0Y2hFeGNlcHRpb25bXSA9IEJBU0VDTEFTUyhEaXNwYXRjaEV4Y2VwdGlvbik7Ci0KLWNvbnN0IGNoYXIgY2xhc3NuYW1lX1JlZkNvbnRhaW5lcltdID0gQkFTRUNMQVNTKFJlZkNvbnRhaW5lcik7Ci1jb25zdCBjaGFyIGNsYXNzbmFtZV9SZWZTdHJpbmdbXSA9IEJBU0VDTEFTUyhSZWZTdHJpbmcpOwotY29uc3QgY2hhciBjbGFzc25hbWVfUmVmQnl0ZVtdID0gQkFTRUNMQVNTKFJlZkJ5dGUpOwotY29uc3QgY2hhciBjbGFzc25hbWVfUmVmU2hvcnRbXSA9IEJBU0VDTEFTUyhSZWZTaG9ydCk7Ci1jb25zdCBjaGFyIGNsYXNzbmFtZV9SZWZJbnRbXSA9IEJBU0VDTEFTUyhSZWZJbnQpOwotY29uc3QgY2hhciBjbGFzc25hbWVfUmVmTG9uZ1tdID0gQkFTRUNMQVNTKFJlZkxvbmcpOwotY29uc3QgY2hhciBjbGFzc25hbWVfUmVmRmxvYXRbXSA9IEJBU0VDTEFTUyhSZWZGbG9hdCk7Ci1jb25zdCBjaGFyIGNsYXNzbmFtZV9SZWZEb3VibGVbXSA9IEJBU0VDTEFTUyhSZWZEb3VibGUpOwotCi1zdGF0aWMgSmF2YVZNICpqdm07Ci0KLWpjbGFzcyBjbGFzc19JRGlzcGF0Y2g7Ci1qY2xhc3MgY2xhc3NfSVVua25vd247Ci1qY2xhc3MgY2xhc3NfSVJlc291cmNlOwotamNsYXNzIGNsYXNzX0lPbGVDb250YWluZXI7Ci1qY2xhc3MgY2xhc3NfSUVudW1Vbmtub3duOwotamNsYXNzIGNsYXNzX0Rpc3BhdGNoRXhjZXB0aW9uOwotCi1qY2xhc3MgY2xhc3NfUmVmQ29udGFpbmVyOwotamNsYXNzIGNsYXNzX1JlZlN0cmluZzsKLWpjbGFzcyBjbGFzc19SZWZCeXRlOwotamNsYXNzIGNsYXNzX1JlZlNob3J0OwotamNsYXNzIGNsYXNzX1JlZkludDsKLWpjbGFzcyBjbGFzc19SZWZMb25nOwotamNsYXNzIGNsYXNzX1JlZkZsb2F0OwotamNsYXNzIGNsYXNzX1JlZkRvdWJsZTsKLQotamNsYXNzIGNsYXNzX2phdmFfbGFuZ19vYmplY3Q7Ci1qY2xhc3MgY2xhc3NfamF2YV9sYW5nX3N0cmluZzsKLWpjbGFzcyBjbGFzc19qYXZhX2xhbmdfYm9vbGVhbjsKLWpjbGFzcyBjbGFzc19qYXZhX2xhbmdfYnl0ZTsKLWpjbGFzcyBjbGFzc19qYXZhX2xhbmdfc2hvcnQ7Ci1qY2xhc3MgY2xhc3NfamF2YV9sYW5nX2ludGVnZXI7Ci1qY2xhc3MgY2xhc3NfamF2YV9sYW5nX2xvbmc7Ci1qY2xhc3MgY2xhc3NfamF2YV9sYW5nX2Zsb2F0OwotamNsYXNzIGNsYXNzX2phdmFfbGFuZ19kb3VibGU7Ci0KLWptZXRob2RJRCB0b1N0cmluZzsKLWptZXRob2RJRCBib29sZWFuVmFsdWU7Ci1qbWV0aG9kSUQgYm9vbGVhbkNvbnN0cnVjdG9yOwotam1ldGhvZElEIGJ5dGVWYWx1ZTsKLWptZXRob2RJRCBieXRlQ29uc3RydWN0b3I7Ci1qbWV0aG9kSUQgc2hvcnRWYWx1ZTsKLWptZXRob2RJRCBzaG9ydENvbnN0cnVjdG9yOwotam1ldGhvZElEIGludFZhbHVlOwotam1ldGhvZElEIGludENvbnN0cnVjdG9yOwotam1ldGhvZElEIGxvbmdWYWx1ZTsKLWptZXRob2RJRCBsb25nQ29uc3RydWN0b3I7Ci1qbWV0aG9kSUQgZmxvYXRWYWx1ZTsKLWptZXRob2RJRCBmbG9hdENvbnN0cnVjdG9yOwotam1ldGhvZElEIGRvdWJsZVZhbHVlOwotam1ldGhvZElEIGRvdWJsZUNvbnN0cnVjdG9yOwotCi1qbWV0aG9kSUQgZ2V0UHRyTWV0aG9kOwotCi1qbWV0aG9kSUQgbmV3SVVua25vd247Ci1qbWV0aG9kSUQgbmV3SURpc3BhdGNoOwotam1ldGhvZElEIG5ld0lPbGVDb250YWluZXI7Ci1qbWV0aG9kSUQgbmV3SUVudW1Vbmtub3duOwotCi1zdGF0aWMgamNsYXNzCi1pbml0aWFsaXplX2NsYXNzX3JlZmVyZW5jZShKTklFbnYqIGVudiwKLQkJCSAgIGNvbnN0IGNoYXIqIGNsYXNzbmFtZSkKLXsKLSAgICBqY2xhc3MgYzsKLQotICAgIGMgPSBlbnYtPkZpbmRDbGFzcyhjbGFzc25hbWUpOwotICAgIGlmICghYykgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGMpOwotfQotCi1zdGF0aWMgam1ldGhvZElECi1pbml0aWFsaXplX21ldGhvZF9yZWZlcmVuY2UoSk5JRW52KiBlbnYsCi0JCQkgICAgamNsYXNzIGMsCi0JCQkgICAgY29uc3QgY2hhciogbWV0aG9kbmFtZSwKLQkJCSAgICBjb25zdCBjaGFyKiBhcmdTaWduYXR1cmUpCi17Ci0gICAgam1ldGhvZElEIG07Ci0KLSAgICBtID0gZW52LT5HZXRNZXRob2RJRChjLCBtZXRob2RuYW1lLCBhcmdTaWduYXR1cmUpOwotICAgIHJldHVybiBtOwotfQotCi1pbnQgaW5pdGlhbGl6ZV9Db21tb24oSk5JRW52KiBlbnYpCi17Ci0gICAgZW52LT5HZXRKYXZhVk0oJmp2bSk7Ci0KLSAgICBjbGFzc19EaXNwYXRjaEV4Y2VwdGlvbiA9IGluaXRpYWxpemVfY2xhc3NfcmVmZXJlbmNlKGVudiwgY2xhc3NuYW1lX0Rpc3BhdGNoRXhjZXB0aW9uKTsKLSAgICBpZiAoIWNsYXNzX0Rpc3BhdGNoRXhjZXB0aW9uKSByZXR1cm4gMDsKLQotICAgIGNsYXNzX0lEaXNwYXRjaCA9IGluaXRpYWxpemVfY2xhc3NfcmVmZXJlbmNlKGVudiwgY2xhc3NuYW1lX0lEaXNwYXRjaCk7Ci0gICAgaWYgKCFjbGFzc19JRGlzcGF0Y2gpIHJldHVybiAwOwotICAgIG5ld0lEaXNwYXRjaCA9IGluaXRpYWxpemVfbWV0aG9kX3JlZmVyZW5jZShlbnYsIGNsYXNzX0lEaXNwYXRjaCwKLQkJCQkJICAgICAgICJuZXdJRGlzcGF0Y2giLAotCQkJCQkgICAgICAgIihKKUwiIEJBU0VDTEFTUyhJRGlzcGF0Y2gpICI7Iik7Ci0gICAgY2xhc3NfSVVua25vd24gPSBpbml0aWFsaXplX2NsYXNzX3JlZmVyZW5jZShlbnYsIGNsYXNzbmFtZV9JVW5rbm93bik7Ci0gICAgaWYgKCFjbGFzc19JVW5rbm93bikgcmV0dXJuIDA7Ci0gICAgbmV3SVVua25vd24gPSBpbml0aWFsaXplX21ldGhvZF9yZWZlcmVuY2UoZW52LCBjbGFzc19JVW5rbm93biwKLQkJCQkJICAgICAgIm5ld0lVbmtub3duIiwKLQkJCQkJICAgICAgIihKKUwiIEJBU0VDTEFTUyhJVW5rbm93bikgIjsiKTsKLQotICAgIGNsYXNzX0lPbGVDb250YWluZXIgPSBpbml0aWFsaXplX2NsYXNzX3JlZmVyZW5jZShlbnYsIGNsYXNzbmFtZV9JT2xlQ29udGFpbmVyKTsKLSAgICBpZiAoIWNsYXNzX0lPbGVDb250YWluZXIpIHJldHVybiAwOwotCi0gICAgY2xhc3NfSUVudW1Vbmtub3duID0gaW5pdGlhbGl6ZV9jbGFzc19yZWZlcmVuY2UoZW52LCBjbGFzc25hbWVfSUVudW1Vbmtub3duKTsKLSAgICBpZiAoIWNsYXNzX0lFbnVtVW5rbm93bikgcmV0dXJuIDA7Ci0gICAgCi0gICAgY2xhc3NfSVJlc291cmNlID0gaW5pdGlhbGl6ZV9jbGFzc19yZWZlcmVuY2UoZW52LCBjbGFzc25hbWVfSVJlc291cmNlKTsKLSAgICBpZiAoIWNsYXNzX0lSZXNvdXJjZSkgcmV0dXJuIDA7Ci0gICAgZ2V0UHRyTWV0aG9kID0gaW5pdGlhbGl6ZV9tZXRob2RfcmVmZXJlbmNlKGVudiwgY2xhc3NfSVJlc291cmNlLAotCQkJCQkgICAgICAgImdldFB0ciIsICIoKUoiKTsKLQotICAgIGNsYXNzX1JlZkNvbnRhaW5lciA9IGluaXRpYWxpemVfY2xhc3NfcmVmZXJlbmNlKGVudiwgY2xhc3NuYW1lX1JlZkNvbnRhaW5lcik7Ci0gICAgaWYgKCFjbGFzc19SZWZDb250YWluZXIpIHJldHVybiAwOwotICAgIGNsYXNzX1JlZlN0cmluZyA9IGluaXRpYWxpemVfY2xhc3NfcmVmZXJlbmNlKGVudiwgY2xhc3NuYW1lX1JlZlN0cmluZyk7Ci0gICAgaWYgKCFjbGFzc19SZWZTdHJpbmcpIHJldHVybiAwOwotICAgIGNsYXNzX1JlZkJ5dGUgPSBpbml0aWFsaXplX2NsYXNzX3JlZmVyZW5jZShlbnYsIGNsYXNzbmFtZV9SZWZCeXRlKTsKLSAgICBpZiAoIWNsYXNzX1JlZkJ5dGUpIHJldHVybiAwOwotICAgIGNsYXNzX1JlZlNob3J0ID0gaW5pdGlhbGl6ZV9jbGFzc19yZWZlcmVuY2UoZW52LCBjbGFzc25hbWVfUmVmU2hvcnQpOwotICAgIGlmICghY2xhc3NfUmVmU2hvcnQpIHJldHVybiAwOwotICAgIGNsYXNzX1JlZkludCA9IGluaXRpYWxpemVfY2xhc3NfcmVmZXJlbmNlKGVudiwgY2xhc3NuYW1lX1JlZkludCk7Ci0gICAgaWYgKCFjbGFzc19SZWZJbnQpIHJldHVybiAwOwotICAgIGNsYXNzX1JlZkxvbmcgPSBpbml0aWFsaXplX2NsYXNzX3JlZmVyZW5jZShlbnYsIGNsYXNzbmFtZV9SZWZMb25nKTsKLSAgICBpZiAoIWNsYXNzX1JlZkxvbmcpIHJldHVybiAwOwotICAgIGNsYXNzX1JlZkZsb2F0ID0gaW5pdGlhbGl6ZV9jbGFzc19yZWZlcmVuY2UoZW52LCBjbGFzc25hbWVfUmVmRmxvYXQpOwotICAgIGlmICghY2xhc3NfUmVmRmxvYXQpIHJldHVybiAwOwotICAgIGNsYXNzX1JlZkRvdWJsZSA9IGluaXRpYWxpemVfY2xhc3NfcmVmZXJlbmNlKGVudiwgY2xhc3NuYW1lX1JlZkRvdWJsZSk7Ci0gICAgaWYgKCFjbGFzc19SZWZEb3VibGUpIHJldHVybiAwOwotICAgIAotICAgIGNsYXNzX2phdmFfbGFuZ19vYmplY3QgPSBpbml0aWFsaXplX2NsYXNzX3JlZmVyZW5jZShlbnYsICJqYXZhL2xhbmcvT2JqZWN0Iik7Ci0gICAgaWYgKCFjbGFzc19qYXZhX2xhbmdfb2JqZWN0KSByZXR1cm4gMDsKLSAgICB0b1N0cmluZyA9IGluaXRpYWxpemVfbWV0aG9kX3JlZmVyZW5jZShlbnYsIGNsYXNzX2phdmFfbGFuZ19vYmplY3QsCi0JCQkJCSAgICJ0b1N0cmluZyIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpOwotICAgIGlmICghdG9TdHJpbmcpIHJldHVybiAwOwotCi0gICAgY2xhc3NfamF2YV9sYW5nX3N0cmluZyA9IGluaXRpYWxpemVfY2xhc3NfcmVmZXJlbmNlKGVudiwgImphdmEvbGFuZy9TdHJpbmciKTsKLSAgICBpZiAoIWNsYXNzX2phdmFfbGFuZ19zdHJpbmcpIHJldHVybiAwOwotCi0gICAgY2xhc3NfamF2YV9sYW5nX2Jvb2xlYW4gPSBpbml0aWFsaXplX2NsYXNzX3JlZmVyZW5jZShlbnYsICJqYXZhL2xhbmcvQm9vbGVhbiIpOwotICAgIGlmICghY2xhc3NfamF2YV9sYW5nX2Jvb2xlYW4pIHJldHVybiAwOwotICAgIGJvb2xlYW5WYWx1ZSA9IGluaXRpYWxpemVfbWV0aG9kX3JlZmVyZW5jZShlbnYsIGNsYXNzX2phdmFfbGFuZ19ib29sZWFuLAotCQkJCQkgICAgICAgImJvb2xlYW5WYWx1ZSIsICIoKVoiKTsKLSAgICBpZiAoIWJvb2xlYW5WYWx1ZSkgcmV0dXJuIDA7Ci0gICAgYm9vbGVhbkNvbnN0cnVjdG9yID0gaW5pdGlhbGl6ZV9tZXRob2RfcmVmZXJlbmNlKGVudiwgY2xhc3NfamF2YV9sYW5nX2Jvb2xlYW4sCi0JCQkJCQkgICAgICI8aW5pdD4iLCAiKFopViIpOwotICAgIGlmICghYm9vbGVhbkNvbnN0cnVjdG9yKSByZXR1cm4gMDsKLQotICAgIGNsYXNzX2phdmFfbGFuZ19ieXRlID0gaW5pdGlhbGl6ZV9jbGFzc19yZWZlcmVuY2UoZW52LCAiamF2YS9sYW5nL0J5dGUiKTsKLSAgICBpZiAoIWNsYXNzX2phdmFfbGFuZ19ieXRlKSByZXR1cm4gMDsKLSAgICBieXRlVmFsdWUgPSBpbml0aWFsaXplX21ldGhvZF9yZWZlcmVuY2UoZW52LCBjbGFzc19qYXZhX2xhbmdfYnl0ZSwKLQkJCQkJICAgICJieXRlVmFsdWUiLCAiKClCIik7Ci0gICAgaWYgKCFieXRlVmFsdWUpIHJldHVybiAwOwotICAgIGJ5dGVDb25zdHJ1Y3RvciA9IGluaXRpYWxpemVfbWV0aG9kX3JlZmVyZW5jZShlbnYsIGNsYXNzX2phdmFfbGFuZ19ieXRlLAotCQkJCQkJICAiPGluaXQ+IiwgIihCKVYiKTsKLSAgICBpZiAoIWJ5dGVDb25zdHJ1Y3RvcikgcmV0dXJuIDA7Ci0KLQotICAgIGNsYXNzX2phdmFfbGFuZ19zaG9ydCA9IGluaXRpYWxpemVfY2xhc3NfcmVmZXJlbmNlKGVudiwgImphdmEvbGFuZy9TaG9ydCIpOwotICAgIGlmICghY2xhc3NfamF2YV9sYW5nX3Nob3J0KSByZXR1cm4gMDsKLSAgICBzaG9ydFZhbHVlID0gaW5pdGlhbGl6ZV9tZXRob2RfcmVmZXJlbmNlKGVudiwgY2xhc3NfamF2YV9sYW5nX3Nob3J0LAotCQkJCQkgICAgICJzaG9ydFZhbHVlIiwgIigpUyIpOwotICAgIGlmICghc2hvcnRWYWx1ZSkgcmV0dXJuIDA7Ci0gICAgc2hvcnRDb25zdHJ1Y3RvciA9IGluaXRpYWxpemVfbWV0aG9kX3JlZmVyZW5jZShlbnYsIGNsYXNzX2phdmFfbGFuZ19zaG9ydCwKLQkJCQkJCSAgIjxpbml0PiIsICIoUylWIik7Ci0gICAgaWYgKCFzaG9ydENvbnN0cnVjdG9yKSByZXR1cm4gMDsKLQotICAgIGNsYXNzX2phdmFfbGFuZ19pbnRlZ2VyID0gaW5pdGlhbGl6ZV9jbGFzc19yZWZlcmVuY2UoZW52LCAiamF2YS9sYW5nL0ludGVnZXIiKTsKLSAgICBpZiAoIWNsYXNzX2phdmFfbGFuZ19pbnRlZ2VyKSByZXR1cm4gMDsKLSAgICBpbnRWYWx1ZSA9IGluaXRpYWxpemVfbWV0aG9kX3JlZmVyZW5jZShlbnYsIGNsYXNzX2phdmFfbGFuZ19pbnRlZ2VyLAotCQkJCQkgICAiaW50VmFsdWUiLCAiKClJIik7Ci0gICAgaWYgKCFpbnRWYWx1ZSkgcmV0dXJuIDA7Ci0gICAgaW50Q29uc3RydWN0b3IgPSBpbml0aWFsaXplX21ldGhvZF9yZWZlcmVuY2UoZW52LCBjbGFzc19qYXZhX2xhbmdfaW50ZWdlciwKLQkJCQkJCSAiPGluaXQ+IiwgIihJKVYiKTsKLSAgICBpZiAoIWludENvbnN0cnVjdG9yKSByZXR1cm4gMDsKLQotICAgIGNsYXNzX2phdmFfbGFuZ19sb25nID0gaW5pdGlhbGl6ZV9jbGFzc19yZWZlcmVuY2UoZW52LCAiamF2YS9sYW5nL0xvbmciKTsKLSAgICBpZiAoIWNsYXNzX2phdmFfbGFuZ19sb25nKSByZXR1cm4gMDsKLSAgICBsb25nVmFsdWUgPSBpbml0aWFsaXplX21ldGhvZF9yZWZlcmVuY2UoZW52LCBjbGFzc19qYXZhX2xhbmdfbG9uZywKLQkJCQkJICAgImxvbmdWYWx1ZSIsICIoKUoiKTsKLSAgICBpZiAoIWxvbmdWYWx1ZSkgcmV0dXJuIDA7Ci0gICAgbG9uZ0NvbnN0cnVjdG9yID0gaW5pdGlhbGl6ZV9tZXRob2RfcmVmZXJlbmNlKGVudiwgY2xhc3NfamF2YV9sYW5nX2xvbmcsCi0JCQkJCQkgICI8aW5pdD4iLCAiKEopViIpOwotICAgIGlmICghbG9uZ0NvbnN0cnVjdG9yKSByZXR1cm4gMDsKLQotICAgIGNsYXNzX2phdmFfbGFuZ19mbG9hdCA9IGluaXRpYWxpemVfY2xhc3NfcmVmZXJlbmNlKGVudiwgImphdmEvbGFuZy9GbG9hdCIpOwotICAgIGlmICghY2xhc3NfamF2YV9sYW5nX2Zsb2F0KSByZXR1cm4gMDsKLSAgICBmbG9hdFZhbHVlID0gaW5pdGlhbGl6ZV9tZXRob2RfcmVmZXJlbmNlKGVudiwgY2xhc3NfamF2YV9sYW5nX2Zsb2F0LAotCQkJCQkgICAgICJmbG9hdFZhbHVlIiwgIigpRiIpOwotICAgIGlmICghZmxvYXRWYWx1ZSkgcmV0dXJuIDA7Ci0gICAgZmxvYXRDb25zdHJ1Y3RvciA9IGluaXRpYWxpemVfbWV0aG9kX3JlZmVyZW5jZShlbnYsIGNsYXNzX2phdmFfbGFuZ19mbG9hdCwKLQkJCQkJCSAgICI8aW5pdD4iLCAiKEYpViIpOwotICAgIGlmICghZmxvYXRDb25zdHJ1Y3RvcikgcmV0dXJuIDA7Ci0KLSAgICBjbGFzc19qYXZhX2xhbmdfZG91YmxlID0gaW5pdGlhbGl6ZV9jbGFzc19yZWZlcmVuY2UoZW52LCAiamF2YS9sYW5nL0RvdWJsZSIpOwotICAgIGlmICghY2xhc3NfamF2YV9sYW5nX2RvdWJsZSkgcmV0dXJuIDA7Ci0gICAgZG91YmxlVmFsdWUgPSBpbml0aWFsaXplX21ldGhvZF9yZWZlcmVuY2UoZW52LCBjbGFzc19qYXZhX2xhbmdfZG91YmxlLAotCQkJCQkgICAgICAiZG91YmxlVmFsdWUiLCAiKClEIik7Ci0gICAgaWYgKCFkb3VibGVWYWx1ZSkgcmV0dXJuIDA7Ci0gICAgZG91YmxlQ29uc3RydWN0b3IgPSBpbml0aWFsaXplX21ldGhvZF9yZWZlcmVuY2UoZW52LCBjbGFzc19qYXZhX2xhbmdfZG91YmxlLAotCQkJCQkJICAgICI8aW5pdD4iLCAiKEQpViIpOwotICAgIGlmICghZG91YmxlQ29uc3RydWN0b3IpIHJldHVybiAwOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLUdVSURfZnJvbV91dWlkYml0cyhqbG9uZyBqdXVpZG1zYiwgamxvbmcganV1aWRsc2IsIEdVSUQgKnBndWlkKQotewotICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBndWlkbXNiID0gKHVuc2lnbmVkIGxvbmcgbG9uZykganV1aWRtc2I7Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIGd1aWRsc2IgPSAodW5zaWduZWQgbG9uZyBsb25nKSBqdXVpZGxzYjsKLSAgICBwZ3VpZC0+RGF0YTEgPSAoZ3VpZG1zYiA+PiAzMikgJiAweEZGRkZGRkZGOwotICAgIHBndWlkLT5EYXRhMiA9IChndWlkbXNiID4+IDE2KSAmIDB4RkZGRjsKLSAgICBwZ3VpZC0+RGF0YTMgPSBndWlkbXNiICYgMHhGRkZGOwotICAgIHBndWlkLT5EYXRhNFswXSA9IChndWlkbHNiID4+IDU2KSAmIDB4RkY7Ci0gICAgcGd1aWQtPkRhdGE0WzFdID0gKGd1aWRsc2IgPj4gNDgpICYgMHhGRjsKLSAgICBwZ3VpZC0+RGF0YTRbMl0gPSAoZ3VpZGxzYiA+PiA0MCkgJiAweEZGOwotICAgIHBndWlkLT5EYXRhNFszXSA9IChndWlkbHNiID4+IDMyKSAmIDB4RkY7Ci0gICAgcGd1aWQtPkRhdGE0WzRdID0gKGd1aWRsc2IgPj4gMjQpICYgMHhGRjsKLSAgICBwZ3VpZC0+RGF0YTRbNV0gPSAoZ3VpZGxzYiA+PiAxNikgJiAweEZGOwotICAgIHBndWlkLT5EYXRhNFs2XSA9IChndWlkbHNiID4+IDgpICYgMHhGRjsKLSAgICBwZ3VpZC0+RGF0YTRbN10gPSBndWlkbHNiICYgMHhGRjsKLX0KLQotd2NoYXJfdCoKLWpvYmplY3RfdG9fc3RyaW5nKEpOSUVudiogZW52LCBqb2JqZWN0IG8pCi17Ci0gICAganN0cmluZyBqcyA9IChqc3RyaW5nKSBlbnYtPkNhbGxPYmplY3RNZXRob2QobywgdG9TdHJpbmcpOwotICAgIGludCBsZW4gPSBlbnYtPkdldFN0cmluZ0xlbmd0aChqcyk7Ci0gICAgd2NoYXJfdCogcHJldCA9ICh3Y2hhcl90KikgbWFsbG9jKHNpemVvZih3Y2hhcl90KSAqIChsZW4gKyAxKSk7Ci0gICAgY29uc3QgamNoYXIqIGpjID0gZW52LT5HZXRTdHJpbmdDaGFycyhqcywgTlVMTCk7Ci0gICAgbWVtY3B5KHByZXQsIGpjLCBsZW4gKiBzaXplb2Yod2NoYXJfdCkpOwotICAgIGVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKGpzLCBqYyk7Ci0gICAgcHJldFtsZW5dID0gMDsKLSAgICB3cHJpbnRmKEwiT2JqOiVzXG4iLCBwcmV0KTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICByZXR1cm4gcHJldDsKLX0KLQotdm9pZAotdGhyb3dfRGlzcGF0Y2hFeGNlcHRpb24oSk5JRW52KiBlbnYsIGNvbnN0IHdjaGFyX3QqIGZtdCwgLi4uKQotewotICAgIHdjaGFyX3QgbWVzc2FnZVsxMDI0XTsKLSAgICB2YV9saXN0IHZsOwotICAgIHZhX3N0YXJ0KHZsLCBmbXQpOwotICAgIGludCBsZW4gPSBfdnNud3ByaW50ZihtZXNzYWdlLCBzaXplb2YobWVzc2FnZSkgLyBzaXplb2Yod2NoYXJfdCkgLSAxLCBmbXQsIHZsKTsKLQotICAgIGptZXRob2RJRCBjb25zdHJ1Y3RvciA9IGVudi0+R2V0TWV0aG9kSUQoY2xhc3NfRGlzcGF0Y2hFeGNlcHRpb24sCi0JCQkJCSAgICAgIjxpbml0PiIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKLSAgICBqdGhyb3dhYmxlIGV4ID0gKGp0aHJvd2FibGUpIGVudi0+TmV3T2JqZWN0KGNsYXNzX0Rpc3BhdGNoRXhjZXB0aW9uLCBjb25zdHJ1Y3RvciwKLQkJCQkJCWVudi0+TmV3U3RyaW5nKChqY2hhciopIG1lc3NhZ2UsIGxlbikpOwotICAgIGVudi0+VGhyb3coZXgpOwotfQotCi1pbnQKLWNoZWNrX2hyZXN1bHQoSk5JRW52KiBlbnYsIEhSRVNVTFQgciwgRVhDRVBJTkZPICpwZXhjZXBJbmZvKQotewotICAgIGlmIChGQUlMRUQocikpIHsKLSAgICAKLSAgICBpZiAociA9PSBESVNQX0VfRVhDRVBUSU9OICYmIHBleGNlcEluZm8gIT0gTlVMTCkgewotCQl0aHJvd19EaXNwYXRjaEV4Y2VwdGlvbihlbnYsIEwiRmFpbGVkLCBGQUNJTElUWTolZCwgQ09ERTolZC4gKCV4KSAlcyIsCi0JCQkJCUhSRVNVTFRfRkFDSUxJVFkociksIEhSRVNVTFRfQ09ERShyKSwgciwgcGV4Y2VwSW5mby0+YnN0ckRlc2NyaXB0aW9uKTsKLQl9IGVsc2UgewotCQl0aHJvd19EaXNwYXRjaEV4Y2VwdGlvbihlbnYsIEwiRmFpbGVkLCBGQUNJTElUWTolZCwgQ09ERTolZC4gKCV4KSAiLAotCQkJCQlIUkVTVUxUX0ZBQ0lMSVRZKHIpLCBIUkVTVUxUX0NPREUociksIHIpOwotCX0KLQotCXJldHVybiAwOwotICAgIH0KLSAgICBpZiAociA9PSBTX0ZBTFNFKSB7Ci0JdGhyb3dfRGlzcGF0Y2hFeGNlcHRpb24oZW52LCBMIlNfRkFMU0UgaXMgcmV0dXJuZWQuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi12b2lkKgotZ2V0UHRyKEpOSUVudiogZW52LCBqb2JqZWN0IG8pCi17Ci0gICAgcmV0dXJuICh2b2lkKikgZW52LT5DYWxsTG9uZ01ldGhvZChvLCBnZXRQdHJNZXRob2QpOwotfQotCi1KTklFbnYqCi1nZXRFbnYoKQotewotICAgIEpOSUVudiogZW52OwotICAgIGlmIChqdm0tPkdldEVudigodm9pZCoqKSAmZW52LCBKTklfVkVSU0lPTl8xXzIpICE9IEpOSV9PSykgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIGVudjsKLX0KLQotCi12b2lkIEpOSUNBTEwKLUphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9Db21TZXJ2aWNlX18xaW5pdGlhbGl6ZQotKEpOSUVudiogZW52LCBqY2xhc3MgY2xzKQotewotICAgIGlmICghaW5pdGlhbGl6ZV9Db21tb24oZW52KSkgcmV0dXJuOwotICAgIGlmICghaW5pdGlhbGl6ZV9JVW5rbm93bihlbnYpKSByZXR1cm47Ci0gICAgSFJFU1VMVCBociA9IENvSW5pdGlhbGl6ZShOVUxMKTsKLSAgICBpZiAoKGhyICE9IFNfT0spICYmIChociAhPSBTX0ZBTFNFKSkgewotCWlmICghY2hlY2tfaHJlc3VsdChlbnYsIGhyLCBOVUxMKSkgcmV0dXJuOwotICAgIH0KLX0KLQotdm9pZCBKTklDQUxMCi1KYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfQ29tU2VydmljZV9fMXVuaW5pdGlhbGl6ZQotKEpOSUVudiogZW52LCBqY2xhc3MgY2xzKQotewotICAgIENvVW5pbml0aWFsaXplKCk7Ci19Ci0KLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9Db21TZXJ2aWNlCi0gKiBNZXRob2Q6ICAgIF9jb0NyZWF0ZUluc3RhbmNlCi0gKiBTaWduYXR1cmU6IChMamF2YS9sYW5nL1N0cmluZztJKUoKLSAqLwotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX0NvbVNlcnZpY2VfXzFjb0NyZWF0ZUluc3RhbmNlCi0gIChKTklFbnYgKmVudiwgamNsYXNzIGNscywganN0cmluZyBqcywgamludCBkd0Nsc0NvbnRleHQpCi17ICAKLSAgICB3Y2hhcl90KiBzdHIgPSBqb2JqZWN0X3RvX3N0cmluZyhlbnYsIGpzKTsKLSAgICAKLSAgICBJVW5rbm93biAqcHRyOwotICAgIENMU0lEIGNsc2lkOwotICAgIElJRCBpaWQ7Ci0JCi0gICAgQ0xTSURGcm9tU3RyaW5nKHN0ciwgJmNsc2lkKTsKLSAgICBmcmVlKHN0cik7Ci0JCi0gICAgQ29DcmVhdGVJbnN0YW5jZShjbHNpZCwgTlVMTCwgZHdDbHNDb250ZXh0LCBJSURfSVVua25vd24sIChMUFZPSUQgKikmcHRyKTsKLSAgICAKLSAgICByZXR1cm4gKGpsb25nKSBwdHI7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL0hhbmRsZXIuY3BwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvSGFuZGxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MTkxYmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvSGFuZGxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICBIYW5kbGVyIEMrKyBwcm94eQotKi8KLQotI2luY2x1ZGUgIkNvbS5oIgotI2luY2x1ZGUgIm9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfSGFuZGxlci5oIgotCi1qbWV0aG9kSUQgZGVmYXVsdEhhbmRsZXJNZXRob2Q7Ci0KLWNsYXNzIEhhbmRsZXIgOiBwdWJsaWMgSURpc3BhdGNoCi17Ci0gIHByaXZhdGU6Ci0gICAgVUxPTkcgcmVmQ291bnQ7Ci0gICAgam9iamVjdCBqb2JqOwotCi0gIHB1YmxpYzoKLSAgICBIYW5kbGVyKCkgeyAKLQlyZWZDb3VudCA9IDA7Ci0Jam9iaiA9IE5VTEw7Ci0gICAgfTsKLSAgICB+SGFuZGxlcigpIHsKLQlpZiAoam9iaikgewotCSAgICBKTklFbnYgKmVudiA9IGdldEVudigpOwotCSAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihqb2JqKTsKLQkgICAgam9iaiA9IE5VTEw7Ci0JfQotICAgIH0KLQotICAgIHZvaWQgaW5pdFJlZihKTklFbnYqIGVudiwgam9iamVjdCBqbG9iaikgewotCWpvYmogPSBlbnYtPk5ld0dsb2JhbFJlZihqbG9iaik7Ci0gICAgfQotCi0gICAgLy8gSVVua25vd24KLSAgICBTVERNRVRIT0RJTVAgUXVlcnlJbnRlcmZhY2UoUkVGSUlELCB2b2lkICoqKTsKLSAgICBTVERNRVRIT0RJTVBfKFVMT05HKSBBZGRSZWYoKSB7Ci0JcmV0dXJuICsrcmVmQ291bnQ7Ci0gICAgfQotICAgIFNURE1FVEhPRElNUF8oVUxPTkcpIFJlbGVhc2UoKSB7Ci0JaW50IGMgPSByZWZDb3VudC0tOwotCWlmIChjIDwgMCkgZGVsZXRlIHRoaXM7Ci0JcmV0dXJuIGM7Ci0gICAgfQotCi0gICAgLy9JRGlzcGF0Y2gKLSAgICBTVERNRVRIT0RJTVAgR2V0VHlwZUluZm9Db3VudChVSU5UKiBwY3RpbmZvKSB7Ci0JcmV0dXJuIEVfTk9USU1QTDsKLSAgICB9Ci0gICAgU1RETUVUSE9ESU1QIEdldFR5cGVJbmZvKFVJTlQgaVRJbmZvLAotCQkJICAgICBMQ0lEIGxjaWQsCi0JCQkgICAgIElUeXBlSW5mbyoqIHBwVEluZm8pIHsKLQlyZXR1cm4gRV9OT1RJTVBMOwotICAgIH0KLSAgICBTVERNRVRIT0RJTVAgR2V0SURzT2ZOYW1lcyhSRUZJSUQgcmlpZCwKLQkJCSAgICAgICBMUE9MRVNUUiAqcmdzek5hbWVzLAotCQkJICAgICAgIFVJTlQgY05hbWVzLAotCQkJICAgICAgIExDSUQgbGNpZCwKLQkJCSAgICAgICBESVNQSUQgKnJnRGlzcElkKTsKLSAgICBTVERNRVRIT0RJTVAgSW52b2tlKERJU1BJRCBkaXNwSWRNZW1iZXIsCi0JCQlSRUZJSUQgcmlpZCwKLQkJCUxDSUQgbGNpZCwKLQkJCVdPUkQgd0ZsYWdzLAotCQkJRElTUFBBUkFNUyAgKnBEaXNwUGFyYW1zLAotCQkJVkFSSUFOVCAgKnBWYXJSZXN1bHQsCi0JCQlFWENFUElORk8gKnBFeGNlcEluZm8sCi0JCQlVSU5UICpwdUFyZ0Vycik7Ci19OwotCi0KLVNURE1FVEhPRElNUAotSGFuZGxlcjo6UXVlcnlJbnRlcmZhY2UoUkVGSUlEIHJpaWQsIHZvaWQqKiBwcHYpCi17Ci0gICAgaWYgKHJpaWQgPT0gSUlEX0lEaXNwYXRjaCkgewotCUFkZFJlZigpOwotCSpwcHYgPSB0aGlzOwotCXJldHVybiBOT0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKLX0KLQotU1RETUVUSE9ESU1QCi1IYW5kbGVyOjpHZXRJRHNPZk5hbWVzKFJFRklJRCByaWlkLAotCQkgICAgICAgT0xFQ0hBUioqIHJnc3pOYW1lcywKLQkJICAgICAgIFVJTlQgY05hbWVzLAotCQkgICAgICAgTENJRCBsY2lkLAotCQkgICAgICAgRElTUElEKiByZ0Rpc3BJZCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNOYW1lczsgaSsrKSB7Ci0JcmdEaXNwSWRbaV0gPSBESVNQSURfVkFMVUU7Ci0gICAgfQotICAgIHJldHVybiBOT0VSUk9SOwotfQotCi1TVERNRVRIT0RJTVAKLUhhbmRsZXI6Okludm9rZShESVNQSUQgZGlzcElkTWVtYmVyLAotCQlSRUZJSUQgcmlpZCwKLQkJTENJRCBsY2lkLAotCQlXT1JEIHdGbGFncywKLQkJRElTUFBBUkFNUyogcERwLAotCQlWQVJJQU5UKiBwVmFyUmVzdWx0LAotCQlFWENFUElORk8qIHBFeGNlcEluZm8sCi0JCVVJTlQqIHB1QXJnRXJyKQotewotICAgIGlmIChkaXNwSWRNZW1iZXIgIT0gRElTUElEX1ZBTFVFKSByZXR1cm4gU19GQUxTRTsKLSAgICBpZiAod0ZsYWdzICYgRElTUEFUQ0hfTUVUSE9EKSByZXR1cm4gU19GQUxTRTsKLQotICAgIEpOSUVudiAqZW52ID0gZ2V0RW52KCk7Ci0gICAgam9iamVjdEFycmF5IGphcmdzID0gZW52LT5OZXdPYmplY3RBcnJheShwRHAtPmNBcmdzLCBjbGFzc19qYXZhX2xhbmdfb2JqZWN0LCBOVUxMKTsKLSAgICBpbnQgaSwgajsKLSAgICBmb3IgKGogPSAwLCBpID0gcERwLT5jQXJncyAtIDE7IGkgPj0gMDsgaS0tLCBqKyspIHsKLQlqb2JqZWN0IGpvID0gdjJqKGVudiwgam9iaiwgJnBEcC0+cmd2YXJnW2ldKTsKLQllbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChqYXJncywgaiwgam8pOwotICAgIH0KLQotICAgIGpvYmplY3QganJvYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2Qoam9iaiwgZGVmYXVsdEhhbmRsZXJNZXRob2QsIGphcmdzKTsKLSAgICBpZiAoIWoydihlbnYsIGpyb2JqLCBwVmFyUmVzdWx0KSkgewotCXJldHVybiBFX0ZBSUw7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBTX09LOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSmF2YSBzaWRlIGluaXRpYWxpemF0aW9uIG5hdGl2ZSBtZXRob2RzLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1qbG9uZyBKTklDQUxMCi1KYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfSGFuZGxlcl9fMWNyZWF0ZUhhbmRsZXIKLShKTklFbnYqIGVudiwgamNsYXNzIGNscywgamxvbmcgaWQpCi17Ci0gICAgaWYgKCFkZWZhdWx0SGFuZGxlck1ldGhvZCkgewotCWRlZmF1bHRIYW5kbGVyTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRChjbHMsICJkZWZhdWx0SGFuZGxlciIsCi0JCQkJCQkiKFtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7Iik7Ci0gICAgfQotICAgIEhhbmRsZXIgKnBoID0gbmV3IEhhbmRsZXIoKTsKLSAgICByZXR1cm4gKGpsb25nKSBwaDsKLX0KLQotdm9pZCBKTklDQUxMCi1KYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfSGFuZGxlcl9fMXNldE9iamVjdAotKEpOSUVudiogZW52LCBqb2JqZWN0IGpvYmosIGpsb25nIHB0cikKLXsKLSAgICBIYW5kbGVyICpwaCA9IChIYW5kbGVyKikgcHRyOwotICAgIHBoLT5pbml0UmVmKGVudiwgam9iaik7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWNvbWNsdXRjaC9JRGlzcGF0Y2guY3BwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvSURpc3BhdGNoLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2NGZmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWNvbWNsdXRjaC9JRGlzcGF0Y2guY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAgSURpc3BhdGNoSW1wbCBDKysgcHJveHkKLSovCi0KLSNpbmNsdWRlICJDb20uaCIKLSNpbmNsdWRlICJvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX2ltcGxfSURpc3BhdGNoSW1wbC5oIgotCi0KLWpsb25nQXJyYXkgSk5JQ0FMTAotSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX2ltcGxfSURpc3BhdGNoSW1wbF9fMWdldElEc09mTmFtZXMKLShKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0ciwgam9iamVjdEFycmF5IGpuYW1lcywgamludCBqbGNpZCkKLXsKLSAgICBMQ0lEIGxjaWQgPSAoTENJRCkgamxjaWQ7Ci0gICAgSURpc3BhdGNoKiBpZGlzcCA9IChJRGlzcGF0Y2gqKSBwdHI7Ci0gICAgaW50IG5hbWVzaXplID0gZW52LT5HZXRBcnJheUxlbmd0aChqbmFtZXMpOwotICAgIGludCBpOwotICAgIE9MRUNIQVIqKiBtZXRob2RuYW1lcyA9IChPTEVDSEFSKiopIGFsbG9jYShzaXplb2YoT0xFQ0hBUiopICogbmFtZXNpemUpOwotICAgIERJU1BJRCogZGlzcGlkcyA9IChESVNQSUQqKSBhbGxvY2Eoc2l6ZW9mKERJU1BJRCkgKiBuYW1lc2l6ZSk7Ci0gICAgamxvbmcqIGpsb25nZGlzcGlkcyA9IChqbG9uZyopIGFsbG9jYShzaXplb2YoamxvbmcpICogbmFtZXNpemUpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lc2l6ZTsgaSsrKSB7Ci0JanN0cmluZyBqbmFtZSA9IChqc3RyaW5nKSBlbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChqbmFtZXMsIGkpOwotCWNvbnN0IGpjaGFyKiBqYyA9IGVudi0+R2V0U3RyaW5nQ2hhcnMoam5hbWUsIE5VTEwpOwotCWludCBsZW4gPSBlbnYtPkdldFN0cmluZ0xlbmd0aChqbmFtZSk7Ci0JT0xFQ0hBUiogc3RyID0gKE9MRUNIQVIqKSBhbGxvY2Eoc2l6ZW9mKE9MRUNIQVIpICogKGxlbiArIDEpKTsKLQltZW1jcHkoc3RyLCBqYywgc2l6ZW9mKE9MRUNIQVIpICogbGVuKTsKLQlzdHJbbGVuXSA9IDA7IC8vIGVuc3VyZSBudWxsIHRlcm1pbmF0aW9uLgotCW1ldGhvZG5hbWVzW2ldID0gc3RyOwotCWVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKGpuYW1lLCBqYyk7Ci0gICAgfQotICAgIEhSRVNVTFQgciA9IGlkaXNwLT5HZXRJRHNPZk5hbWVzKElJRF9OVUxMLCBtZXRob2RuYW1lcywgbmFtZXNpemUsIGxjaWQsIGRpc3BpZHMpOwotICAgIGlmIChGQUlMRUQocikpIHJldHVybiBOVUxMOwotICAgIGpsb25nQXJyYXkgamRpc3BpZHMgPSBlbnYtPk5ld0xvbmdBcnJheShuYW1lc2l6ZSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5hbWVzaXplOyBpKyspIHsKLQlqbG9uZ2Rpc3BpZHNbaV0gPSBkaXNwaWRzW2ldOwotICAgIH0KLSAgICBlbnYtPlNldExvbmdBcnJheVJlZ2lvbihqZGlzcGlkcywgMCwgbmFtZXNpemUsIGpsb25nZGlzcGlkcyk7Ci0gICAgcmV0dXJuIGpkaXNwaWRzOwotfQotCi1qb2JqZWN0IEpOSUNBTEwKLUphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9pbXBsX0lEaXNwYXRjaEltcGxfXzFpbnZva2UKLShKTklFbnYgKmVudiwgam9iamVjdCBqaWRpc3AsIGpsb25nIHB0ciwgamxvbmcgZGlzcGlkLCBqaW50IGpsY2lkLCBqaW50IGZsYWcsIGpvYmplY3RBcnJheSBqYXJncykKLXsKLSAgICBMQ0lEIGxjaWQgPSAoTENJRCkgamxjaWQ7Ci0gICAgSURpc3BhdGNoKiBpZGlzcCA9IChJRGlzcGF0Y2gqKSBwdHI7Ci0gICAgVUlOVCBhcmdfaWR4ID0gKFVJTlQpIC0xOwotICAgIGludCBpLCBqLCBhcmdzaXplOwotICAgIFZBUklBTlQqIHZhcmdzOwotCi0gICAgaWYgKCFqYXJncykgewotCWFyZ3NpemUgPSAwOwotCXZhcmdzID0gTlVMTDsKLSAgICB9IGVsc2UgewotCWFyZ3NpemUgPSBlbnYtPkdldEFycmF5TGVuZ3RoKGphcmdzKTsKLQlpZiAoYXJnc2l6ZSA9PSAwKSB7Ci0JICAgIHZhcmdzID0gTlVMTDsKLQl9IGVsc2UgewotCSAgICB2YXJncyA9IChWQVJJQU5UKikgYWxsb2NhKHNpemVvZihWQVJJQU5UKSAqIGFyZ3NpemUpOwotCSAgICBmb3IgKGkgPSAwLCBqID0gYXJnc2l6ZSAtIDE7IGkgPCBhcmdzaXplOyBpKyssIGotLSkgewotCQlqb2JqZWN0IGphcmcgPSBlbnYtPkdldE9iamVjdEFycmF5RWxlbWVudChqYXJncywgaSk7Ci0JCVZhcmlhbnRJbml0KCZ2YXJnc1tqXSk7Ci0JCWlmICghajJ2KGVudiwgamFyZywgJnZhcmdzW2pdKSkgewotCQkgICAgZm9yIChqKysgOyBqIDwgYXJnc2l6ZTsgaisrKSB7Ci0JCQlqY192YXJpYW50X2NsZWFyKCZ2YXJnc1tqXSwgZmFsc2UpOwotCQkgICAgfQotCQkgICAgcmV0dXJuIE5VTEw7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBESVNQUEFSQU1TIGRwOwotICAgIGRwLnJndmFyZyA9IHZhcmdzOwotICAgIGRwLmNBcmdzID0gYXJnc2l6ZTsKLSAgICBkcC5yZ2Rpc3BpZE5hbWVkQXJncyA9IE5VTEw7Ci0gICAgZHAuY05hbWVkQXJncyA9IDA7Ci0gICAgVkFSSUFOVCB2cjsKLSAgICBWYXJpYW50SW5pdCgmdnIpOwotICAgIC8vIFRPRE86IGRlYWwgd2l0aCBFeGNlcEluZm8KLSAgICBIUkVTVUxUIHI7Ci0gICAgRVhDRVBJTkZPIGV4Y2VwSW5mbzsKLSAgICBfX3RyeSB7Ci0JciA9IGlkaXNwLT5JbnZva2UoZGlzcGlkLCBJSURfTlVMTCwgbGNpZCwgZmxhZywgJmRwLCAmdnIsICZleGNlcEluZm8sICZhcmdfaWR4KTsKLSAgICB9IF9fZXhjZXB0KEdldEV4Y2VwdGlvbkNvZGUoKSA9PSBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTikgewotCWZvciAoaSA9IDA7IGkgPCBhcmdzaXplOyBpKyspIHsKLQkgICAgamNfdmFyaWFudF9jbGVhcigmdmFyZ3NbaV0sIGZhbHNlKTsKLQl9Ci0JamNfdmFyaWFudF9jbGVhcigmdnIsIHRydWUpOwotCXRocm93X0Rpc3BhdGNoRXhjZXB0aW9uKGVudiwgTCJBY2Nlc3MgVmlvbGF0aW9uIik7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBhcmdzaXplOyBpKyspIHsKLQlqY192YXJpYW50X2NsZWFyKCZ2YXJnc1tpXSwgZmFsc2UpOwotICAgIH0KLSAgICBpZiAoIWNoZWNrX2hyZXN1bHQoZW52LCByLCAmZXhjZXBJbmZvKSkgewotCWpjX3ZhcmlhbnRfY2xlYXIoJnZyLCB0cnVlKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgam9iamVjdCBqciA9IHYyaihlbnYsIGppZGlzcCwgJnZyKTsKLSAgICBqY192YXJpYW50X2NsZWFyKCZ2ciwgZmFsc2UpOwotICAgIHJldHVybiBqcjsKLX0KLQotdm9pZCBKTklDQUxMCi1KYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JRGlzcGF0Y2hJbXBsX18xcHV0Ci0oSk5JRW52KiBlbnYsIGpvYmplY3QgamlkaXNwLCBqbG9uZyBwdHIsIGpsb25nIGRpc3BpZCwgamludCBqbGNpZCwgam9iamVjdCBqdmFsKQotewotICAgIExDSUQgbGNpZCA9IChMQ0lEKSBqbGNpZDsKLSAgICBJRGlzcGF0Y2gqIGlkaXNwID0gKElEaXNwYXRjaCopIHB0cjsKLSAgICBVSU5UIGFyZ19pZHggPSAoVUlOVCkgLTE7Ci0gICAgVkFSSUFOVCB2YXJnOwotICAgIFZhcmlhbnRJbml0KCZ2YXJnKTsKLSAgICBpZiAoIWoydihlbnYsIGp2YWwsICZ2YXJnKSkgewotCWpjX3ZhcmlhbnRfY2xlYXIoJnZhcmcsIGZhbHNlKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgRElTUElEIHRtcGRpc3BpZCA9IERJU1BJRF9QUk9QRVJUWVBVVDsKLSAgICBESVNQUEFSQU1TIGRwOwotICAgIGRwLnJndmFyZyA9ICZ2YXJnOwotICAgIGRwLmNBcmdzID0gMTsKLSAgICBkcC5yZ2Rpc3BpZE5hbWVkQXJncyA9ICZ0bXBkaXNwaWQ7Ci0gICAgZHAuY05hbWVkQXJncyA9IDE7Ci0KLSAgICBXT1JEIGZsYWc7Ci0gICAgaWYgKHZhcmcudnQgJiBWVF9CWVJFRikgewotCWZsYWcgPSBESVNQQVRDSF9QUk9QRVJUWVBVVFJFRjsKLSAgICB9IGVsc2UgewotCWZsYWcgPSBESVNQQVRDSF9QUk9QRVJUWVBVVDsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBkZWFsIHdpdGggRXhjZXBJbmZvCi0gICAgRVhDRVBJTkZPIGV4Y2VwSW5mbzsKLSAgICBIUkVTVUxUIHIgPSBpZGlzcC0+SW52b2tlKGRpc3BpZCwgSUlEX05VTEwsIGxjaWQsIGZsYWcsCi0JCQkgICAgICAmZHAsIE5VTEwsICZleGNlcEluZm8sICZhcmdfaWR4KTsKLQotICAgIGpjX3ZhcmlhbnRfY2xlYXIoJnZhcmcsIGZhbHNlKTsKLSAgICBjaGVja19ocmVzdWx0KGVudiwgciwgJmV4Y2VwSW5mbyk7Ci19Ci0KLWpvYmplY3QKLWNyZWF0ZV9JRGlzcGF0Y2goSk5JRW52KiBlbnYsIGpvYmplY3QgamlkaXNwLCBJRGlzcGF0Y2gqIGlkaXNwKQotewotICAgIGlmICghaWRpc3ApIHJldHVybiBOVUxMOwotICAgIHJlbGVhc2VJblF1ZXVlcygpOwotICAgIHJldHVybiBlbnYtPkNhbGxPYmplY3RNZXRob2QoamlkaXNwLCBuZXdJRGlzcGF0Y2gsIChqbG9uZykgaWRpc3ApOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvSUVudW1Vbmtub3duLmNwcCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL0lFbnVtVW5rbm93bi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NDNjNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvSUVudW1Vbmtub3duLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAgSUVudW1Vbmtub3duSW1wbCBDKysgcHJveHkKLSovCi0KLSNpbmNsdWRlICJDb20uaCIKLSNpbmNsdWRlICJvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX2ltcGxfSUVudW1Vbmtub3duSW1wbC5oIgotCi1qb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JRW51bVVua25vd25JbXBsX18xbmV4dAotKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamxvbmcgcHRyLCBqaW50IG51bSkKLXsKLSAgICBJRW51bVVua25vd24qIGlldSA9IChJRW51bVVua25vd24qKSBwdHI7Ci0gICAgVUxPTkcgY2VsdCA9IChVTE9ORykgbnVtOwotICAgIElVbmtub3duICoqcmdlbHQgPSAoSVVua25vd24qKikgYWxsb2NhKGNlbHQgKiBzaXplb2YoSVVua25vd24qKSk7Ci0gICAgVUxPTkcgcGNlbHRGZXRjaGVkOwotICAgIGludCBpOwotCi0gICAgSFJFU1VMVCByID0gaWV1LT5OZXh0KGNlbHQsIHJnZWx0LCAmcGNlbHRGZXRjaGVkKTsKLSAgICBpZiAocGNlbHRGZXRjaGVkIDw9IDApIHJldHVybiBOVUxMOwotICAgIGlmIChjZWx0IDwgcGNlbHRGZXRjaGVkKSByZXR1cm4gTlVMTDsKLQotICAgIGpvYmplY3RBcnJheSBhcnJheSA9IGVudi0+TmV3T2JqZWN0QXJyYXkocGNlbHRGZXRjaGVkLCBjbGFzc19JVW5rbm93biwgTlVMTCk7Ci0gIAotICAgIGZvciAoaSA9IDA7IGkgPCBwY2VsdEZldGNoZWQ7IGkrKykgewotCWVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGFycmF5LCBpLCBjcmVhdGVfSVVua25vd24oZW52LCBvYmosIHJnZWx0W2ldKSk7Ci0gICAgfQotICAgIHJldHVybiBhcnJheTsKLX0KLQotamJvb2xlYW4gSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JRW51bVVua25vd25JbXBsX18xcmVzZXQKLShKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0cikKLXsKLSAgICBJRW51bVVua25vd24qIGlldSA9IChJRW51bVVua25vd24qKSBwdHI7Ci0gICAgSFJFU1VMVCByID0gaWV1LT5SZXNldCgpOwotICAgIHJldHVybiByID09IFNfT0s7Ci19Ci0KLWpib29sZWFuIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX2ltcGxfSUVudW1Vbmtub3duSW1wbF9fMXNraXAKLShKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0ciwgamludCBudW0pCi17Ci0gICAgSUVudW1Vbmtub3duKiBpZXUgPSAoSUVudW1Vbmtub3duKikgcHRyOwotICAgIFVMT05HIGNlbHQgPSAoVUxPTkcpIG51bTsKLSAgICBIUkVTVUxUIHIgPSBpZXUtPlNraXAoY2VsdCk7Ci0gICAgcmV0dXJuIHIgPT0gU19PSzsKLX0KLQotam9iamVjdCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9pbXBsX0lFbnVtVW5rbm93bkltcGxfXzFfMWNsb25lCi0oSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbG9uZyBwdHIpCi17Ci0gICAgSUVudW1Vbmtub3duKiBpZXUgPSAoSUVudW1Vbmtub3duKikgcHRyOwotICAgIElFbnVtVW5rbm93biogcHBlbnVtOwotICAgIEhSRVNVTFQgciA9IGlldS0+Q2xvbmUoJnBwZW51bSk7Ci0gICAgaWYgKEZBSUxFRChyKSkgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIGNyZWF0ZV9JVW5rbm93bihlbnYsIG9iaiwgcHBlbnVtKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL0lPbGVDb250YWluZXIuY3BwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvSU9sZUNvbnRhaW5lci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNmEwYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvSU9sZUNvbnRhaW5lci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICBJT2xlQ29udGFpbmVySW1wbCBDKysgcHJveHkKLSovCi0KLSNpbmNsdWRlICJDb20uaCIKLSNpbmNsdWRlICJvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX2ltcGxfSU9sZUNvbnRhaW5lckltcGwuaCIKLQotam9iamVjdCAKLWNyZWF0ZV9JRW51bVVua25vd24oSk5JRW52KiBlbnYsIGpvYmplY3QgamlvbGUsIElFbnVtVW5rbm93biogaWV1KTsKLQotam9iamVjdCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9pbXBsX0lPbGVDb250YWluZXJJbXBsX18xZW51bU9iamVjdHMKLShKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0ciwgamludCBmbGFncykgCi17Ci0gICAgSU9sZUNvbnRhaW5lciogaW9sZSA9IChJT2xlQ29udGFpbmVyKikgcHRyOwotICAgIERXT1JEIGdyZkZsYWdzID0gKERXT1JEKSBmbGFnczsKLSAgICBJRW51bVVua25vd24gKnBlbnVtOwotCi0gICAgSFJFU1VMVCByID0gaW9sZS0+RW51bU9iamVjdHMoZ3JmRmxhZ3MsICZwZW51bSk7Ci0gICAgaWYgKHIgIT0gU19PSykgcmV0dXJuIE5VTEw7Ci0KLSAgICBwZW51bS0+QWRkUmVmKCk7Ci0KLSAgICBqb2JqZWN0IGppZXUgPSBjcmVhdGVfSVVua25vd24oZW52LCBvYmosIHBlbnVtKTsKLSAgICByZXR1cm4gamlldTsKLX0KLQotamJvb2xlYW4gSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JT2xlQ29udGFpbmVySW1wbF9fMWxvY2tDb250YWluZXIKLShKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0ciwgamJvb2xlYW4gbG9jaykKLXsKLSAgICBJT2xlQ29udGFpbmVyKiBpb2xlID0gKElPbGVDb250YWluZXIqKSBwdHI7Ci0gICAgQk9PTCBmTG9jayA9IChCT09MKSBsb2NrOwotCi0gICAgSFJFU1VMVCByID0gaW9sZS0+TG9ja0NvbnRhaW5lcihmTG9jayk7Ci0gICAgcmV0dXJuIHIgPT0gU19PSzsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL0lTZXJ2aWNlUHJvdmlkZXIuY3BwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvSVNlcnZpY2VQcm92aWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Njg2ZDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvSVNlcnZpY2VQcm92aWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiQ29tLmgiCi0jaW5jbHVkZSAib3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9pbXBsX0lTZXJ2aWNlUHJvdmlkZXJJbXBsLmgiCi0KLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9pbXBsX0lTZXJ2aWNlUHJvdmlkZXJJbXBsCi0gKiBNZXRob2Q6ICAgIF9RdWVyeVNlcnZpY2UKLSAqIFNpZ25hdHVyZTogKEpKSkpKKUxvcmcvZWNsaXBzZS9hY3RmL3V0aWwvY29tY2x1dGNoL3dpbjMyL0lVbmtub3duOwotICovCi1KTklFWFBPUlQgam9iamVjdCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9pbXBsX0lTZXJ2aWNlUHJvdmlkZXJJbXBsX18xUXVlcnlTZXJ2aWNlCi0gIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0ciwgamxvbmcgbXNiMSwgamxvbmcgbHNiMSwgamxvbmcgbXNiMiwgamxvbmcgbHNiMikKLXsKLSAgICBJU2VydmljZVByb3ZpZGVyKiBpdW5rID0gKElTZXJ2aWNlUHJvdmlkZXIqKSBwdHI7Ci0gICAgSUlEIGlpZDEsIGlpZDI7Ci0gICAgR1VJRF9mcm9tX3V1aWRiaXRzKG1zYjEsIGxzYjEsICZpaWQxKTsKLSAgICBHVUlEX2Zyb21fdXVpZGJpdHMobXNiMiwgbHNiMiwgJmlpZDIpOwotICAgIAotICAgIHZvaWQqIHByZXRvYmo7Ci0KLSAgICBIUkVTVUxUIHIgPSBpdW5rLT5RdWVyeVNlcnZpY2UoaWlkMSwgaWlkMiwgJnByZXRvYmopOwotICAgIGlmICghY2hlY2tfaHJlc3VsdChlbnYsIHIsIE5VTEwpKSByZXR1cm4gTlVMTDsKLQotICAgIHJldHVybiBjcmVhdGVfSVVua25vd24oZW52LCBvYmosIChJVW5rbm93biopIHByZXRvYmopOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL0lVbmtub3duLmNwcCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL0lVbmtub3duLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkY2I4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWNvbWNsdXRjaC9JVW5rbm93bi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICBJVW5rbm93bkltcGwgQysrIHByb3h5Ci0qLwotCi0jaW5jbHVkZSAiQ29tLmgiCi0jaW5jbHVkZSAib3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9pbXBsX0lVbmtub3duSW1wbC5oIgotCi1zdGF0aWMgaW50IHJlbGVhc2VXYWl0UXVldWVzU2l6ZTsKLXN0YXRpYyBpbnQgcmVsZWFzZVdhaXRRdWV1ZXNJZHg7Ci1zdGF0aWMgSVVua25vd24qKiByZWxlYXNlV2FpdFF1ZXVlczsKLXN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIGNyaXRTZWNXYWl0UXVldWU7Ci1zdGF0aWMgaW50IGFkZEluUXVldWUoSVVua25vd24gKnBpdW5rKTsKLQotamludCBKTklDQUxMCi1KYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JVW5rbm93bkltcGxfXzFyZWxlYXNlCi0oSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLCBqbG9uZyBwdHIpCi17Ci0gICAgSVVua25vd24qIGl1bmsgPSAoSVVua25vd24qKSBwdHI7Ci0gICAgcmV0dXJuIGl1bmstPlJlbGVhc2UoKTsKLX0KLQotamludCBKTklDQUxMCi1KYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JVW5rbm93bkltcGxfXzFhZGRSZWYKLShKTklFbnYqIGVudiwgam9iamVjdCBvYmosIGpsb25nIHB0cikKLXsKLSAgICBJVW5rbm93biogaXVuayA9IChJVW5rbm93biopIHB0cjsKLSAgICByZXR1cm4gaXVuay0+QWRkUmVmKCk7Ci19Ci0KLXZvaWQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JVW5rbm93bkltcGxfXzFhZGRSZWxlYXNlV2FpdFF1ZXVlCi0oSk5JRW52KiBlbnYsIGpjbGFzcyBqY2xzLCBqbG9uZyBwdHIpCi17Ci0gICAgSVVua25vd24qIGl1bmsgPSAoSVVua25vd24qKSBwdHI7Ci0gICAgYWRkSW5RdWV1ZShpdW5rKTsKLX0KLQotam9iamVjdCBKTklDQUxMCi1KYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JVW5rbm93bkltcGxfXzFxdWVyeUludGVyZmFjZQotKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaiwgamxvbmcgcHRyLCBqbG9uZyBqaWlkbXNiLCBqbG9uZyBqaWlkbHNiKQotewotICAgIElVbmtub3duKiBpdW5rID0gKElVbmtub3duKikgcHRyOwotICAgIElJRCBpaWQ7Ci0gICAgR1VJRF9mcm9tX3V1aWRiaXRzKGppaWRtc2IsIGppaWRsc2IsICZpaWQpOwotICAgIHZvaWQgKiBwcmV0b2JqOwotCi0gICAgSFJFU1VMVCByID0gaXVuay0+UXVlcnlJbnRlcmZhY2UoaWlkLCAmcHJldG9iaik7Ci0gICAgaWYgKCFjaGVja19ocmVzdWx0KGVudiwgciwgTlVMTCkpIHJldHVybiBOVUxMOwotCi0gICAgcmV0dXJuIGNyZWF0ZV9JVW5rbm93bihlbnYsIG9iaiwgKElVbmtub3duKikgcHJldG9iaik7Ci19Ci0KLWpvYmplY3QKLWNyZWF0ZV9JVW5rbm93bihKTklFbnYqIGVudiwgam9iamVjdCBqaXVuaywgSVVua25vd24qIGl1bmspCi17Ci0gICAgcmVsZWFzZUluUXVldWVzKCk7Ci0gICAgaWYgKCFpdW5rKSByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGppdW5rLCBuZXdJVW5rbm93biwgKGpsb25nKSBpdW5rKTsKLX0KLQotc3RhdGljIGludAotZW5sYXJnZV9xdWV1ZXNpemUoKQotewotICAgIHJlbGVhc2VXYWl0UXVldWVzU2l6ZSAqPSAyOwotICAgIHJlbGVhc2VXYWl0UXVldWVzID0gKElVbmtub3duKiopIHJlYWxsb2MocmVsZWFzZVdhaXRRdWV1ZXMsCi0JCQkJCSAgICAgc2l6ZW9mKElVbmtub3duKikgKiByZWxlYXNlV2FpdFF1ZXVlc1NpemUpOwotICAgIGlmICghcmVsZWFzZVdhaXRRdWV1ZXMpIHJldHVybiAwOwotICAgIHJldHVybiAxOwotfQotCi1pbnQKLXJlbGVhc2VJblF1ZXVlcygpCi17Ci0gICAgaWYgKHJlbGVhc2VXYWl0UXVldWVzSWR4ID4gMCkgewotCUVudGVyQ3JpdGljYWxTZWN0aW9uKCZjcml0U2VjV2FpdFF1ZXVlKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHJlbGVhc2VXYWl0UXVldWVzSWR4OyBpKyspIHsKLQkgICAgcmVsZWFzZVdhaXRRdWV1ZXNbaV0tPlJlbGVhc2UoKTsKLQl9Ci0JcmVsZWFzZVdhaXRRdWV1ZXNJZHggPSAwOwotCUxlYXZlQ3JpdGljYWxTZWN0aW9uKCZjcml0U2VjV2FpdFF1ZXVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWFkZEluUXVldWUoSVVua25vd24gKnBpdW5rKQotewotICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZjcml0U2VjV2FpdFF1ZXVlKTsKLSAgICBpZiAocmVsZWFzZVdhaXRRdWV1ZXNJZHggPT0gcmVsZWFzZVdhaXRRdWV1ZXNTaXplKSB7Ci0JZW5sYXJnZV9xdWV1ZXNpemUoKTsKLSAgICB9Ci0gICAgcmVsZWFzZVdhaXRRdWV1ZXNbcmVsZWFzZVdhaXRRdWV1ZXNJZHgrK10gPSBwaXVuazsKLSAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmY3JpdFNlY1dhaXRRdWV1ZSk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWludAotaW5pdGlhbGl6ZV9JVW5rbm93bihKTklFbnYqIGVudikKLXsKLSAgICByZWxlYXNlV2FpdFF1ZXVlc0lkeCA9IDA7Ci0gICAgcmVsZWFzZVdhaXRRdWV1ZXNTaXplID0gNDsKLSAgICByZWxlYXNlV2FpdFF1ZXVlcyA9IChJVW5rbm93bioqKSBtYWxsb2Moc2l6ZW9mKElVbmtub3duKikgKiByZWxlYXNlV2FpdFF1ZXVlc1NpemUpOwotICAgIGlmICghcmVsZWFzZVdhaXRRdWV1ZXMpIHJldHVybiAwOwotICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJmNyaXRTZWNXYWl0UXVldWUpOwotICAgIHJldHVybiAxOwotfQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL0lVcmxIaXN0b3J5U3RnMi5jcHAgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWNvbWNsdXRjaC9JVXJsSGlzdG9yeVN0ZzIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzExMmEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL0lVcmxIaXN0b3J5U3RnMi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICBJVXJsSGlzdG9yeVN0ZzJJbXBsIEMrKyBwcm94eQotKi8KLSNpbmNsdWRlIDxhdGxiYXNlLmg+Ci0jaW5jbHVkZSA8c2hsb2JqLmg+Ci0jaW5jbHVkZSA8VXJsSGlzdC5oPgotI2luY2x1ZGUgIm9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JVXJsSGlzdG9yeVN0ZzJJbXBsLmgiCi0KLWpsb25nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX2ltcGxfSVVybEhpc3RvcnlTdGcySW1wbF9fMWluaXRpYWxpemUKLShKTklFbnYgKmVudiwgam9iamVjdCBvYmopCi17Ci0gICAgSVVybEhpc3RvcnlTdGcyKiBwVXJsSGlzdG9yeVN0ZzIgPSBOVUxMOwotICAgIEhSRVNVTFQgaHIgPSBDb0NyZWF0ZUluc3RhbmNlKENMU0lEX0NVcmxIaXN0b3J5LAotCQkJCSAgTlVMTCwgQ0xTQ1RYX0lOUFJPQywgSUlEX0lVcmxIaXN0b3J5U3RnMiwKLQkJCQkgICh2b2lkKiopJnBVcmxIaXN0b3J5U3RnMik7Ci0gICAgcmV0dXJuIChqbG9uZykgcFVybEhpc3RvcnlTdGcyOwotfQotCi1qYm9vbGVhbiBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9pbXBsX0lVcmxIaXN0b3J5U3RnMkltcGxfXzFpc1Zpc2l0ZWQKLShKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0ciwganN0cmluZyBzdHIpCi17Ci0gICAgSVVybEhpc3RvcnlTdGcyKiBwVXJsSGlzdG9yeVN0ZzIgPSAoSVVybEhpc3RvcnlTdGcyKikgcHRyOwotICAKLSAgICBpbnQgbGVuID0gZW52LT5HZXRTdHJpbmdMZW5ndGgoc3RyKTsKLSAgICBjb25zdCBqY2hhciogamMgPSBlbnYtPkdldFN0cmluZ0NoYXJzKHN0ciwgTlVMTCk7Ci0gICAgQlNUUiBic3RyID0gU3lzQWxsb2NTdHJpbmdMZW4oKE9MRUNIQVIqKSBqYywgbGVuKTsKLSAgICBlbnYtPlJlbGVhc2VTdHJpbmdDaGFycyhzdHIsIGpjKTsKLQotICAgIFNUQVRVUkwgc3RhdDsKLSAgICBIUkVTVUxUIHIgPSBwVXJsSGlzdG9yeVN0ZzItPlF1ZXJ5VXJsKGJzdHIsIFNUQVRVUkxfUVVFUllGTEFHX1RPUExFVkVMLCAmc3RhdCk7Ci0gICAgU3lzRnJlZVN0cmluZyhic3RyKTsKLSAgICBpZiAoRkFJTEVEKHIpKSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHN0YXQucHdjc1VybCAhPSBOVUxMOwotfQotCi12b2lkIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX2ltcGxfSVVybEhpc3RvcnlTdGcySW1wbF9fMXJlbGVhc2UKLShKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0cikKLXsKLSAgICBJVXJsSGlzdG9yeVN0ZzIqIHBVcmxIaXN0b3J5U3RnMiA9IChJVXJsSGlzdG9yeVN0ZzIqKSBwdHI7Ci0gICAgcFVybEhpc3RvcnlTdGcyLT5SZWxlYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWNvbWNsdXRjaC9KQ1R5cGVCcmlkZ2UuY3BwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvSkNUeXBlQnJpZGdlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZlY2E5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWNvbWNsdXRjaC9KQ1R5cGVCcmlkZ2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIERhaXN1a2UgU0FUTwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICBKYXZhIDwtPiBDT00gVHlwZSBCcmlkZ2UKLSovCi0jaW5jbHVkZSAiQ29tLmgiCi0KLS8qCi0gIFZUX05VTEwKLSAgVlRfQk9PTAotICBWVF9CU1RSCi0gIFZUX0NZCi0gIFZUX0RBVEUKLSAgVlRfRElTUEFUQ0gKLSAgVlRfRU1QVFkKLSAgVlRfRVJST1IKLSAgVlRfSTEKLSAgVlRfSTIKLSAgVlRfSTQKLSAgVlRfSU5UCi0gIFZUX0k4Ci0gIFZUX1I0Ci0gIFZUX1I4Ci0gIFZUX1VJMQotICBWVF9VSTIKLSAgVlRfVUk0Ci0gIFZUX1VJTlQKLSAgVlRfVU5LTk9XTgotICBWVF9CT09MIHwgVlRfQllSRUYKLSAgVlRfQlNUUiB8IFZUX0JZUkVGCi0gIFZUX0NZIHwgVlRfQllSRUYKLSAgVlRfREFURSB8IFZUX0JZUkVGCi0gIFZUX0RFQ0lNQUwgfCBWVF9CWVJFRgotICBWVF9ESVNQQVRDSCB8IFZUX0JZUkVGCi0gIFZUX0VSUk9SIHwgVlRfQllSRUYKLSAgVlRfSTEgfCBWVF9CWVJFRgotICBWVF9JMiB8IFZUX0JZUkVGCi0gIFZUX0k0IHwgVlRfQllSRUYKLSAgVlRfSU5UIHwgVlRfQllSRUYKLSAgVlRfSTggfCBWVF9CWVJFRgotICBWVF9SNCB8IFZUX0JZUkVGCi0gIFZUX1I4IHwgVlRfQllSRUYKLSAgVlRfVUkxIHwgVlRfQllSRUYKLSAgVlRfVUkyIHwgVlRfQllSRUYKLSAgVlRfVUk0IHwgVlRfQllSRUYKLSAgVlRfVUlOVCB8IFZUX0JZUkVGCi0gIFZUX1VOS05PV04gfCBWVF9CWVJFRgotICBWVF9WQVJJQU5UIHwgVlRfQllSRUYKLSAgVlRfR1VJRCB8IFZUX0JZUkVGCi0gIFZUX0FSUkFZIHwgKgotKi8KLQotaW50IGoydihKTklFbnYqIGVudiwgam9iamVjdCBvLCBWQVJJQU5UKiB2KQotewotICAgIGlmICghbykgewotCQl2LT52dCA9IFZUX05VTEw7Ci0JCXJldHVybiAxOwotICAgIH0KLSAgICBpZiAoZW52LT5Jc0luc3RhbmNlT2YobywgY2xhc3NfamF2YV9sYW5nX3N0cmluZykpIHsKLQkJanN0cmluZyBqcyA9IChqc3RyaW5nKSBvOwotCQl2LT52dCA9IFZUX0JTVFI7Ci0JCWludCBsZW4gPSBlbnYtPkdldFN0cmluZ0xlbmd0aChqcyk7Ci0JCWNvbnN0IGpjaGFyKiBqYyA9IGVudi0+R2V0U3RyaW5nQ2hhcnMoanMsIE5VTEwpOwotCQl2LT5ic3RyVmFsID0gU3lzQWxsb2NTdHJpbmdMZW4oKE9MRUNIQVIqKSBqYywgbGVuKTsKLQkJZW52LT5SZWxlYXNlU3RyaW5nQ2hhcnMoanMsIGpjKTsKLSAgICB9IGVsc2UgaWYgKGVudi0+SXNJbnN0YW5jZU9mKG8sIGNsYXNzX0lEaXNwYXRjaCkpIHsKLQkJdi0+dnQgPSBWVF9ESVNQQVRDSDsKLQkJdi0+cGRpc3BWYWwgPSAoSURpc3BhdGNoKikgZ2V0UHRyKGVudiwgbyk7Ci0gICAgfSBlbHNlIGlmIChlbnYtPklzSW5zdGFuY2VPZihvLCBjbGFzc19JVW5rbm93bikpIHsKLQkJdi0+dnQgPSBWVF9VTktOT1dOOwotCQl2LT5wdW5rVmFsID0gKElVbmtub3duKikgZ2V0UHRyKGVudiwgbyk7Ci0gICAgfSBlbHNlIGlmIChlbnYtPklzSW5zdGFuY2VPZihvLCBjbGFzc19qYXZhX2xhbmdfYm9vbGVhbikpIHsKLQkJdi0+dnQgPSBWVF9CT09MOwotCQl2LT5ib29sVmFsID0gZW52LT5DYWxsQm9vbGVhbk1ldGhvZChvLCBib29sZWFuVmFsdWUpOwotICAgIH0gZWxzZSBpZiAoZW52LT5Jc0luc3RhbmNlT2YobywgY2xhc3NfamF2YV9sYW5nX2ludGVnZXIpKSB7Ci0JCXYtPnZ0ID0gVlRfSTQ7Ci0JCXYtPmxWYWwgPSBlbnYtPkNhbGxJbnRNZXRob2QobywgaW50VmFsdWUpOwotICAgIH0gZWxzZSBpZiAoZW52LT5Jc0luc3RhbmNlT2YobywgY2xhc3NfamF2YV9sYW5nX2J5dGUpKSB7Ci0JCXYtPnZ0ID0gVlRfVUkxOwotCQl2LT5iVmFsID0gKEJZVEUpIGVudi0+Q2FsbEJ5dGVNZXRob2QobywgYnl0ZVZhbHVlKTsKLSAgICB9IGVsc2UgaWYgKGVudi0+SXNJbnN0YW5jZU9mKG8sIGNsYXNzX2phdmFfbGFuZ19zaG9ydCkpIHsKLQkJdi0+dnQgPSBWVF9JMjsKLQkJdi0+aVZhbCA9IGVudi0+Q2FsbFNob3J0TWV0aG9kKG8sIHNob3J0VmFsdWUpOwotICAgIH0gZWxzZSBpZiAoZW52LT5Jc0luc3RhbmNlT2YobywgY2xhc3NfamF2YV9sYW5nX2xvbmcpKSB7Ci0JCXYtPnZ0ID0gVlRfSTg7Ci0JCXYtPmxsVmFsID0gZW52LT5DYWxsTG9uZ01ldGhvZChvLCBsb25nVmFsdWUpOwotICAgIH0gZWxzZSBpZiAoZW52LT5Jc0luc3RhbmNlT2YobywgY2xhc3NfamF2YV9sYW5nX2RvdWJsZSkpIHsKLQkJdi0+dnQgPSBWVF9SODsKLQkJdi0+ZGJsVmFsID0gZW52LT5DYWxsRG91YmxlTWV0aG9kKG8sIGRvdWJsZVZhbHVlKTsKLSAgICB9IGVsc2UgaWYgKGVudi0+SXNJbnN0YW5jZU9mKG8sIGNsYXNzX2phdmFfbGFuZ19mbG9hdCkpIHsKLQkJdi0+dnQgPSBWVF9SNDsKLQkJdi0+Zmx0VmFsID0gZW52LT5DYWxsRmxvYXRNZXRob2QobywgZmxvYXRWYWx1ZSk7Ci0gICAgfSBlbHNlIGlmIChlbnYtPklzSW5zdGFuY2VPZihvLCBjbGFzc19SZWZTdHJpbmcpKSB7Ci0JCXYtPnZ0ID0gVlRfQlNUUiB8IFZUX0JZUkVGOwotCQl2LT5wYnN0clZhbCA9IChCU1RSKikgZ2V0UHRyKGVudiwgbyk7Ci0gICAgfSBlbHNlIGlmIChlbnYtPklzSW5zdGFuY2VPZihvLCBjbGFzc19SZWZJbnQpKSB7Ci0JCXYtPnZ0ID0gVlRfSTQgfCBWVF9CWVJFRjsKLQkJdi0+cGludFZhbCA9IChJTlQqKSBnZXRQdHIoZW52LCBvKTsKLSAgICB9IGVsc2UgaWYgKGVudi0+SXNJbnN0YW5jZU9mKG8sIGNsYXNzX1JlZkJ5dGUpKSB7Ci0JCXYtPnZ0ID0gVlRfVUkxIHwgVlRfQllSRUY7Ci0JCXYtPnBiVmFsID0gKEJZVEUqKSBnZXRQdHIoZW52LCBvKTsKLSAgICB9IGVsc2UgaWYgKGVudi0+SXNJbnN0YW5jZU9mKG8sIGNsYXNzX1JlZlNob3J0KSkgewotCQl2LT52dCA9IFZUX0kyIHwgVlRfQllSRUY7Ci0JCXYtPnBpVmFsID0gKFNIT1JUKikgZ2V0UHRyKGVudiwgbyk7Ci0gICAgfSBlbHNlIGlmIChlbnYtPklzSW5zdGFuY2VPZihvLCBjbGFzc19SZWZMb25nKSkgewotCQl2LT52dCA9IFZUX0k4IHwgVlRfQllSRUY7Ci0JCXYtPnBsbFZhbCA9IChMT05HTE9ORyopIGdldFB0cihlbnYsIG8pOwotICAgIH0gZWxzZSBpZiAoZW52LT5Jc0luc3RhbmNlT2YobywgY2xhc3NfUmVmRG91YmxlKSkgewotCQl2LT52dCA9IFZUX1I4IHwgVlRfQllSRUY7Ci0JCXYtPnBkYmxWYWwgPSAoRE9VQkxFKikgZ2V0UHRyKGVudiwgbyk7Ci0gICAgfSBlbHNlIGlmIChlbnYtPklzSW5zdGFuY2VPZihvLCBjbGFzc19SZWZGbG9hdCkpIHsKLQkJdi0+dnQgPSBWVF9SNCB8IFZUX0JZUkVGOwotCQl2LT5wZmx0VmFsID0gKEZMT0FUKikgZ2V0UHRyKGVudiwgbyk7Ci0gICAgfSBlbHNlIHsKLQkJLy8KLQkJLy8gY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IHNhZmVhcnJheSwgQ1ksIERBVEUsIEVSUk9SLgotCQkvLyAKLQkJd2NoYXJfdCAqcG9ianN0ciA9IGpvYmplY3RfdG9fc3RyaW5nKGVudiwgbyk7Ci0JCXRocm93X0Rpc3BhdGNoRXhjZXB0aW9uKGVudiwgTCIlcyBpcyBub3QgeWV0IHN1cHBvcnRlZC4iLCBwb2Jqc3RyKTsKLQkJZnJlZShwb2Jqc3RyKTsKLQkJcmV0dXJuIDA7Ci0gICAgfQotCQotICAgIHJldHVybiAxOwotfQotCi1qb2JqZWN0IHYyaihKTklFbnYqIGVudiwgam9iamVjdCBqaWRpc3AsIFZBUklBTlQqIHYpCi17Ci0JaWYgKHYtPnZ0ICYgVlRfQVJSQVkpIHsKLQkJcmV0dXJuIGpjX21ha2VfYXJyYXkoZW52LCBqaWRpc3AsIHYpOwotCX0KLSAgICBpZiAodi0+dnQgJiBWVF9CWVJFRikgewotCQkvLyBUT0RPCi0JCXJldHVybiBOVUxMOwotICAgIH0KLQkKLSAgICBzd2l0Y2ggKHYtPnZ0KSB7Ci0gICAgICBjYXNlIFZUX05VTEw6Ci0gICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgCi0gICAgICBjYXNlIFZUX0JPT0w6Ci0gICAgICAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KGNsYXNzX2phdmFfbGFuZ19ib29sZWFuLAotCQkJCQkJCSBib29sZWFuQ29uc3RydWN0b3IsCi0JCQkJCQkJIHYtPmJvb2xWYWwgPyBKTklfVFJVRSA6IEpOSV9GQUxTRSk7Ci0JICAgCi0gICAgICBjYXNlIFZUX0JTVFI6Ci0gICAgICB7Ci0JCSAgaW50IGxlbiA9IFN5c1N0cmluZ0xlbih2LT5ic3RyVmFsKTsKLQkJICByZXR1cm4gZW52LT5OZXdTdHJpbmcoKGNvbnN0IGpjaGFyKikgdi0+YnN0clZhbCwgbGVuKTsKLSAgICAgIH0KLQkgIAotICAgICAgY2FzZSBWVF9JMToKLSAgICAgICByZXR1cm4gZW52LT5OZXdPYmplY3QoY2xhc3NfamF2YV9sYW5nX2J5dGUsCi0JCQkJCQkJIGJ5dGVDb25zdHJ1Y3RvciwgKGpieXRlKSB2LT5jVmFsKTsKLSAgICAgIGNhc2UgVlRfSTI6Ci0gICAgICAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KGNsYXNzX2phdmFfbGFuZ19zaG9ydCwKLQkJCQkJCQkgc2hvcnRDb25zdHJ1Y3RvciwgKGpzaG9ydCkgdi0+aVZhbCk7Ci0gICAgICBjYXNlIFZUX0lOVDoKLSAgICAgICByZXR1cm4gZW52LT5OZXdPYmplY3QoY2xhc3NfamF2YV9sYW5nX2ludGVnZXIsCi0JCQkJCQkJIGludENvbnN0cnVjdG9yLCAoamludCkgdi0+aW50VmFsKTsKLSAgICAgIGNhc2UgVlRfSTQ6Ci0gICAgICAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KGNsYXNzX2phdmFfbGFuZ19pbnRlZ2VyLAotCQkJCQkJCSBpbnRDb25zdHJ1Y3RvciwgKGppbnQpIHYtPmxWYWwpOwotICAgICAgY2FzZSBWVF9JODoKLSAgICAgICByZXR1cm4gZW52LT5OZXdPYmplY3QoY2xhc3NfamF2YV9sYW5nX2xvbmcsCi0JCQkJCQkJIGxvbmdDb25zdHJ1Y3RvciwgKGpsb25nKSB2LT5sbFZhbCk7Ci0JICAgCi0gICAgICBjYXNlIFZUX1I0OgotICAgICAgIHJldHVybiBlbnYtPk5ld09iamVjdChjbGFzc19qYXZhX2xhbmdfZmxvYXQsCi0JCQkJCQkJIGZsb2F0Q29uc3RydWN0b3IsIChqZmxvYXQpIHYtPmZsdFZhbCk7Ci0gICAgICBjYXNlIFZUX1I4OgotICAgICAgIHJldHVybiBlbnYtPk5ld09iamVjdChjbGFzc19qYXZhX2xhbmdfZG91YmxlLAotCQkJCQkJCSBkb3VibGVDb25zdHJ1Y3RvciwgKGpkb3VibGUpIHYtPmRibFZhbCk7Ci0JICAgCi0JICAgCi0gICAgICBjYXNlIFZUX0RJU1BBVENIOgotICAgICAgIHJldHVybiBjcmVhdGVfSURpc3BhdGNoKGVudiwgamlkaXNwLCB2LT5wZGlzcFZhbCk7Ci0gICAgICAgCi0gICAgICBjYXNlIFZUX1VOS05PV046Ci0gICAgICAgcmV0dXJuIGNyZWF0ZV9JVW5rbm93bihlbnYsIGppZGlzcCwgdi0+cHVua1ZhbCk7Ci0JICAgCi0gICAgICBjYXNlIFZUX1VJMToKLSAgICAgICByZXR1cm4gZW52LT5OZXdPYmplY3QoY2xhc3NfamF2YV9sYW5nX2J5dGUsCi0JCQkJCQkJIGJ5dGVDb25zdHJ1Y3RvciwgKGpieXRlKSB2LT5iVmFsKTsKLSAgICAgICAvKiBBbGwgdW5zaWduZWQgaW50ZWdlcnMgb3RoZXIgdGhhbiBieXRlIGFyZSB0cmVhdGVkIGFzIGxvbmcgaW4gSmF2YS4gKi8KLSAgICAgIGNhc2UgVlRfVUkyOgotICAgICAgIHJldHVybiBlbnYtPk5ld09iamVjdChjbGFzc19qYXZhX2xhbmdfbG9uZywKLQkJCQkJCQkgbG9uZ0NvbnN0cnVjdG9yLCAoamxvbmcpIHYtPnVpVmFsKTsKLSAgICAgIGNhc2UgVlRfVUk0OgotICAgICAgIHJldHVybiBlbnYtPk5ld09iamVjdChjbGFzc19qYXZhX2xhbmdfbG9uZywKLQkJCQkJCQkgbG9uZ0NvbnN0cnVjdG9yLCAoamxvbmcpIHYtPnVsVmFsKTsKLSAgICAgIGNhc2UgVlRfVUlOVDoKLSAgICAgICByZXR1cm4gZW52LT5OZXdPYmplY3QoY2xhc3NfamF2YV9sYW5nX2xvbmcsCi0JCQkJCQkJIGxvbmdDb25zdHJ1Y3RvciwgKGpsb25nKSB2LT51aW50VmFsKTsKLQkgICAKLSAgICAgIGNhc2UgVlRfRU1QVFk6Ci0gICAgICAgLy8gVGhpcyBzaG91bGQgYmUgaWxsZWdhbCBidXQgaXQgaXMgdXNlZCBmb3IgcmVwcmVzZW50aW5nIHZvaWQuCi0gICAgICAgLy8gdGhyb3dfRGlzcGF0Y2hFeGNlcHRpb24oZW52LCBMIlVuZXhwZWN0ZWRseSBWVF9FTVBUWSBpcyByZXR1cm5lZCEiKTsKLSAgICAgICByZXR1cm4gTlVMTDsKLQkgICAKLSAgICAgIGNhc2UgVlRfQ1k6Ci0JICAgdGhyb3dfRGlzcGF0Y2hFeGNlcHRpb24oZW52LCBMIlZUX0NZIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpOwotCSAgIGJyZWFrOwotICAgICAgY2FzZSBWVF9EQVRFOgotCSAgIHRocm93X0Rpc3BhdGNoRXhjZXB0aW9uKGVudiwgTCJWVF9EQVRFIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpOwotCSAgIGJyZWFrOwotICAgICAgY2FzZSBWVF9FUlJPUjoKLQkgICB0aHJvd19EaXNwYXRjaEV4Y2VwdGlvbihlbnYsIEwiVlRfRVJST1IgaXMgbm90IHlldCBzdXBwb3J0ZWQuIik7Ci0JICAgYnJlYWs7Ci0gICAgICAgCi0gICAgICBkZWZhdWx0OgotICAgICAgIHRocm93X0Rpc3BhdGNoRXhjZXB0aW9uKGVudiwgTCJVbmV4cGVjdGVkIHZhcmlhbnQgdHlwZToleC4iLCB2LT52dCk7Ci0gICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1pbnQKLWpjX3ZhcmlhbnRfY2xlYXIoVkFSSUFOVCogcHYsIGludCByZWxlYXNlSVVua25vd24pCi17Ci0gICAgc3dpdGNoIChwdi0+dnQpIHsKLSAgICAgIGNhc2UgVlRfQlNUUjoKLSAgICAgICBTeXNGcmVlU3RyaW5nKHB2LT5ic3RyVmFsKTsKLSAgICAgICByZXR1cm4gMTsKLQkgICAKLSAgICAgIGNhc2UgVlRfRElTUEFUQ0g6Ci0gICAgICAgaWYgKHJlbGVhc2VJVW5rbm93bikgewotICAgICAgICAgICBJRGlzcGF0Y2gqIHBkaXNwVmFsID0gcHYtPnBkaXNwVmFsOwotICAgICAgICAgICBpZiAocGRpc3BWYWwpIHsKLSAgICAgICAgICAgICAgIHBkaXNwVmFsLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIDE7Ci0gICAgICBjYXNlIFZUX1VOS05PV046Ci0gICAgICAgaWYgKHJlbGVhc2VJVW5rbm93bikgewotICAgICAgICAgICBJVW5rbm93biogcHVua1ZhbCA9IHB2LT5wdW5rVmFsOwotICAgICAgICAgICBpZiAocHVua1ZhbCkgewotICAgICAgICAgICAgICAgcHVua1ZhbC0+UmVsZWFzZSgpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHJldHVybiAxOwotCSAgIAotICAgICAgY2FzZSBWVF9BUlJBWToKLSAgICAgICBTYWZlQXJyYXlEZXN0cm95KHB2LT5wYXJyYXkpOwotICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvSkNUeXBlQnJpZGdlQXJyYXkuY3BwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvSkNUeXBlQnJpZGdlQXJyYXkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGM0YmQ2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL0pDVHlwZUJyaWRnZUFycmF5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICBKYXZhIDwtPiBDT00gVHlwZSBCcmlkZ2UgQXJyYXkKLSovCi0jaW5jbHVkZSAiQ29tLmgiCi0KLQotam9iamVjdAotbWFrZV9ieXRlX2FycmF5KEpOSUVudiogZW52LCBTQUZFQVJSQVkgKnBhcnJheSwgbG9uZyBsLCBsb25nIHUpIHsKLQlsb25nIGksIGxlbjsKLQlsb25nIGluZGljZXNbMV07Ci0JamJ5dGUgdmFsdWVbMV07Ci0JSFJFU1VMVCBocjsKLQkKLQlsZW4gPSB1IC0gbCArIDE7Ci0JamJ5dGVBcnJheSBhcnJheSA9IGVudi0+TmV3Qnl0ZUFycmF5KGxlbik7Ci0JaWYgKCFhcnJheSkKLQkJcmV0dXJuIE5VTEw7Ci0JCQotCWZvciAoaSA9IGw7IGkgPD0gdTsgaSsrKSB7Ci0JCWluZGljZXNbMF0gPSBpOwotCQlociA9IFNhZmVBcnJheUdldEVsZW1lbnQocGFycmF5LCBpbmRpY2VzLCB2YWx1ZSk7Ci0JCWlmIChGQUlMRUQoaHIpKQotCQkJcmV0dXJuIE5VTEw7Ci0JICAgIGVudi0+U2V0Qnl0ZUFycmF5UmVnaW9uKGFycmF5LCBpLWwsIDEsIHZhbHVlKTsKLQl9Ci0JcmV0dXJuIGFycmF5OwotfQotCi1qb2JqZWN0Ci1tYWtlX3Nob3J0X2FycmF5KEpOSUVudiogZW52LCBTQUZFQVJSQVkgKnBhcnJheSwgbG9uZyBsLCBsb25nIHUpIHsKLQlsb25nIGksIGxlbjsKLQlsb25nIGluZGljZXNbMV07Ci0JanNob3J0IHZhbHVlWzFdOwotCUhSRVNVTFQgaHI7Ci0JCi0JbGVuID0gdSAtIGwgKyAxOwotCWpzaG9ydEFycmF5IGFycmF5ID0gZW52LT5OZXdTaG9ydEFycmF5KGxlbik7Ci0JaWYgKCFhcnJheSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JZm9yIChpID0gbDsgaSA8PSB1OyBpKyspIHsKLQkJaW5kaWNlc1swXSA9IGk7Ci0JICAgIGhyID0gU2FmZUFycmF5R2V0RWxlbWVudChwYXJyYXksIGluZGljZXMsIHZhbHVlKTsKLQkJaWYgKEZBSUxFRChocikpCi0JCQlyZXR1cm4gTlVMTDsKLQkgICAgZW52LT5TZXRTaG9ydEFycmF5UmVnaW9uKGFycmF5LCBpLWwsIDEsIHZhbHVlKTsKLQl9Ci0JcmV0dXJuIGFycmF5OwotfQotCi1qb2JqZWN0Ci1tYWtlX2ludF9hcnJheShKTklFbnYqIGVudiwgU0FGRUFSUkFZICpwYXJyYXksIGxvbmcgbCwgbG9uZyB1KSB7Ci0JbG9uZyBpLCBsZW47Ci0JbG9uZyBpbmRpY2VzWzFdOwotCWppbnQgdmFsdWVbMV07Ci0JSFJFU1VMVCBocjsKLQkKLQlsZW4gPSB1IC0gbCArIDE7Ci0JamludEFycmF5IGFycmF5ID0gZW52LT5OZXdJbnRBcnJheShsZW4pOwotCWlmICghYXJyYXkpCi0JCXJldHVybiBOVUxMOwotCQotCWZvciAoaSA9IGw7IGkgPD0gdTsgaSsrKSB7Ci0JCWluZGljZXNbMF0gPSBpOwotCSAgICBociA9IFNhZmVBcnJheUdldEVsZW1lbnQocGFycmF5LCBpbmRpY2VzLCB2YWx1ZSk7Ci0JCWlmIChGQUlMRUQoaHIpKQotCQkJcmV0dXJuIE5VTEw7Ci0JICAgIGVudi0+U2V0SW50QXJyYXlSZWdpb24oYXJyYXksIGktbCwgMSwgdmFsdWUpOwotCX0KLQlyZXR1cm4gYXJyYXk7Ci19Ci0KLWpvYmplY3QKLW1ha2VfbG9uZ19hcnJheShKTklFbnYqIGVudiwgU0FGRUFSUkFZICpwYXJyYXksIGxvbmcgbCwgbG9uZyB1KSB7Ci0JbG9uZyBpLCBsZW47Ci0JbG9uZyBpbmRpY2VzWzFdOwotCWpsb25nIHZhbHVlWzFdOwotCUhSRVNVTFQgaHI7Ci0JCQotCWxlbiA9IHUgLSBsICsgMTsKLQlqbG9uZ0FycmF5IGFycmF5ID0gZW52LT5OZXdMb25nQXJyYXkobGVuKTsKLQlpZiAoIWFycmF5KQotCQlyZXR1cm4gTlVMTDsKLQkKLQlmb3IgKGkgPSBsOyBpIDw9IHU7IGkrKykgewotCQlpbmRpY2VzWzBdID0gaTsKLQkgICAgaHIgPSBTYWZlQXJyYXlHZXRFbGVtZW50KHBhcnJheSwgaW5kaWNlcywgdmFsdWUpOwotCSAgICBpZiAoRkFJTEVEKGhyKSkKLQkJCXJldHVybiBOVUxMOwotCSAgICBlbnYtPlNldExvbmdBcnJheVJlZ2lvbihhcnJheSwgaS1sLCAxLCB2YWx1ZSk7Ci0JfQotCXJldHVybiBhcnJheTsKLX0KLQotam9iamVjdAotbWFrZV9mbG9hdF9hcnJheShKTklFbnYqIGVudiwgU0FGRUFSUkFZICpwYXJyYXksIGxvbmcgbCwgbG9uZyB1KSB7Ci0JbG9uZyBpLCBsZW47Ci0JbG9uZyBpbmRpY2VzWzFdOwotCWpmbG9hdCB2YWx1ZVsxXTsKLQlIUkVTVUxUIGhyOwotCQotCWxlbiA9IHUgLSBsICsgMTsKLQlqZmxvYXRBcnJheSBhcnJheSA9IGVudi0+TmV3RmxvYXRBcnJheShsZW4pOwotCWlmICghYXJyYXkpCi0JCXJldHVybiBOVUxMOwotCQotCWZvciAoaSA9IGw7IGkgPD0gdTsgaSsrKSB7Ci0JCWluZGljZXNbMF0gPSBpOwotCQlociA9IFNhZmVBcnJheUdldEVsZW1lbnQocGFycmF5LCBpbmRpY2VzLCB2YWx1ZSk7Ci0JCWlmIChGQUlMRUQoaHIpKQotCQkJcmV0dXJuIE5VTEw7Ci0JICAgIGVudi0+U2V0RmxvYXRBcnJheVJlZ2lvbihhcnJheSwgaS1sLCAxLCB2YWx1ZSk7Ci0JfQotCXJldHVybiBhcnJheTsKLX0KLQotam9iamVjdAotbWFrZV9kb3VibGVfYXJyYXkoSk5JRW52KiBlbnYsIFNBRkVBUlJBWSAqcGFycmF5LCBsb25nIGwsIGxvbmcgdSkgewotCWxvbmcgaSwgbGVuOwotCWxvbmcgaW5kaWNlc1sxXTsKLQlqZG91YmxlIHZhbHVlWzFdOwotCUhSRVNVTFQgaHI7Ci0JCi0JbGVuID0gdSAtIGwgKyAxOwotCWpkb3VibGVBcnJheSBhcnJheSA9IGVudi0+TmV3RG91YmxlQXJyYXkobGVuKTsKLQlpZiAoIWFycmF5KQotCQlyZXR1cm4gTlVMTDsKLQkKLQlmb3IgKGkgPSBsOyBpIDw9IHU7IGkrKykgewotCQlpbmRpY2VzWzBdID0gaTsKLQkgICAgaHIgPSBTYWZlQXJyYXlHZXRFbGVtZW50KHBhcnJheSwgaW5kaWNlcywgdmFsdWUpOwotCQlpZiAoRkFJTEVEKGhyKSkKLQkJCXJldHVybiBOVUxMOwotCSAgICBlbnYtPlNldERvdWJsZUFycmF5UmVnaW9uKGFycmF5LCBpLWwsIDEsIHZhbHVlKTsKLQl9Ci0JcmV0dXJuIGFycmF5OwotfQotCi0KLWpvYmplY3QKLWpjX21ha2VfYXJyYXkoSk5JRW52KiBlbnYsIGpvYmplY3QgamlkaXNwLCBWQVJJQU5UKiB2KQotewotCWxvbmcgbCwgdSwgZDsKLQlIUkVTVUxUIGhyOwotCVZBUlRZUEUgdnQgPSB2LT52dCAmICh+VlRfQVJSQVkpOwotCWQgPSBTYWZlQXJyYXlHZXREaW0odi0+cGFycmF5KTsKLQotCWlmIChkICE9IDEpIHsKLQkJdGhyb3dfRGlzcGF0Y2hFeGNlcHRpb24oZW52LCBMIlZUX0FSUkFZIChkaW0gIT0gMSkgaXMgbm90IHlldCBzdXBwb3J0ZWQuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlociA9IFNhZmVBcnJheUdldExCb3VuZCh2LT5wYXJyYXksIDEsICZsKTsKLQlpZiAoRkFJTEVEKGhyKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaHIgPSBTYWZlQXJyYXlHZXRVQm91bmQodi0+cGFycmF5LCAxLCAmdSk7Ci0JaWYgKEZBSUxFRChocikpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCXN3aXRjaCh2dCkgewotCQljYXNlIFZUX0kxOgotCQkJcmV0dXJuIG1ha2VfYnl0ZV9hcnJheShlbnYsIHYtPnBhcnJheSwgbCwgdSk7Ci0JICAgIAljYXNlIFZUX0kyOgotCQkJcmV0dXJuIG1ha2Vfc2hvcnRfYXJyYXkoZW52LCB2LT5wYXJyYXksIGwsIHUpOwotCQljYXNlIFZUX0lOVDoKLQkJY2FzZSBWVF9JNDoKLQkJCXJldHVybiBtYWtlX2ludF9hcnJheShlbnYsIHYtPnBhcnJheSwgbCwgdSk7Ci0JCWNhc2UgVlRfSTg6Ci0JCQlyZXR1cm4gbWFrZV9sb25nX2FycmF5KGVudiwgdi0+cGFycmF5LCBsLCB1KTsKLQkJY2FzZSBWVF9SNDoKLQkJCXJldHVybiBtYWtlX2Zsb2F0X2FycmF5KGVudiwgdi0+cGFycmF5LCBsLCB1KTsKLQkJY2FzZSBWVF9SODoKLQkJCXJldHVybiBtYWtlX2RvdWJsZV9hcnJheShlbnYsIHYtPnBhcnJheSwgbCwgdSk7Ci0JCSAgIAotCQlkZWZhdWx0OgotCQkgICB0aHJvd19EaXNwYXRjaEV4Y2VwdGlvbihlbnYsIEwiTm90IHN1cHBvcnRlZCBWVF9BUlJBWSB0eXBlLiIpOwotCQkgICByZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWNvbWNsdXRjaC9NU0FBLmNwcCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL01TQUEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTY2ZjgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL01TQUEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgIkNvbS5oIgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxvbGVhY2MuaD4KLSNpbmNsdWRlICJvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBLmgiCi0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUEKLSAqIE1ldGhvZDogICAgX1dpbmRvd0Zyb21BY2Nlc3NpYmxlT2JqZWN0Ci0gKiBTaWduYXR1cmU6IChKKUoKLSAqLwotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX18xV2luZG93RnJvbUFjY2Vzc2libGVPYmplY3QKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLCBqbG9uZyBwQWNjKQotewotCUhXTkQgaHduZCA9IE5VTEw7Ci0JaWYoIEZBSUxFRChXaW5kb3dGcm9tQWNjZXNzaWJsZU9iamVjdCgoSUFjY2Vzc2libGUqKXBBY2MsJmh3bmQpKSApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoamxvbmcpaHduZDsKLX0KLQotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBCi0gKiBNZXRob2Q6ICAgIF9nZXRBY2Nlc3NpYmxlQ2hpbGRyZW4KLSAqIFNpZ25hdHVyZTogKEpJSSlbTGphdmEvbGFuZy9PYmplY3Q7Ci0gKi8KLUpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUFfXzFnZXRBY2Nlc3NpYmxlQ2hpbGRyZW4KLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLCBqb2JqZWN0IGlkaXNwLCBqbG9uZyBwdHIsIGppbnQgc3RhcnQsIGppbnQgY291bnQpCi17Ci0JVkFSSUFOVCogY2hpbGRyZW4gPSAoVkFSSUFOVCopIGFsbG9jYShzaXplb2YoVkFSSUFOVCkgKiBjb3VudCk7Ci0JCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JICBWYXJpYW50SW5pdCgmY2hpbGRyZW5baV0pOwotCX0KLQkKLQlMT05HIG5DaGlsZDsKLQlIUkVTVUxUIGggPSBBY2Nlc3NpYmxlQ2hpbGRyZW4oKElBY2Nlc3NpYmxlKilwdHIsIHN0YXJ0LCBjb3VudCwgY2hpbGRyZW4sICZuQ2hpbGQpOwotCWlmKCBGQUlMRUQoaCkgKSB7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0JCi0JLy9mcHJpbnRmKHN0ZG91dCwgIm5DaGlsZCA9ICVkXG4iLCBuQ2hpbGQpOwotCS8vZmZsdXNoKHN0ZG91dCk7Ci0JCi0Jam9iamVjdEFycmF5IHJldCA9IGVudi0+TmV3T2JqZWN0QXJyYXkoY291bnQsIGNsYXNzX2phdmFfbGFuZ19vYmplY3QsIE5VTEwpOwotCQotCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCSAgIGVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KHJldCwgaSwgdjJqKGVudiwgaWRpc3AsICZjaGlsZHJlbltpXSkpOwotICAgIAkgICBqY192YXJpYW50X2NsZWFyKCZjaGlsZHJlbltpXSwgZmFsc2UpOwotCX0KLQkKLQlmcmVlKGNoaWxkcmVuKTsKLQkJCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQQotICogTWV0aG9kOiAgICBfZ2V0Um9sZVRleHQKLSAqIFNpZ25hdHVyZTogKEkpTGphdmEvbGFuZy9TdHJpbmc7Ci0gKi8KLUpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX18xZ2V0Um9sZVRleHQKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLCBqaW50IGxSb2xlKQotewotICAJaW50IGNvdW50ID0gMDsKLQlUQ0hBUiBscFJvbGVbMjU2XTsKLQotCWNvdW50ID0gKGludCkgR2V0Um9sZVRleHRXKGxSb2xlLCAoTFBXU1RSKWxwUm9sZSwgMjU2KTsKLQotCXJldHVybiBlbnYtPk5ld1N0cmluZygoamNoYXIgKikgbHBSb2xlLCBjb3VudCk7Ci19Ci0KLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQQotICogTWV0aG9kOiAgICBfQWNlc3NpYmxlT2JqZWN0RnJvbVdpbmRvdwotICogU2lnbmF0dXJlOiAoSilKCi0gKi8KLUpOSUVYUE9SVCBqbG9uZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9fMUFjZXNzaWJsZU9iamVjdEZyb21XaW5kb3cKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLCBqbG9uZyBod25kKQotewotCXZvaWQgKnBPYmplY3QgPSBOVUxMOwotLy8JaWYoIEZBSUxFRCggQWNjZXNzaWJsZU9iamVjdEZyb21XaW5kb3coKEhXTkQpaHduZCxPQkpJRF9DTElFTlQsSUlEX0lBY2Nlc3NpYmxlLCZwT2JqZWN0KSApICkgewotCWlmKCBGQUlMRUQoIEFjY2Vzc2libGVPYmplY3RGcm9tV2luZG93KChIV05EKWh3bmQsT0JKSURfV0lORE9XLElJRF9JQWNjZXNzaWJsZSwmcE9iamVjdCkgKSApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoamludCkgcE9iamVjdDsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL01ha2VmaWxlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZGVkNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQkFTRVBLRyA9IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gKLUJBU0VJTVBMUEtHID0gJChCQVNFUEtHKS5pbXBsCi1KQVZBSCA9ICIkKEpBVkFfSE9NRTovPVwpXGJpblxqYXZhaCIKLUpBVkFIX0ZMQUdTID0gLWNsYXNzcGF0aCAuLi9iaW4KLUpBVkFfSU5DID0gIiQoSkFWQV9IT01FKS9pbmNsdWRlIgotQkxEID0gLi5cYnVpbGQKLUNDID0gY2wuZXhlCi1DRkxBR1MgPSAtYyAtWmkgLU94IC1JICQoSkFWQV9JTkMpCi1MSU5LID0gbGluay5leGUKLUxERkxBR1MgPSAtZGVidWcgLWRsbAotTElCUyA9IFVzZXIzMi5saWIgT2xlYWNjLmxpYgotQ0xBU1NFUyA9ICQoQkFTRVBLRykuSVJlc291cmNlSW1wbCAKLQotT0JKUyA9ICQoQkxEKVxDb21tb24ub2JqICQoQkxEKVxJRGlzcGF0Y2gub2JqICQoQkxEKVxJVW5rbm93bi5vYmogXAotICAgICAgICQoQkxEKVxKQ1R5cGVCcmlkZ2Uub2JqICQoQkxEKVxSZWZDb250YWluZXIub2JqICQoQkxEKVxIYW5kbGVyLm9iaiBcCi0gICAgICAgJChCTEQpXElFbnVtVW5rbm93bi5vYmogJChCTEQpXElPbGVDb250YWluZXIub2JqICQoQkxEKVxJVXJsSGlzdG9yeVN0ZzIub2JqIFwKLSAgICAgICAkKEJMRClcSkNUeXBlQnJpZGdlQXJyYXkub2JqICQoQkxEKVxNU0FBLm9iaiAkKEJMRClcSVNlcnZpY2VQcm92aWRlci5vYmoKLSAgICAgICAKLURMTCA9IC4uL0phdmFDb20uZGxsCi0KLWFsbDogaW5pdCBoZWFkZXJzICQoRExMKQotCi1pbml0OgotCS1ta2RpciAkKEJMRCkKLQotY2xlYW46Ci0JLXJkIC9TL1EgJChCTEQpCi0KLWhlYWRlcnM6IAotCSQoSkFWQUgpICQoSkFWQUhfRkxBR1MpICQoQkFTRVBLRykuQ29tU2VydmljZSAkKEJBU0VQS0cpLlJlZkNvbnRhaW5lciAkKEJBU0VQS0cpLkhhbmRsZXIgJChCQVNFSU1QTFBLRykuSVJlc291cmNlSW1wbCAkKEJBU0VJTVBMUEtHKS5JVW5rbm93bkltcGwgJChCQVNFSU1QTFBLRykuSURpc3BhdGNoSW1wbCAkKEJBU0VJTVBMUEtHKS5JRW51bVVua25vd25JbXBsICQoQkFTRUlNUExQS0cpLklPbGVDb250YWluZXJJbXBsICQoQkFTRUlNUExQS0cpLklVcmxIaXN0b3J5U3RnMkltcGwgJChCQVNFSU1QTFBLRykuSVNlcnZpY2VQcm92aWRlckltcGwgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLm1zYWEuTVNBQQotCi0kKERMTCk6ICQoT0JKUykKLQkkKExJTkspICQoTERGTEFHUykgJChPQkpTKSAtb3V0OiQoRExMKSAkKExJQlMpCi0KLS5jcHB7JChCTEQpfS5vYmo6Ci0JJChDQykgJChDRkxBR1MpIC1GbyQoQkxEKVwgJDwKLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWNvbWNsdXRjaC9SZWZDb250YWluZXIuY3BwIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvUmVmQ29udGFpbmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzYTk5NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWNvbWNsdXRjaC9SZWZDb250YWluZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJDb20uaCIKLSNpbmNsdWRlICJvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX1JlZkNvbnRhaW5lci5oIgotCi0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyCi0gKiBNZXRob2Q6ICAgIF9mcmVlCi0gKiBTaWduYXR1cmU6IChKKVYKLSAqLwotdm9pZCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9SZWZDb250YWluZXJfXzFmcmVlCi0gIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0cikKLXsKLSAgICBmcmVlKCh2b2lkKikgcHRyKTsgCi19Ci0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyCi0gKiBNZXRob2Q6ICAgIF9jYWxsb2MKLSAqIFNpZ25hdHVyZTogKEkpSgotICovCi1qbG9uZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9SZWZDb250YWluZXJfXzFjYWxsb2MKLSAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamludCBzaXplKQotewotICAgIHZvaWQqIHB0ciA9IGNhbGxvYygxLCBzaXplKTsKLSAgICByZXR1cm4gKGpsb25nKSBwdHI7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyCi0gKiBNZXRob2Q6ICAgIF9nZXRWYWx1ZUJ5Qm9vbGVhbgotICogU2lnbmF0dXJlOiAoSilaCi0gKi8KLWpib29sZWFuIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX1JlZkNvbnRhaW5lcl9fMWdldFZhbHVlQnlCb29sZWFuCi0gIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0cil7Ci0gIHJldHVybiAqKChqYm9vbGVhbiopIHB0cik7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyCi0gKiBNZXRob2Q6ICAgIF9nZXRWYWx1ZUJ5Qnl0ZQotICogU2lnbmF0dXJlOiAoSilCCi0gKi8KLWpieXRlIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX1JlZkNvbnRhaW5lcl9fMWdldFZhbHVlQnlCeXRlCi0gIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0cil7Ci0gIHJldHVybiAqKChqYnl0ZSopIHB0cik7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyCi0gKiBNZXRob2Q6ICAgIF9nZXRWYWx1ZUJ5U2hvcnQKLSAqIFNpZ25hdHVyZTogKEopUwotICovCi1qc2hvcnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyX18xZ2V0VmFsdWVCeVNob3J0Ci0gIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0cil7Ci0gIHJldHVybiAqKChqc2hvcnQqKSBwdHIpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX1JlZkNvbnRhaW5lcgotICogTWV0aG9kOiAgICBfZ2V0VmFsdWVCeUludAotICogU2lnbmF0dXJlOiAoSilJCi0gKi8KLWppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyX18xZ2V0VmFsdWVCeUludAotICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbG9uZyBwdHIpewotICByZXR1cm4gKigoamludCopIHB0cik7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyCi0gKiBNZXRob2Q6ICAgIF9nZXRWYWx1ZUJ5TG9uZwotICogU2lnbmF0dXJlOiAoSilKCi0gKi8KLWpsb25nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX1JlZkNvbnRhaW5lcl9fMWdldFZhbHVlQnlMb25nCi0gIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0cil7Ci0gIHJldHVybiAqKChqbG9uZyopIHB0cik7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyCi0gKiBNZXRob2Q6ICAgIF9nZXRWYWx1ZUJ5RmxvYXQKLSAqIFNpZ25hdHVyZTogKEopRgotICovCi1qZmxvYXQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyX18xZ2V0VmFsdWVCeUZsb2F0Ci0gIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0cil7Ci0gIHJldHVybiAqKChqZmxvYXQqKSBwdHIpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX1JlZkNvbnRhaW5lcgotICogTWV0aG9kOiAgICBfZ2V0VmFsdWVCeURvdWJsZQotICogU2lnbmF0dXJlOiAoSilECi0gKi8KLWpkb3VibGUgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyX18xZ2V0VmFsdWVCeURvdWJsZQotICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbG9uZyBwdHIpewotICByZXR1cm4gKigoamRvdWJsZSopIHB0cik7Ci19Ci0KLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9SZWZDb250YWluZXIKLSAqIE1ldGhvZDogICAgX2dldFZhbHVlQnlJVW5rbm93bgotICogU2lnbmF0dXJlOiAoSilKCi0gKi8KLWpsb25nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX1JlZkNvbnRhaW5lcl9fMWdldFZhbHVlQnlJVW5rbm93bgotICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbG9uZyBwdHIpewotICByZXR1cm4gKigoamxvbmcqKSBwdHIpOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX1JlZkNvbnRhaW5lcgotICogTWV0aG9kOiAgICBfZ2V0VmFsdWVCeU9iamVjdAotICogU2lnbmF0dXJlOiAoSilMamF2YS9sYW5nL09iamVjdDsKLSAqLwotam9iamVjdCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9SZWZDb250YWluZXJfXzFnZXRWYWx1ZUJ5T2JqZWN0Ci0gIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0cil7Ci0gIHJldHVybiAqKChqb2JqZWN0KikgcHRyKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9SZWZDb250YWluZXIKLSAqIE1ldGhvZDogICAgX2dldFZhbHVlQnlWb2lkUHRyCi0gKiBTaWduYXR1cmU6IChKKUoKLSAqLwotamxvbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyX18xZ2V0VmFsdWVCeVZvaWRQdHIKLSAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamxvbmcgcHRyKXsKLSAgcmV0dXJuICooKGpsb25nKikgcHRyKTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9SZWZDb250YWluZXIKLSAqIE1ldGhvZDogICAgX2dldFZhbHVlQnlTdHJpbmcKLSAqIFNpZ25hdHVyZTogKEopTGphdmEvbGFuZy9TdHJpbmc7Ci0gKi8KLUpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX1JlZkNvbnRhaW5lcl9fMWdldFZhbHVlQnlTdHJpbmcKLSAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamxvbmcgcHRyKSB7Ci0gIGludCBsZW4gPSBzdHJsZW4oKGNoYXIgKikgcHRyKTsKLSAgcmV0dXJuIGVudi0+TmV3U3RyaW5nKChqY2hhciAqKSBwdHIsIGxlbik7IAotfQotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX1JlZkNvbnRhaW5lcgotICogTWV0aG9kOiAgICBfc2V0VmFsdWVGb3JCb29sZWFuCi0gKiBTaWduYXR1cmU6IChKWilWCi0gKi8KLXZvaWQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyX18xc2V0VmFsdWVGb3JCb29sZWFuCi0gIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0ciwgamJvb2xlYW4gdmFsdWUpewotICAqKChqYm9vbGVhbiopIHB0cikgPSB2YWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9SZWZDb250YWluZXIKLSAqIE1ldGhvZDogICAgX3NldFZhbHVlRm9yQnl0ZQotICogU2lnbmF0dXJlOiAoSkIpVgotICovCi12b2lkIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX1JlZkNvbnRhaW5lcl9fMXNldFZhbHVlRm9yQnl0ZQotICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbG9uZyBwdHIsIGpieXRlIHZhbHVlKXsKLSAgKigoamJ5dGUqKSBwdHIpID0gdmFsdWU7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyCi0gKiBNZXRob2Q6ICAgIF9zZXRWYWx1ZUZvclNob3J0Ci0gKiBTaWduYXR1cmU6IChKUylWCi0gKi8KLXZvaWQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyX18xc2V0VmFsdWVGb3JTaG9ydAotICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbG9uZyBwdHIsIGpzaG9ydCB2YWx1ZSl7Ci0gICooKGpzaG9ydCopIHB0cikgPSB2YWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9SZWZDb250YWluZXIKLSAqIE1ldGhvZDogICAgX3NldFZhbHVlRm9ySW50Ci0gKiBTaWduYXR1cmU6IChKSSlWCi0gKi8KLXZvaWQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyX18xc2V0VmFsdWVGb3JJbnQKLSAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamxvbmcgcHRyLCBqaW50IHZhbHVlKXsKLSAgKigoamludCopIHB0cikgPSB2YWx1ZTsKLX0KLQotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX1JlZkNvbnRhaW5lcgotICogTWV0aG9kOiAgICBfc2V0VmFsdWVGb3JMb25nCi0gKiBTaWduYXR1cmU6IChKSilWCi0gKi8KLXZvaWQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyX18xc2V0VmFsdWVGb3JMb25nCi0gIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0ciwgamxvbmcgdmFsdWUpewotICAqKChqbG9uZyopIHB0cikgPSB2YWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9SZWZDb250YWluZXIKLSAqIE1ldGhvZDogICAgX3NldFZhbHVlRm9yRmxvYXQKLSAqIFNpZ25hdHVyZTogKEpGKVYKLSAqLwotdm9pZCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9SZWZDb250YWluZXJfXzFzZXRWYWx1ZUZvckZsb2F0Ci0gIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0ciwgamZsb2F0IHZhbHVlKXsKLSAgKigoamZsb2F0KikgcHRyKSA9IHZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX1JlZkNvbnRhaW5lcgotICogTWV0aG9kOiAgICBfc2V0VmFsdWVGb3JEb3VibGUKLSAqIFNpZ25hdHVyZTogKEpEKVYKLSAqLwotdm9pZCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9SZWZDb250YWluZXJfXzFzZXRWYWx1ZUZvckRvdWJsZQotICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbG9uZyBwdHIsIGpkb3VibGUgdmFsdWUpewotICAqKChqZG91YmxlKikgcHRyKSA9IHZhbHVlOwotfQotCi0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyCi0gKiBNZXRob2Q6ICAgIF9zZXRWYWx1ZUZvcklVbmtub3duCi0gKiBTaWduYXR1cmU6IChKSilWCi0gKi8KLXZvaWQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyX18xc2V0VmFsdWVGb3JJVW5rbm93bgotICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbG9uZyBwdHIsIGpsb25nIHZhbHVlKXsKLSAgKigoamxvbmcqKSBwdHIpID0gdmFsdWU7Ci19Ci0KLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9SZWZDb250YWluZXIKLSAqIE1ldGhvZDogICAgX3NldFZhbHVlRm9yT2JqZWN0Ci0gKiBTaWduYXR1cmU6IChKTGphdmEvbGFuZy9PYmplY3Q7KVYKLSAqLwotdm9pZCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9SZWZDb250YWluZXJfXzFzZXRWYWx1ZUZvck9iamVjdAotICAoSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBqbG9uZyBwdHIsIGpvYmplY3QgdmFsdWUpewotICAqKChqb2JqZWN0KikgcHRyKSA9IHZhbHVlOwotfQotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX1JlZkNvbnRhaW5lcgotICogTWV0aG9kOiAgICBfc2V0VmFsdWVGb3JWb2lkUHRyCi0gKiBTaWduYXR1cmU6IChKSilWCi0gKi8KLXZvaWQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyX18xc2V0VmFsdWVGb3JWb2lkUHRyCi0gIChKTklFbnYgKmVudiwgam9iamVjdCBvYmosIGpsb25nIHB0ciwgamxvbmcgdmFsdWUpewotICAqKChqbG9uZyopIHB0cikgPSB2YWx1ZTsKLX0KLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9SZWZDb250YWluZXIKLSAqIE1ldGhvZDogICAgX3NldFZhbHVlRm9yU3RyaW5nCi0gKiBTaWduYXR1cmU6IChKTGphdmEvbGFuZy9TdHJpbmc7KVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfUmVmQ29udGFpbmVyX18xc2V0VmFsdWVGb3JTdHJpbmcKLSAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgamxvbmcgcHRyLCBqc3RyaW5nIHN0cikKLSB7Ci0gICAqKChjaGFyKiopIHB0cikgPSAoY2hhciopIGVudi0+R2V0U3RyaW5nQ2hhcnMoc3RyLCBOVUxMKTsKLSB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWNvbWNsdXRjaC9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX2ltcGxfSVNlcnZpY2VQcm92aWRlckltcGwuaCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JU2VydmljZVByb3ZpZGVySW1wbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWY4YjMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAtY29tY2x1dGNoL29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JU2VydmljZVByb3ZpZGVySW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogRE8gTk9UIEVESVQgVEhJUyBGSUxFIC0gaXQgaXMgbWFjaGluZSBnZW5lcmF0ZWQgKi8KLSNpbmNsdWRlIDxqbmkuaD4KLS8qIEhlYWRlciBmb3IgY2xhc3Mgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9pbXBsX0lTZXJ2aWNlUHJvdmlkZXJJbXBsICovCi0KLSNpZm5kZWYgX0luY2x1ZGVkX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9jb21jbHV0Y2hfaW1wbF9JU2VydmljZVByb3ZpZGVySW1wbAotI2RlZmluZSBfSW5jbHVkZWRfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2NvbWNsdXRjaF9pbXBsX0lTZXJ2aWNlUHJvdmlkZXJJbXBsCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX2ltcGxfSVNlcnZpY2VQcm92aWRlckltcGwKLSAqIE1ldGhvZDogICAgX1F1ZXJ5U2VydmljZQotICogU2lnbmF0dXJlOiAoSkpKSkopTG9yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvSVVua25vd247Ci0gKi8KLUpOSUVYUE9SVCBqb2JqZWN0IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfY29tY2x1dGNoX2ltcGxfSVNlcnZpY2VQcm92aWRlckltcGxfXzFRdWVyeVNlcnZpY2UKLSAgKEpOSUVudiAqLCBqb2JqZWN0LCBqbG9uZywgamxvbmcsIGpsb25nLCBqbG9uZywgamxvbmcpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWNvbWNsdXRjaC9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBLmggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWNvbWNsdXRjaC9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MjU0YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1jb21jbHV0Y2gvb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQS5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyogRE8gTk9UIEVESVQgVEhJUyBGSUxFIC0gaXQgaXMgbWFjaGluZSBnZW5lcmF0ZWQgKi8KLSNpbmNsdWRlIDxqbmkuaD4KLS8qIEhlYWRlciBmb3IgY2xhc3Mgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQSAqLwotCi0jaWZuZGVmIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBCi0jZGVmaW5lIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9DSElMRElEX1NFTEYKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9DSElMRElEX1NFTEYgMEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX05BVkRJUl9ET1dOCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUFfTkFWRElSX0RPV04gMkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX05BVkRJUl9GSVJTVENISUxECi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUFfTkFWRElSX0ZJUlNUQ0hJTEQgN0wKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX05BVkRJUl9MQVNUQ0hJTEQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9OQVZESVJfTEFTVENISUxEIDhMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9OQVZESVJfTEVGVAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX05BVkRJUl9MRUZUIDNMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9OQVZESVJfTkVYVAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX05BVkRJUl9ORVhUIDVMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9OQVZESVJfUFJFVklPVVMKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9OQVZESVJfUFJFVklPVVMgNkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX05BVkRJUl9SSUdIVAotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX05BVkRJUl9SSUdIVCA0TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUFfTkFWRElSX1VQCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUFfTkFWRElSX1VQIDFMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9TRUxGTEFHX1RBS0VGT0NVUwotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX1NFTEZMQUdfVEFLRUZPQ1VTIDFMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9TRUxGTEFHX1JFTU9WRVNFTEVDVElPTgotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX1NFTEZMQUdfUkVNT1ZFU0VMRUNUSU9OIDE2TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUFfU1RBVEVfUkVBRE9OTFkKLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9TVEFURV9SRUFET05MWSA2NEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX1NUQVRFX0lOVklTSUJMRQotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX1NUQVRFX0lOVklTSUJMRSAzMjc2OEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX1NUQVRFX09GRlNDUkVFTgotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX1NUQVRFX09GRlNDUkVFTiA2NTUzNkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX1JPTEVfU1lTVEVNX1dJTkRPVwotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX1JPTEVfU1lTVEVNX1dJTkRPVyA5TAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUFfUk9MRV9TWVNURU1fQ0xJRU5UCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUFfUk9MRV9TWVNURU1fQ0xJRU5UIDEwTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUFfUk9MRV9TWVNURU1fTElOSwotI2RlZmluZSBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX1JPTEVfU1lTVEVNX0xJTksgMzBMCi0jdW5kZWYgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9ST0xFX1NZU1RFTV9URVhUCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUFfUk9MRV9TWVNURU1fVEVYVCA0MkwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX1JPTEVfU1lTVEVNX1BVU0hCVVRUT04KLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9ST0xFX1NZU1RFTV9QVVNIQlVUVE9OIDQzTAotI3VuZGVmIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUFfUk9MRV9TWVNURU1fQ0hFQ0tCVVRUT04KLSNkZWZpbmUgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9ST0xFX1NZU1RFTV9DSEVDS0JVVFRPTiA0NEwKLSN1bmRlZiBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX1JPTEVfU1lTVEVNX1JBRElPQlVUVE9OCi0jZGVmaW5lIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUFfUk9MRV9TWVNURU1fUkFESU9CVVRUT04gNDVMCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBCi0gKiBNZXRob2Q6ICAgIF9XaW5kb3dGcm9tQWNjZXNzaWJsZU9iamVjdAotICogU2lnbmF0dXJlOiAoSilKCi0gKi8KLUpOSUVYUE9SVCBqbG9uZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQV9fMVdpbmRvd0Zyb21BY2Nlc3NpYmxlT2JqZWN0Ci0gIChKTklFbnYgKiwgamNsYXNzLCBqbG9uZyk7Ci0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUEKLSAqIE1ldGhvZDogICAgX2dldEFjY2Vzc2libGVDaGlsZHJlbgotICogU2lnbmF0dXJlOiAoTG9yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvSURpc3BhdGNoO0pJSSlbTGphdmEvbGFuZy9PYmplY3Q7Ci0gKi8KLUpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9tc2FhX01TQUFfXzFnZXRBY2Nlc3NpYmxlQ2hpbGRyZW4KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpvYmplY3QsIGpsb25nLCBqaW50LCBqaW50KTsKLQotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX21zYWFfTVNBQQotICogTWV0aG9kOiAgICBfZ2V0Um9sZVRleHQKLSAqIFNpZ25hdHVyZTogKEkpTGphdmEvbGFuZy9TdHJpbmc7Ci0gKi8KLUpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX18xZ2V0Um9sZVRleHQKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBCi0gKiBNZXRob2Q6ICAgIF9BY2Vzc2libGVPYmplY3RGcm9tV2luZG93Ci0gKiBTaWduYXR1cmU6IChKKUoKLSAqLwotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfbXNhYV9NU0FBX18xQWNlc3NpYmxlT2JqZWN0RnJvbVdpbmRvdwotICAoSk5JRW52ICosIGpjbGFzcywgamxvbmcpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWtleWhvb2svLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAta2V5aG9vay8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWY1ODA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAta2V5aG9vay8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0qLnBkYgotb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX2tleWhvb2tfaW1wbF9LZXlIb29rSW1wbC5oCi1vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfa2V5aG9va19pbXBsX1NlbmRFdmVudEltcGwuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAta2V5aG9vay9Db21tb24uaCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAta2V5aG9vay9Db21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViNTUzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWtleWhvb2svQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0NPTU1PTl9IX18KLSNkZWZpbmUgX19DT01NT05fSF9fCi1leHRlcm4gdm9pZCBzdGFydEZpbHRlcigpOwotZXh0ZXJuIHZvaWQgc3RvcEZpbHRlcigpOwotI2VuZGlmIC8qIG5vdCBfX0NPTU1PTl9IX18gKi8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAta2V5aG9vay9LZXlIb29rLmMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWtleWhvb2svS2V5SG9vay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWM4YzFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAta2V5aG9vay9LZXlIb29rLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8am5pLmg+Ci0jaW5jbHVkZSAiS2V5SG9vay5oIgotI2luY2x1ZGUgIm9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9rZXlob29rX2ltcGxfS2V5SG9va0ltcGwuaCIKLQotc3RhdGljIEhIT09LIGhLZXlib2FyZEhvb2s7Ci0KLXR5cGVkZWYgc3RydWN0IEtleUZpbHRlckV4dHJ5IEtleUZpbHRlckVudHJ5OwotdHlwZWRlZiBzdHJ1Y3QgS2V5RmlsdGVyRXh0cnkgewotICAgIGludCB2a2V5OwotICAgIGludCBtb2RpZmllcjsKLSAgICBpbnQgaWR4OwotICAgIEtleUZpbHRlckVudHJ5ICpwbmV4dDsKLX0gS2V5RmlsdGVyRW50cnk7Ci0KLS8qIHByaW1lIG51bWJlciAqLwotI2RlZmluZSBIQVNIU0laRSAxMDcKLXN0YXRpYyBLZXlGaWx0ZXJFbnRyeSogaGFzaFtIQVNIU0laRV07Ci1zdGF0aWMgaW50IGZpbHRlckFsbEtleUZsYWcgPSAwOwotCi1zdGF0aWMgaW50Ci1oYXNoVmFsdWUoS2V5RmlsdGVyRW50cnkqIHBlbnQpCi17Ci0gICAgcmV0dXJuIChwZW50LT52a2V5IHwgKHBlbnQtPm1vZGlmaWVyIDw8IDE2KSkgJSBIQVNIU0laRTsKLX0KLQotc3RhdGljIGludAotaXNFcXVhbEtleUZpbHRlcihLZXlGaWx0ZXJFbnRyeSAqcGVudDEsIEtleUZpbHRlckVudHJ5ICpwZW50MikKLXsKLSAgICByZXR1cm4gKChwZW50MS0+dmtleSA9PSBwZW50Mi0+dmtleSkKLQkgICAgJiYgKHBlbnQxLT5tb2RpZmllciA9PSBwZW50Mi0+bW9kaWZpZXIpKTsKLX0KLQotc3RhdGljIHZvaWQKLXB1dEhhc2goS2V5RmlsdGVyRW50cnkqIHBlbnQpCi17Ci0gICAgaW50IHZhbCA9IGhhc2hWYWx1ZShwZW50KTsKLSAgICBLZXlGaWx0ZXJFbnRyeSogcHAgPSBoYXNoW3ZhbF07Ci0gICAgZm9yIChwcCA9IGhhc2hbdmFsXTsgcHA7IHBwID0gcHAtPnBuZXh0KSB7Ci0JaWYgKGlzRXF1YWxLZXlGaWx0ZXIocGVudCwgcHApKSB7Ci0JICAgIHBwLT52a2V5ID0gcGVudC0+dmtleTsKLQkgICAgcHAtPm1vZGlmaWVyID0gcGVudC0+bW9kaWZpZXI7Ci0JICAgIHBwLT5pZHggPSBwZW50LT5pZHg7Ci0JICAgIGZyZWUocGVudCk7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotICAgIHBlbnQtPnBuZXh0ID0gaGFzaFt2YWxdOwotICAgIGhhc2hbdmFsXSA9IHBlbnQ7Ci19Ci0KLXN0YXRpYyBLZXlGaWx0ZXJFbnRyeSoKLWdldEhhc2goS2V5RmlsdGVyRW50cnkqIHBlbnQpCi17Ci0gICAgaW50IHZhbCA9IGhhc2hWYWx1ZShwZW50KTsKLSAgICBLZXlGaWx0ZXJFbnRyeSAqcHA7Ci0gICAgZm9yIChwcCA9IGhhc2hbdmFsXTsgcHA7IHBwID0gcHAtPnBuZXh0KSB7Ci0JaWYgKGlzRXF1YWxLZXlGaWx0ZXIocGVudCwgcHApKSByZXR1cm4gcHA7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgaW50IFNISUZUX01BU0sgPSAxOwotc3RhdGljIGNvbnN0IGludCBDVFJMX01BU0sgPSAyOwotc3RhdGljIGNvbnN0IGludCBBTFRfTUFTSyA9IDg7Ci0KLXN0YXRpYyBKYXZhVk0gKmp2bTsKLXN0YXRpYyBqY2xhc3Mga2V5SG9va0ltcGxDbGFzczsKLXN0YXRpYyBqbWV0aG9kSUQgaG9va2VkS2V5RW50cnlJRDsKLQotc3RhdGljIGludCBmaWx0ZXJhdGlvblN0b3BwZWQgPSAwOwotCi12b2lkIHN0b3BGaWx0ZXIoKQotewotICAgIGZpbHRlcmF0aW9uU3RvcHBlZCA9IDE7Ci19Ci0KLXZvaWQgc3RhcnRGaWx0ZXIoKQotewotICAgIGZpbHRlcmF0aW9uU3RvcHBlZCA9IDA7Ci19Ci0KLWludCBmaWx0ZXIoaW50IGlkeCwgaW50IHZrZXksIGludCBtb2RpZmllciwgamJvb2xlYW4gaXNVcCkKLXsKLSAgICBKTklFbnYgKmVudjsKLSAgICBqYm9vbGVhbiByOwotICAgIC8vIGpjbGFzcyBjbHM7Ci0KLSAgICBpZiAoKCpqdm0pLT5HZXRFbnYoanZtLCAodm9pZCoqKSAmZW52LCBKTklfVkVSU0lPTl8xXzIpICE9IEpOSV9PSykgcmV0dXJuIDA7Ci0gICAgciA9ICgqZW52KS0+Q2FsbFN0YXRpY0Jvb2xlYW5NZXRob2QoZW52LCBrZXlIb29rSW1wbENsYXNzLCBob29rZWRLZXlFbnRyeUlELAotCQkJCQkoamludCkgaWR4LCAoamludCkgdmtleSwgKGppbnQpIG1vZGlmaWVyLCBpc1VwKTsKLSNpZmRlZiBERUJVRyAgICAKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkZpbHRlcmVkIEtleTolZCwgJWRcbiIsIHBlbnQtPnZrZXksIHBlbnQtPm1vZGlmaWVyKTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLSNlbmRpZgotICAgIHJldHVybiByOwotfQotCi1MUkVTVUxUIENBTExCQUNLCi1LZXlib2FyZFByb2MoaW50IGNvZGUsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gICAgaW50IHZrZXksIG1vZGlmaWVyOwotICAgIEtleUZpbHRlckVudHJ5IGVudDsKLSAgICBLZXlGaWx0ZXJFbnRyeSAqcGVudDsKLSAgICBqYm9vbGVhbiBpc1VwOwotCi0gICAgaWYgKChjb2RlICE9IEhDX0FDVElPTikgfHwgZmlsdGVyYXRpb25TdG9wcGVkKQotCXJldHVybiBDYWxsTmV4dEhvb2tFeChoS2V5Ym9hcmRIb29rLCBjb2RlLCB3UGFyYW0sIGxQYXJhbSk7Ci0KLSNpZmRlZiBERUJVRwotICAgIGZwcmludGYoc3RkZXJyLCAiS2V5Ym9hcmQgSG9va2VkOiVkLCAlZFxuIiwgd1BhcmFtLCBsUGFyYW0pOwotICAgIGZmbHVzaChzdGRlcnIpOwotI2VuZGlmCi0KLSAgICB2a2V5ID0gKGludCkgd1BhcmFtOwotICAgIG1vZGlmaWVyID0gMDsKLSAgICBpZiAoR2V0S2V5U3RhdGUoVktfU0hJRlQpIDwgMCkgewotCW1vZGlmaWVyIHw9IFNISUZUX01BU0s7Ci0gICAgfQotICAgIGlmIChHZXRLZXlTdGF0ZShWS19DT05UUk9MKSA8IDApIHsKLQltb2RpZmllciB8PSBDVFJMX01BU0s7Ci0gICAgfQotICAgIGlmIChHZXRLZXlTdGF0ZShWS19NRU5VKSA8IDApIHsKLQltb2RpZmllciB8PSBBTFRfTUFTSzsKLSAgICB9Ci0gICAgZW50LnZrZXkgPSB2a2V5OwotICAgIGVudC5tb2RpZmllciA9IG1vZGlmaWVyOwotICAgIGlmIChsUGFyYW0gPCAwKSB7Ci0JaXNVcCA9IEpOSV9UUlVFOwotICAgIH0gZWxzZSB7Ci0JaXNVcCA9IEpOSV9GQUxTRTsKLSAgICB9Ci0gICAgaWYgKGZpbHRlckFsbEtleUZsYWcpIHsKLQlwZW50ID0gTlVMTDsKLQlpZiAoZmlsdGVyKDAsIHZrZXksIG1vZGlmaWVyLCBpc1VwKSkgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLQlwZW50ID0gZ2V0SGFzaCgmZW50KTsKLQlpZiAoIXBlbnQpIHJldHVybiBDYWxsTmV4dEhvb2tFeChoS2V5Ym9hcmRIb29rLCBjb2RlLCB3UGFyYW0sIGxQYXJhbSk7Ci0JaWYgKGZpbHRlcihwZW50LT5pZHgsIHZrZXksIG1vZGlmaWVyLCBpc1VwKSkgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiBDYWxsTmV4dEhvb2tFeChoS2V5Ym9hcmRIb29rLCBjb2RlLCB3UGFyYW0sIGxQYXJhbSk7Ci19Ci0KLQotdm9pZCBKTklDQUxMCi1KYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9rZXlob29rX2ltcGxfS2V5SG9va0ltcGxfaW5pdGlhbGl6ZQotKEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXNPYmosIGpsb25nIGh3bmQpCi17Ci0gICAgSElOU1RBTkNFIGhJbnN0OwotICAgIGpjbGFzcyBjbHM7Ci0gICAgRFdPUkQgdGhyZWFkSWQgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKLQotI2lmZGVmIERFQlVHICAgIAotICAgIGZwcmludGYoc3RkZXJyLCAiSG9vayBpbml0aWFsaXphdGlvblxuIik7Ci0jZW5kaWYKLQotICAgIG1lbXNldChoYXNoLCAwLCBzaXplb2YoaGFzaCkpOwotICAgIGhJbnN0ID0gKEhJTlNUQU5DRSkgR2V0TW9kdWxlSGFuZGxlKDApOwotICAgIGhLZXlib2FyZEhvb2sgPSBTZXRXaW5kb3dzSG9va0V4KFdIX0tFWUJPQVJELCBLZXlib2FyZFByb2MsIE5VTEwsIHRocmVhZElkKTsKLSNpZmRlZiBERUJVRyAgICAKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkhvb2sgcmVzdWx0OiVkXG4iLCBoS2V5Ym9hcmRIb29rKTsKLSAgICBmZmx1c2goc3RkZXJyKTsKLSNlbmRpZgotCi0gICAgKCplbnYpLT5HZXRKYXZhVk0oZW52LCAmanZtKTsKLSAgICBrZXlIb29rSW1wbENsYXNzID0gKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYsIHRoaXNPYmopOwotICAgIGtleUhvb2tJbXBsQ2xhc3MgPSAoKmVudiktPk5ld0dsb2JhbFJlZihlbnYsIGtleUhvb2tJbXBsQ2xhc3MpOwotICAgIGhvb2tlZEtleUVudHJ5SUQgPSAoKmVudiktPkdldFN0YXRpY01ldGhvZElEKGVudiwga2V5SG9va0ltcGxDbGFzcywgImhvb2tlZEtleUVudHJ5IiwgIihJSUlaKVoiKTsKLQotICAgIGluaXRpYWxpemVfV2luZG93SG9vayhod25kKTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfa2V5aG9va19pbXBsX0tleUhvb2tJbXBsX2ZpbHRlcktleShKTklFbnYgKmVudiwgam9iamVjdCB0aGlzT2JqLAotCQkJCQkJCQkgICAgICBqaW50IGlkeCwgamludCB2a2V5LCBqaW50IG1vZCkKLXsKLSAgICBLZXlGaWx0ZXJFbnRyeSogcGVudCA9IChLZXlGaWx0ZXJFbnRyeSopIG1hbGxvYyhzaXplb2YoS2V5RmlsdGVyRW50cnkpKTsKLSAgICBtZW1zZXQocGVudCwgMCwgc2l6ZW9mKEtleUZpbHRlckVudHJ5KSk7Ci0gICAgcGVudC0+dmtleSA9IChpbnQpIHZrZXk7Ci0gICAgcGVudC0+bW9kaWZpZXIgPSAoaW50KSBtb2Q7Ci0gICAgcGVudC0+aWR4ID0gaWR4OwotI2lmZGVmIERFQlVHICAgIAotICAgIGZwcmludGYoc3RkZXJyLCAiZmlsdGVyIGtleTolZCwgJWQgXG4iLCB2a2V5LCBtb2QpOwotI2VuZGlmCi0gICAgcHV0SGFzaChwZW50KTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfa2V5aG9va19pbXBsX0tleUhvb2tJbXBsX2ZpbHRlckFsbEtleShKTklFbnYgKmVudiwgam9iamVjdCB0aGlzT2JqLAotCQkJCQkJCQkJIGpib29sZWFuIGZsYWcpCi17Ci0gICAgZmlsdGVyQWxsS2V5RmxhZyA9IGZsYWc7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWtleWhvb2svS2V5SG9vay5oIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1rZXlob29rL0tleUhvb2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5ZDcyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWtleWhvb2svS2V5SG9vay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19LRVlIT09LX0hfXwotI2RlZmluZSBfX0tFWUhPT0tfSF9fCi0KLWV4dGVybiB2b2lkIHN0b3BGaWx0ZXIoKTsKLWV4dGVybiB2b2lkIHN0YXJ0RmlsdGVyKCk7Ci1leHRlcm4gdm9pZCBpbml0aWFsaXplX1dpbmRvd0hvb2soKTsKLQotI2VuZGlmIC8qIF9fS0VZSE9PS19IX18qLwotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWtleWhvb2svTWFrZWZpbGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWtleWhvb2svTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MTA1NTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1rZXlob29rL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUJBU0VQS0cgPSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIua2V5aG9vawotQkFTRUlNUExQS0cgPSAkKEJBU0VQS0cpLmltcGwKLUpBVkFIID0gIiQoSkFWQV9IT01FOi89XClcYmluXGphdmFoIgotSkFWQUhfRkxBR1MgPSAtY2xhc3NwYXRoIC4uL2JpbgotSkFWQV9JTkMgPSAiJChKQVZBX0hPTUUpL2luY2x1ZGUiCi1CTEQgPSAuLlxidWlsZAotQ0MgPSBjbC5leGUKLUNGTEFHUyA9IC1jIC1aaSAtT3ggLUkgJChKQVZBX0lOQykKLUxJTksgPSBsaW5rLmV4ZQotTERGTEFHUyA9IC1kZWJ1ZyAtZGxsCi1MSUJTID0gVXNlcjMyLmxpYgotCi1PQkpTID0gJChCTEQpXEtleUhvb2sub2JqICQoQkxEKVxTZW5kRXZlbnQub2JqICQoQkxEKVxXaW5kb3dIb29rLm9iagotRExMID0gLi4vS2V5SG9vay5kbGwKLQotYWxsOiBpbml0IGhlYWRlcnMgJChETEwpCi0KLWluaXQ6Ci0JLW1rZGlyICQoQkxEKQotCi1jbGVhbjoKLQktcmQgL1MvUSAkKEJMRCkKLQotaGVhZGVyczogCi0JJChKQVZBSCkgJChKQVZBSF9GTEFHUykgJChCQVNFSU1QTFBLRykuS2V5SG9va0ltcGwgJChCQVNFSU1QTFBLRykuU2VuZEV2ZW50SW1wbAotCi0kKERMTCk6ICQoT0JKUykKLQkkKExJTkspICQoTERGTEFHUykgJChPQkpTKSAtb3V0OiQoRExMKSAkKExJQlMpCi0KLS5jeyQoQkxEKX0ub2JqOgotCSQoQ0MpICQoQ0ZMQUdTKSAtRm8kKEJMRClcICQ8Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1rZXlob29rL1NlbmRFdmVudC5jIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL2NwcC1rZXlob29rL1NlbmRFdmVudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODU4NjQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAta2V5aG9vay9TZW5kRXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxqbmkuaD4KLSNpbmNsdWRlICJvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfa2V5aG9va19pbXBsX1NlbmRFdmVudEltcGwuaCIKLQotamJvb2xlYW4gSk5JQ0FMTAotSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfa2V5aG9va19pbXBsX1NlbmRFdmVudEltcGxfXzFwb3N0S2V5TWVzc2FnZQotKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXNPYmosIGpsb25nIGh3bmRMb25nLCBqaW50IHZrZXksIGpib29sZWFuIGlzVXApCi17Ci0gICAgSFdORCBod25kOwotICAgIFVJTlQgbWVzc2FnZTsKLSAgICBqYm9vbGVhbiByZXN1bHQ7Ci0gICAgVUlOVCBzY2FuID0gTWFwVmlydHVhbEtleSh2a2V5LCAwKTsKLSAgICBMUEFSQU0gbFBhcmFtID0gKHNjYW4gJiAweEZGKSA8PCAxNjsKLQotICAgIGlmIChpc1VwKSB7Ci0JbWVzc2FnZSA9IFdNX0tFWVVQOwotCWxQYXJhbSB8PSAoMSA8PCAyOSkgfCAoMSA8PCAzMCkgfCAoMSA8PCAzMSk7Ci0gICAgfSBlbHNlIHsKLQltZXNzYWdlID0gV01fS0VZRE9XTjsKLSAgICB9Ci0KLSAgICBpZiAoaHduZExvbmcgPT0gMCkgewotCWh3bmQgPSBHZXRGb2N1cygpOwotICAgIH0gZWxzZSB7Ci0JaHduZCA9IChIV05EKSBod25kTG9uZzsKLSAgICB9Ci0KLSAgICBzdG9wRmlsdGVyKCk7Ci0gICAgcmVzdWx0ID0gUG9zdE1lc3NhZ2UoaHduZCwgbWVzc2FnZSwgKFdQQVJBTSkgdmtleSwgbFBhcmFtKTsKLSAgICBzdGFydEZpbHRlcigpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWpib29sZWFuIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfa2V5aG9va19pbXBsX1NlbmRFdmVudEltcGxfXzFwb3N0TW91c2VNZXNzYWdlCi0oSk5JRW52ICplbnYsIGpvYmplY3QgdGhpc09iaiwgamxvbmcgaHduZExvbmcsCi0gamludCBidXR0b24sIGppbnQgeCwgamludCB5LCBqYm9vbGVhbiBpc1VwLCBqaW50IGZsYWcpCi17Ci0gICAgSFdORCBod25kOwotICAgIFVJTlQgbWVzc2FnZTsKLSAgICBXUEFSQU0gd1BhcmFtID0gMDsKLSAgICBMUEFSQU0gbFBhcmFtID0gTUFLRUxQQVJBTSgoV09SRCkgeCwgKFdPUkQpIHkpOwotICAgIGpib29sZWFuIHJlc3VsdDsKLQotICAgIGlmIChpc1VwKSB7Ci0Jc3dpdGNoIChidXR0b24pIHsKLQkgIGNhc2UgMDoKLQkgICBtZXNzYWdlID0gV01fTEJVVFRPTlVQOwotCSAgIGJyZWFrOwotCSAgY2FzZSAxOgotCSAgIG1lc3NhZ2UgPSBXTV9NQlVUVE9OVVA7Ci0JICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgbWVzc2FnZSA9IFdNX1JCVVRUT05VUDsKLQkgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgcmV0dXJuIEpOSV9GQUxTRTsKLQl9Ci0gICAgfSBlbHNlIHsKLQlzd2l0Y2ggKGJ1dHRvbikgewotCSAgY2FzZSAwOgotCSAgIG1lc3NhZ2UgPSBXTV9MQlVUVE9ORE9XTjsKLQkgICB3UGFyYW0gPSBNS19MQlVUVE9OOwotCSAgIGJyZWFrOwotCSAgY2FzZSAxOgotCSAgIG1lc3NhZ2UgPSBXTV9NQlVUVE9ORE9XTjsKLQkgICB3UGFyYW0gPSBNS19NQlVUVE9OOwotCSAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgIG1lc3NhZ2UgPSBXTV9SQlVUVE9ORE9XTjsKLQkgICB3UGFyYW0gPSBNS19SQlVUVE9OOwotCSAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICByZXR1cm4gSk5JX0ZBTFNFOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoaHduZExvbmcgPT0gMCkgewotCWh3bmQgPSBHZXRGb2N1cygpOwotICAgIH0gZWxzZSB7Ci0JaHduZCA9IChIV05EKSBod25kTG9uZzsKLSAgICB9Ci0KLSAgICB7Ci0JUE9JTlQgcHQ7Ci0JcHQueCA9IHg7Ci0JcHQueSA9IHk7Ci0JQ2xpZW50VG9TY3JlZW4oaHduZCwgJnB0KTsKLQlTZXRDdXJzb3JQb3MocHQueCwgcHQueSk7Ci0gICAgfQotCi0gICAgc3RvcEZpbHRlcigpOwotICAgIGlmICghaXNVcCkgewotCS8vIFNvbWUgRmxhc2ggY29udGVudCBkZXRlY3RzIG1vdXNlIG1vdmVtZW50IHRvIG1ha2UgYnV0dG9ucyBhY2NlcHQgY2xpY2suCi0JLy8gVGhlIGJlbG93IGNvZGUgc2ltdWxhdGVzIG1vdXNlIG1vdmVtZW50IGJ5IHdhaXRpbmcgMTBtcyBwZXIgZWFjaCBtb3VzZSBtb3ZlbWVudC4gKGhpbWkpCi0JaW50IGk7Ci0JaW50IGxhc3Q7Ci0JTFBBUkFNIGxQYXJhbTI7Ci0JTVNHIG1zZzsKLQlTZW5kTWVzc2FnZShod25kLCBXTV9NT1VTRUFDVElWQVRFLCAoV1BBUkFNKSBHZXRBY3RpdmVXaW5kb3coKSwKLQkJICAgIE1BS0VMUEFSQU0oSFRDTElFTlQsIG1lc3NhZ2UpKTsKLQlmb3IgKGkgPSAzOyBpID49IDA7IGktLSkgewotCSAgICBsUGFyYW0yID0gTUFLRUxQQVJBTSgoV09SRCkgeCArIGksIChXT1JEKSB5KTsKLQkgICAgbGFzdCA9IEdldFRpY2tDb3VudCgpICsgMTA7Ci0JICAgIFNlbmRNZXNzYWdlKGh3bmQsIFdNX01PVVNFQUNUSVZBVEUsIChXUEFSQU0pIEdldEFjdGl2ZVdpbmRvdygpLAotCQkJTUFLRUxQQVJBTShIVENMSUVOVCwgbWVzc2FnZSkpOwotCSAgICBTZW5kTWVzc2FnZShod25kLCBXTV9TRVRDVVJTT1IsIChXUEFSQU0pIGh3bmQsCi0JCQlNQUtFTFBBUkFNKEhUQ0xJRU5ULCBXTV9NT1VTRU1PVkUpKTsKLQkgICAgUG9zdE1lc3NhZ2UoaHduZCwgV01fTU9VU0VNT1ZFLCAwLCBsUGFyYW0yKTsKLQkgICAgd2hpbGUgKGxhc3QgPiBHZXRUaWNrQ291bnQoKSkgewotCQlpZiAoUGVla01lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCwgUE1fUkVNT1ZFKSkgewotCQkgICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKLQkJICAgIERpc3BhdGNoTWVzc2FnZSgmbXNnKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIHJlc3VsdCA9IFBvc3RNZXNzYWdlKGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICBzdGFydEZpbHRlcigpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWpib29sZWFuIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfa2V5aG9va19pbXBsX1NlbmRFdmVudEltcGxfXzFmb2N1c1dpbmRvdwotKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXNPYmosIGpsb25nIGh3bmRMb25nKQotewotICAgIEhXTkQgaHduZCA9IChIV05EKSBod25kTG9uZzsKLSAgICBTZXRGb2N1cyhod25kKTsKLSAgICByZXR1cm4gSk5JX1RSVUU7Ci19Ci0KLXN0YXRpYyBMUFdTVFIKLWNvbnZlcnRfamF2YV9zdHJpbmcoSk5JRW52KiBlbnYsIGpzdHJpbmcganN0cikKLXsKLSAgICBMUFdTVFIgc3RyOwotICAgIGNvbnN0IGpjaGFyKiBqYzsKLSAgICBpbnQgbGVuOwotICAgIGlmICghanN0cikgcmV0dXJuIE5VTEw7Ci0gICAgbGVuID0gKCplbnYpLT5HZXRTdHJpbmdMZW5ndGgoZW52LCBqc3RyKTsKLSAgICBqYyA9ICgqZW52KS0+R2V0U3RyaW5nQ2hhcnMoZW52LCBqc3RyLCBOVUxMKTsKLSAgICBzdHIgPSAoTFBXU1RSKSBtYWxsb2Moc2l6ZW9mKFdDSEFSKSAqIChsZW4gKyAxKSk7Ci0gICAgbWVtY3B5KHN0ciwgamMsIHNpemVvZihXQ0hBUikgKiBsZW4pOwotICAgIHN0cltsZW5dID0gMDsKLSAgICAoKmVudiktPlJlbGVhc2VTdHJpbmdDaGFycyhlbnYsIGpzdHIsIGpjKTsKLSAgICByZXR1cm4gc3RyOwotfQotCi1qbG9uZyBKTklDQUxMCi1KYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9rZXlob29rX2ltcGxfU2VuZEV2ZW50SW1wbF9fMWZpbmRXaW5kb3cKLShKTklFbnYqIGVudiwgam9iamVjdCBvLCBqc3RyaW5nIGpjbGFzc05hbWUsIGpzdHJpbmcgandpbmRvd05hbWUpCi17Ci0gICAgSFdORCBod25kOwotICAgIExQV1NUUiBjbGFzc05hbWUsIHdpbmRvd05hbWU7Ci0gICAgY2xhc3NOYW1lID0gY29udmVydF9qYXZhX3N0cmluZyhlbnYsIGpjbGFzc05hbWUpOwotICAgIHdpbmRvd05hbWUgPSBjb252ZXJ0X2phdmFfc3RyaW5nKGVudiwgandpbmRvd05hbWUpOwotICAgIGh3bmQgPSBGaW5kV2luZG93VyhjbGFzc05hbWUsIHdpbmRvd05hbWUpOwotICAgIGZyZWUoY2xhc3NOYW1lKTsKLSAgICBmcmVlKHdpbmRvd05hbWUpOwotICAgIHJldHVybiAoamxvbmcpIGh3bmQ7Ci19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAta2V5aG9vay9XaW5kb3dIb29rLmMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvY3BwLWtleWhvb2svV2luZG93SG9vay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjc0ZmRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9jcHAta2V5aG9vay9XaW5kb3dIb29rLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxqbmkuaD4KLSNpbmNsdWRlICJLZXlIb29rLmgiCi0KLXN0YXRpYyBISE9PSyBoaG9vazsKLXN0YXRpYyBIV05EIGhtYWluV25kOwotCi1MUkVTVUxUIENBTExCQUNLCi1ob29rZWRXbmRQcm9jUmV0KGludCBjb2RlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICAgIGlmIChjb2RlID09IEhDX0FDVElPTikgewotCUNXUFJFVFNUUlVDVCogcmV0ID0gKENXUFJFVFNUUlVDVCopIGxQYXJhbTsKLQlpZiAocmV0LT5od25kID09IGhtYWluV25kKSB7Ci0jaWZkZWYgREVCVUcKLQkgICAgZnByaW50ZihzdGRlcnIsICJXaW5kb3cgSG9va2VkOiVkLCAlZFxuIiwgd1BhcmFtLCByZXQtPm1lc3NhZ2UpOwotCSAgICBmZmx1c2goc3RkZXJyKTsKLSNlbmRpZgotCSAgICBzd2l0Y2ggKHJldC0+bWVzc2FnZSkgewotCSAgICAgIGNhc2UgV01fQUNUSVZBVEU6Ci0JICAgICAgIGlmIChMT1dPUkQocmV0LT53UGFyYW0pID09IFdBX0lOQUNUSVZFKSB7Ci0JCSAgIHN0b3BGaWx0ZXIoKTsKLQkgICAgICAgfSBlbHNlIHsKLQkJICAgc3RhcnRGaWx0ZXIoKTsKLQkgICAgICAgfQotCSAgICAgICBicmVhazsKLQkgICAgICBjYXNlIFdNX0VOVEVSTUVOVUxPT1A6Ci0JICAgICAgIHN0b3BGaWx0ZXIoKTsKLQkgICAgICAgYnJlYWs7Ci0JICAgICAgY2FzZSBXTV9FWElUTUVOVUxPT1A6Ci0JICAgICAgIHN0YXJ0RmlsdGVyKCk7Ci0JICAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBDYWxsTmV4dEhvb2tFeChoaG9vaywgY29kZSwgd1BhcmFtLCBsUGFyYW0pOwotfQotCi12b2lkCi1pbml0aWFsaXplX1dpbmRvd0hvb2soSFdORCBob29raHduZCkKLXsKLSAgICBpZiAoIWhob29rKSB7Ci0JSElOU1RBTkNFIGhJbnN0OwotCURXT1JEIHRocmVhZElkID0gR2V0Q3VycmVudFRocmVhZElkKCk7Ci0JaEluc3QgPSAoSElOU1RBTkNFKSBHZXRNb2R1bGVIYW5kbGUoMCk7Ci0JaG1haW5XbmQgPSBob29raHduZDsKLQloaG9vayA9IFNldFdpbmRvd3NIb29rRXgoV0hfQ0FMTFdORFBST0NSRVQsIGhvb2tlZFduZFByb2NSZXQsIE5VTEwsIHRocmVhZElkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvQnJvd3Nlckhpc3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9Ccm93c2VySGlzdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmNmNGE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9Ccm93c2VySGlzdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2g7Ci0KLQotLyoqCi0gKiBXcmFwcGVyIGZvciBJVXJsSGlzdG9yeVN0ZzIgb2JqZWN0Ci0gKiBzZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2FhNzY3NzE2KFZTLjg1KS5hc3B4Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQnJvd3Nlckhpc3RvcnkgewotICAgIC8qKgotICAgICAqIEBwYXJhbSB1cmwgdGhlIFVSTCB0byBiZSBjaGVja2VkCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBVUkwgaXMgYWxyZWFkeSB2aXNpdGVkIG9yIG5vdCAKLSAgICAgKi8KLSAgICBib29sZWFuIGlzVmlzaXRlZChTdHJpbmcgdXJsKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9Db21FeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9Db21FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxN2Q3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvQ29tRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaDsKLQotLyoqCi0gKiBTdXBlciBjbGFzcyBvZiBleGNlcHRpb25zIHVzZWQgaW4gY29tY2x1dGNoCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjMwMTUxNTgwMzk0OTU2MDkwMEw7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBDb21FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL0NvbVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL0NvbVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzM5Y2Q3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9Db21QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guaW1wbC5JVXJsSGlzdG9yeVN0ZzJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5rZXlob29rLklLZXlIb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5rZXlob29rLklLZXlIb29rTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmtleWhvb2suSVNlbmRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIua2V5aG9vay5pbXBsLktleUhvb2tJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5rZXlob29rLmltcGwuU2VuZEV2ZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENvbVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIENvbVBsdWdpbiBwbHVnaW47Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSVVybEhpc3RvcnlTdGcySW1wbCBoaXN0b3J5OwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29tUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBDb21TZXJ2aWNlLmluaXRpYWxpemUoKTsKLSAgICAgICAgaGlzdG9yeSA9IG5ldyBJVXJsSGlzdG9yeVN0ZzJJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLSAgICAgICAgaGlzdG9yeS5yZWxlYXNlKCk7Ci0gICAgICAgIENvbVNlcnZpY2UudW5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCi0gICAgcHVibGljIFJlc291cmNlTWFuYWdlciBuZXdSZXNvdXJjZU1hbmFnZXIoUmVzb3VyY2VNYW5hZ2VyIHBhcmVudCkgewotICAgICAgICByZXR1cm4gUmVzb3VyY2VNYW5hZ2VyLm5ld1Jlc291cmNlTWFuYWdlcihwYXJlbnQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQnJvd3Nlckhpc3RvcnkgZ2V0QnJvd3Nlckhpc3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBoaXN0b3J5OwotICAgIH0KLSAgICAKLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgVGhlIElLZXlIb29rTGlzdGVuZXIgdG8gaGFuZGxlIHRoZSBldmVudHMgcmFpc2VkIGJ5IElLZXlIb29rLgotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgdGhlIElLZXlIb29rLgotCSAqIEBzZWUgSUtleUhvb2sKLQkgKi8KLQlwdWJsaWMgSUtleUhvb2sgbmV3S2V5SG9vayhJS2V5SG9va0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWludCBoYW5kbGUgPSBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLmhhbmRsZTsKLQkJcmV0dXJuIG5ldyBLZXlIb29rSW1wbChsaXN0ZW5lciwgaGFuZGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIHRoZSBJU2VuZEV2ZW50Ci0JICogQHNlZSBJU2VuZEV2ZW50Ci0JICovCi0JcHVibGljIElTZW5kRXZlbnQgbmV3U2VuZEV2ZW50KCkgewotCQlyZXR1cm4gU2VuZEV2ZW50SW1wbC5nZXRTZW5kRXZlbnQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvQ29tU2VydmljZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL0NvbVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg5MGFiOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvQ29tU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLmltcGwuSURpc3BhdGNoSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLmltcGwuSVVua25vd25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5tc2FhLklBY2Nlc3NpYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5tc2FhLmltcGwuSUFjY2Vzc2libGVJbXBsOwotCi0vKioKLSAqIENvbVNlcnZpY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIG1ha2UgQ09NIG9iamVjdHMgYW5kIGludGVyYWN0IHdpdGggQ09NCi0gKiBvYmplY3RzLgotICogCi0gKiB7QGxpbmsgQ29tU2VydmljZSNpbml0aWFsaXplKCl9IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIENPTSBpbnRlcmZhY2UKLSAqIGFuZCB7QGxpbmsgQ29tU2VydmljZSN1bmluaXRpYWxpemUoKX0gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0aGUgZW5kIG9mIHVzaW5nCi0gKiBDT00gaW50ZXJmYWNlLgotICovCi1wdWJsaWMgY2xhc3MgQ29tU2VydmljZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIgPSAweDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTFNDVFhfSU5QUk9DX0hBTkRMRVIgPSAweDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTFNDVFhfTE9DQUxfU0VSVkVSID0gMHg0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xTQ1RYX1JFTU9URV9TRVJWRVIgPSAweDEwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xTQ1RYX0FMTCA9IDB4MTc7Ci0KLQlzdGF0aWMgewotCQl0cnkgewotCQkJU3lzdGVtLmxvYWRMaWJyYXJ5KCJKYXZhQ29tIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgd3JhcHBlZCBJVW5rbm93biBvYmplY3QgZnJvbSBwdHIgdXNpbmcgcmVzb3VyY2VNYW5hZ2VyLiBUaGUgcHRyCi0JICogc2hvdWxkIHJlZmVycyB0byBhbiBuYXRpdmUgSVVua25vd24gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZU1hbmFnZXIKLQkgKiBAcGFyYW0gcHRyCi0JICogQHBhcmFtIHBlcm1hbmVudAotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIGlzIHBlcm1hbmVudCBvciBub3QKLQkgKiBAcmV0dXJuIG5ldyBJVW5rbm93biBvYmplY3QKLQkgKi8KLQlzdGF0aWMgcHVibGljIElVbmtub3duIG5ld0lVbmtub3duKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIsCi0JCQlsb25nIHB0ciwgYm9vbGVhbiBwZXJtYW5lbnQpIHsKLQkJcmV0dXJuIElVbmtub3duSW1wbC5uZXdJVW5rbm93bihyZXNvdXJjZU1hbmFnZXIsIHB0ciwgcGVybWFuZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSB3cmFwcGVkIElEaXNwYXRjaCBvYmplY3QgZnJvbSBwdHIgdXNpbmcgcmVzb3VyY2VNYW5hZ2VyIFRoZSBwdHIKLQkgKiBzaG91bGQgcmVmZXJzIHRvIGFuIG5hdGl2ZSBJRGlzcGF0Y2ggb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZU1hbmFnZXIKLQkgKiBAcGFyYW0gcHRyCi0JICogQHBhcmFtIHBlcm1hbmVudAotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIGlzIHBlcm1hbmVudCBvciBub3QKLQkgKiBAcmV0dXJuIG5ldyBJRGlzcGF0Y2ggb2JqZWN0Ci0JICovCi0Jc3RhdGljIHB1YmxpYyBJRGlzcGF0Y2ggbmV3SURpc3BhdGNoKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIsCi0JCQlsb25nIHB0ciwgYm9vbGVhbiBwZXJtYW5lbnQpIHsKLQkJcmV0dXJuIElEaXNwYXRjaEltcGwubmV3SURpc3BhdGNoKHJlc291cmNlTWFuYWdlciwgcHRyLCBwZXJtYW5lbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHdyYXBwZWQgSUFjY2Vzc2libGUgb2JqZWN0IGZyb20gcHRyIHVzaW5nIHJlc291cmNlTWFuYWdlciBUaGUKLQkgKiBwdHIgc2hvdWxkIHJlZmVycyB0byBhbiBuYXRpdmUgSUFjY2Vzc2libGUgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZU1hbmFnZXIKLQkgKiBAcGFyYW0gcHRyCi0JICogQHBhcmFtIHBlcm1hbmVudAotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIGlzIHBlcm1hbmVudCBvciBub3QKLQkgKiBAcmV0dXJuIG5ldyBJQWNjZXNzaWJsZSBvYmplY3QKLQkgKi8KLQlzdGF0aWMgcHVibGljIElBY2Nlc3NpYmxlIG5ld0lBY2Nlc3NpYmxlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIsCi0JCQlsb25nIHB0ciwgYm9vbGVhbiBwZXJtYW5lbnQpIHsKLQkJcmV0dXJuIElBY2Nlc3NpYmxlSW1wbC5uZXdJQWNjZXNzaWJsZShyZXNvdXJjZU1hbmFnZXIsIHB0ciwgcGVybWFuZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2UgdGhlIHdyYXBwZXIgb2YgdGhlIG9iamVjdCBmcm9tIElVbmtub3duIHRvIElEaXNwYXRjaAotCSAqIAotCSAqIEBwYXJhbSBpdW5rCi0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IElVbmtub3duIG9iamVjdAotCSAqIEByZXR1cm4gdGhlIHJlLXdyYXBwZWQgSURpc3BhdGNoIG9iamVjdAotCSAqLwotCXN0YXRpYyBwdWJsaWMgSURpc3BhdGNoIG5ld0lEaXNwYXRjaChJVW5rbm93biBpdW5rKSB7Ci0JCWlmIChpdW5rIGluc3RhbmNlb2YgSVVua25vd25JbXBsKSB7Ci0JCQlJRGlzcGF0Y2ggaWRpc3AgPSBuZXcgSURpc3BhdGNoSW1wbCgoSVVua25vd25JbXBsKSBpdW5rKTsKLQkJCWl1bmsucmVsZWFzZSgpOwotCQkJcmV0dXJuIGlkaXNwOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoYW5nZSB0aGUgd3JhcHBlciBvZiB0aGUgb2JqZWN0IGZyb20gSVVua25vd24gdG8gSUFjY2Vzc2libGUKLQkgKiAKLQkgKiBAcGFyYW0gaXVuawotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBJVW5rbm93biBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSByZS13cmFwcGVkIElBY2Nlc3NpYmxlIG9iamVjdAotCSAqLwotCXN0YXRpYyBwdWJsaWMgSUFjY2Vzc2libGUgbmV3SUFjY2Vzc2libGUoSVVua25vd24gaXVuaykgewotCQlpZiAoaXVuayBpbnN0YW5jZW9mIElVbmtub3duSW1wbCkgewotCQkJSUFjY2Vzc2libGUgaWFjYyA9IG5ldyBJQWNjZXNzaWJsZUltcGwoKElVbmtub3duSW1wbCkgaXVuayk7Ci0JCQlpdW5rLnJlbGVhc2UoKTsKLQkJCXJldHVybiBpYWNjOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEl0IHNob3VsZCBiZSBjYWxsIGJlZm9yZSB1c2luZyBDT00gaW50ZXJmYWNlLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlfaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIEl0IHNob3VsZCBiZSBjYWxsIGFmdGVyIHRoZSBlbmQgb2YgdXNpbmcgQ09NIGludGVyZmFjZS4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgdW5pbml0aWFsaXplKCkgewotCQlfdW5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSXQgY2FsbHMgQ29DcmVhdGVJbnN0YW5jZSB3aXRoIHRoZSByY2xzaWQsIChwVW5rT3V0ZXIgPSBOVUxMKSwgdGhlCi0JICogZHdDbHNDb250ZXh0LCBhbmQgKHJpaWQgPSBJSURfSVVua25vd24pLiBBbmQgaXQgY3JlYXRlIG5ldyB3cmFwcGVkCi0JICogSVVua25vd24gb2JlamN0IHdpdGggdGhlIHBwdjsKLQkgKiAKLQkgKiBzZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNjg2NjE1LmFzcHgKLQkgKiAKLQkgKiBAcGFyYW0gcm0KLQkgKiBAcGFyYW0gcmNsc2lkCi0JICogQHBhcmFtIGR3Q2xzQ29udGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgcHVibGljIElVbmtub3duIGNvQ3JlYXRlSW5zdGFuY2UoUmVzb3VyY2VNYW5hZ2VyIHJtLCBTdHJpbmcgcmNsc2lkLAotCQkJaW50IGR3Q2xzQ29udGV4dCkgewotCQlsb25nIHB0ciA9IF9jb0NyZWF0ZUluc3RhbmNlKHJjbHNpZCwgZHdDbHNDb250ZXh0KTsKLQkJcmV0dXJuIG5ldyBJVW5rbm93bkltcGwocm0sIHB0ciwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjbHNpZEZsYXNoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURpc3BhdGNoIGNyZWF0ZURpc3BhdGNoKFN0cmluZyBjbHNpZEZsYXNoKSB7Ci0JCUlVbmtub3duIGl1bmsgPSBjb0NyZWF0ZUluc3RhbmNlKFJlc291cmNlTWFuYWdlcgotCQkJCS5uZXdSZXNvdXJjZU1hbmFnZXIobnVsbCksIGNsc2lkRmxhc2gsIENMU0NUWF9BTEwpOwotCQlyZXR1cm4gbmV3SURpc3BhdGNoKGl1bmspOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIG5hdGl2ZSB2b2lkIF9pbml0aWFsaXplKCk7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBuYXRpdmUgdm9pZCBfdW5pbml0aWFsaXplKCk7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBuYXRpdmUgbG9uZyBfY29DcmVhdGVJbnN0YW5jZShTdHJpbmcgcmNsc2lkLCBpbnQgZHdDbHNDb250ZXh0KTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL0Rpc3BhdGNoRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvRGlzcGF0Y2hFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2NDI1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvRGlzcGF0Y2hFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoOwotCi0vKioKLSAqIEl0IHdpbGwgYmUgdGhyb3duIHdoZW4gYSBlcnJvciBvY2N1cnMgaW4gaW52b2NhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIERpc3BhdGNoRXhjZXB0aW9uIGV4dGVuZHMgQ29tRXhjZXB0aW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MjI4OTY0MjQzODg0NzY0ODU3TDsKLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIERpc3BhdGNoRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9EaXNwYXRjaE5vTmFtZUV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL0Rpc3BhdGNoTm9OYW1lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkY2M0M2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL0Rpc3BhdGNoTm9OYW1lRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaDsKLQotLyoqCi0gKiBub3QgdXNlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzcGF0Y2hOb05hbWVFeGNlcHRpb24gZXh0ZW5kcyBEaXNwYXRjaEV4Y2VwdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgyOTQ3MzY0NDc3ODIyOTI1NTNMOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgRGlzcGF0Y2hOb05hbWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL0hhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NzRiYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5pbXBsLklEaXNwYXRjaEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5pbXBsLklVbmtub3duSW1wbDsKLQotLyoqCi0gKiBUT0RPOgotICogKEZvciBldmVudCBoYW5kbGluZykKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEhhbmRsZXIgZXh0ZW5kcyBJVW5rbm93bkltcGwgaW1wbGVtZW50cyBJRGlzcGF0Y2ggewotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZGVmYXVsdEhhbmRsZXIoT2JqZWN0W10gYXJncyk7Ci0KLSAgICBwcm90ZWN0ZWQgSGFuZGxlcihSZXNvdXJjZU1hbmFnZXIgcm0pIHsKLSAgICAgICAgc3VwZXIocm0sIF9jcmVhdGVIYW5kbGVyKCksIGZhbHNlKTsKLSAgICAgICAgX3NldE9iamVjdChnZXRQdHIoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGxvbmcgX2NyZWF0ZUhhbmRsZXIoKTsKLSAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIF9zZXRPYmplY3QobG9uZyBwdHIpOwotCi0gICAgcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIHByb3ApIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBpbnZva2UoU3RyaW5nIG1ldGhvZCwgT2JqZWN0W10gYXJncykgewotICAgICAgICByZXR1cm4gZGVmYXVsdEhhbmRsZXIoYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBpbnZva2UwKFN0cmluZyBtZXRob2QpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRIYW5kbGVyKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgaW52b2tlMShTdHJpbmcgbWV0aG9kLCBPYmplY3QgYXJnMSkgewotICAgICAgICByZXR1cm4gZGVmYXVsdEhhbmRsZXIobmV3IE9iamVjdFtdIHsgYXJnMSB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIHByb3AsIE9iamVjdCB2YWwpIHsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVVua25vd24gbmV3SVVua25vd24obG9uZyBwdHIpIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgdHJhbnNpZW50IG9iamVjdC4gIFRodXMsIGRvbid0IG1hbmFnZSBpdCB3aXRoIFJlc291cmNlTWFuYWdlci4KLSAgICAgICAgcmV0dXJuIG5ldyBJVW5rbm93bkltcGwobnVsbCwgcHRyLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSURpc3BhdGNoIG5ld0lEaXNwYXRjaChsb25nIHB0cikgewotICAgICAgICAvLyBDcmVhdGUgYSB0cmFuc2llbnQgb2JqZWN0LiAgVGh1cywgZG9uJ3QgbWFuYWdlIGl0IHdpdGggUmVzb3VyY2VNYW5hZ2VyLgotICAgICAgICByZXR1cm4gbmV3IElEaXNwYXRjaEltcGwobnVsbCwgcHRyLCB0cnVlKTsKLSAgICB9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcgcHJvcCwgT2JqZWN0W10gYXJncykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvSURpc3BhdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvSURpc3BhdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMTMwNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL0lEaXNwYXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2g7Ci0KLS8qKgotICogV3JhcHBlciBmb3IgSURpc3BhdGNoIG9iamVjdCBzZWUKLSAqIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczIyMTYwOC5hc3B4Ci0gKiAKLSAqIElEaXNwYXRjaCBpbnRlcmZhY2UgZGVmaW5lcyB0aGUgbWV0aG9kcyB0byBiZSB1c2VkIGZvciBtZXRob2QgaW52b2NhdGlvbiBhbmQKLSAqIHByb3BlcnR5IG9wZXJhdGlvbnMgd2l0aCBpbnN0YW5jZXMgb2YgbmF0aXZlIElEaXNwYXRjaC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlzcGF0Y2ggZXh0ZW5kcyBJVW5rbm93biB7Ci0JLyoqCi0JICogY2FjaGUgSURzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5hbWVzCi0JICogCi0JICogQHBhcmFtIG5hbWVzCi0JICogICAgICAgICAgICB0aGUgbmFtZXMgb2YgcHJvcGVydGllcyBhbmQgbWV0aG9kcwotCSAqLwotCXZvaWQgY2FjaGVEaXNwSURzKFN0cmluZ1tdIG5hbWVzKTsKLQotCS8qKgotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbmFtZQotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICB0aGUgYXJyYXkgb2YgYXJndW1lbnRzCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBuYXRpdmUgaW52b2NhdGlvbgotCSAqLwotCU9iamVjdCBpbnZva2UoU3RyaW5nIG1ldGhvZCwgT2JqZWN0W10gYXJncyk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWV0aG9kCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIG5hbWUKLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIG5hdGl2ZSBpbnZvY2F0aW9uCi0JICovCi0JT2JqZWN0IGludm9rZTAoU3RyaW5nIG1ldGhvZCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWV0aG9kCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIG5hbWUKLQkgKiBAcGFyYW0gYXJnMQotCSAqICAgICAgICAgICAgdGhlIGFyZ3VtZW50Ci0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBuYXRpdmUgaW52b2NhdGlvbgotCSAqLwotCU9iamVjdCBpbnZva2UxKFN0cmluZyBtZXRob2QsIE9iamVjdCBhcmcxKTsKLQotCS8qKgotCSAqIEBwYXJhbSBwcm9wCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgbmFtZQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqLwotCU9iamVjdCBnZXQoU3RyaW5nIHByb3ApOwotCi0JLyoqCi0JICogQHBhcmFtIHByb3AKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIHZhbAotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIHNldCB0byB0aGUgcHJvcGVydHkKLQkgKi8KLQl2b2lkIHB1dChTdHJpbmcgcHJvcCwgT2JqZWN0IHZhbCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHRyCi0JICogQHJldHVybiBJdCB3aWxsIGJlIGNhbGxlZCBmcm9tIG5hdGl2ZSBjb2RlCi0JICovCi0JSURpc3BhdGNoIG5ld0lEaXNwYXRjaChsb25nIHB0cik7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcAotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgdGhlIGFycmF5IG9mIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0KFN0cmluZyBwcm9wLCBPYmplY3RbXSBhcmdzKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9JRW51bVVua25vd24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9JRW51bVVua25vd24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg0YmY5OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvSUVudW1Vbmtub3duLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaDsKLQotCi0vKioKLSAqIFdyYXBwZXIgZm9yIElFbnVtVW5rbm93biBvYmplY3QKLSAqIHNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM2ODM3NjQoVlMuODUpLmFzcHgKLSAqLwotcHVibGljIGludGVyZmFjZSBJRW51bVVua25vd24gZXh0ZW5kcyBJVW5rbm93biB7Ci0gICAgSVVua25vd25bXSBuZXh0KGludCBudW0pOwotICAgIGJvb2xlYW4gc2tpcChpbnQgbnVtKTsKLSAgICBib29sZWFuIHJlc2V0KCk7Ci0gICAgSUVudW1Vbmtub3duIF9jbG9uZSgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL0lPbGVDb250YWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9JT2xlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTA5NzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL0lPbGVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoOwotCi0KLS8qKgotICogV3JhcHBlciBmb3IgSU9sZUNvbnRhaW5lciBvYmplY3QKLSAqIHNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM2OTAxMDMoVlMuODUpLmFzcHgKLSAqLwotcHVibGljIGludGVyZmFjZSBJT2xlQ29udGFpbmVyIGV4dGVuZHMgSVVua25vd24gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9MRUNPTlRGX0VNQkVERElOR1MgICAgPSAxOyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTEVDT05URl9MSU5LUyAgICAgICAgID0gMjsgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0xFQ09OVEZfT1RIRVJTICAgICAgICA9IDQ7IAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9MRUNPTlRGX09OTFlVU0VSICAgICAgPSA4OyAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTEVDT05URl9PTkxZSUZSVU5OSU5HID0gMTY7IAotCi0gICAgSUVudW1Vbmtub3duIGVudW1PYmplY3RzKGludCBmbGFncyk7Ci0gICAgYm9vbGVhbiBsb2NrQ29udGFpbmVyKGJvb2xlYW4gbG9jayk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvSVJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvSVJlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZTJlZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL0lSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2g7Ci0KLS8qKgotICogSVJlc291cmNlIGludGVyZmFjZSBkZWZpbmVzIHRoZSBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMKLSAqIHRyZWF0cyBuYXRpdmUgcmVzb3VyY2VzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlIHsKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBtYW5hZ2VyIG9mIHRoZSByZXNvdXJjZQotCSAqLwotCVJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQotCS8qKgotCSAqIGNhbGwge0BsaW5rIFJlc291cmNlTWFuYWdlciNhZGRSZXNvdXJjZShJUmVzb3VyY2UpfSB3aXRoIHRoZSB0YXJnZXQKLQkgKi8KLQl2b2lkIGFkZFJlc291cmNlKElSZXNvdXJjZSB0YXJnZXQpOwotCi0JLyoqCi0JICogY2FsbCB7QGxpbmsgUmVzb3VyY2VNYW5hZ2VyI2ZpbmRJblJlc291cmNlKGxvbmcpfSB3aXRoIHRoZSBwdHIKLQkgKi8KLQlJUmVzb3VyY2UgZmluZEluUmVzb3VyY2UobG9uZyBwdHIpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgcmVzb3VyY2UgaXMgcGVybWFuZW50IG9iamVjdCBvciBub3QKLQkgKi8KLQlib29sZWFuIGlzUGVybWFuZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYXRpdmUgcmVmZXJlbmNlIHBvaW50ZXIgb2YgdGhlIHJlc291cmNlCi0JICovCi0JbG9uZyBnZXRQdHIoKTsKLQotCS8qKgotCSAqIGNhbGwge0BsaW5rIFJlc291cmNlTWFuYWdlciNyZW1vdmVSZXNvdXJjZShJUmVzb3VyY2UpfSB3aXRoIHRoaXMKLQkgKi8KLQl2b2lkIHJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9JU2VydmljZVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvSVNlcnZpY2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmY0OGI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9JU2VydmljZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLQotLyoqCi0gKiBXcmFwcGVyIGZvciBJU2VydmljZVByb3ZpZGVyIG9iamVjdAotICogc2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9zeXN0ZW0uaXNlcnZpY2Vwcm92aWRlci5hc3B4Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlcnZpY2VQcm92aWRlciBleHRlbmRzIElVbmtub3duIHsKLQlJVW5rbm93biBxdWVyeVNlcnZpY2UoVVVJRCBndWlkU2VydmljZSwgVVVJRCByaWlkKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9JVW5rbm93bi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL0lVbmtub3duLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxM2JiM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL0lVbmtub3duLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaDsKLQotaW1wb3J0IGphdmEudXRpbC5VVUlEOwotCi0vKioKLSAqIFdyYXBwZXIgZm9yIElVbmtub3duIG9iamVjdAotICogc2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczY4MDUwOShWUy44NSkuYXNweAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVbmtub3duIGV4dGVuZHMgSVJlc291cmNlIHsKLSAgICBVVUlEIElJRF9JT2xlQ29udGFpbmVyID0gVVVJRC5mcm9tU3RyaW5nKCIwMDAwMDExYi0wMDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDYiKTsKLSAgICBVVUlEIElJRF9JV2ViQnJvd3NlcjIgPSBVVUlELmZyb21TdHJpbmcoIkQzMEMxNjYxLUNEQUYtMTFEMC04QTNFLTAwQzA0RkM5RTI2RSIpOwotICAgIFVVSUQgSUlEX0lTZXJ2aWNlUHJvdmlkZXIgPSBVVUlELmZyb21TdHJpbmcoIjZkNTE0MGMxLTc0MzYtMTFjZS04MDM0LTAwYWEwMDYwMDlmYSIpOwotICAgIFVVSUQgSUlEX0lIVE1MRWxlbWVudCA9IFVVSUQuZnJvbVN0cmluZygiMzA1MGYxZmYtOThiNS0xMWNmLWJiODItMDBhYTAwYmRjZTBiIik7Ci0gICAgVVVJRCBJSURfSUFjY2Vzc2libGUgPSBVVUlELmZyb21TdHJpbmcoIjYxODczNkUwLTNDM0QtMTFDRi04MTBDLTAwQUEwMDM4OUI3MSIpOwotCi0gICAgdm9pZCBhZGRSZWYobG9uZyBwdHIpOwotICAgIHZvaWQgcmVsZWFzZSgpOwotICAgIElVbmtub3duIHF1ZXJ5SW50ZXJmYWNlKFVVSUQgaWlkKTsKLQotICAgIAotICAgIC8qKgotCSAqIEl0IHdpbGwgYmUgY2FsbGVkIGZyb20gbmF0aXZlIGNvZGUKLSAgICAgKi8KLSAgICBJVW5rbm93biBuZXdJVW5rbm93bihsb25nIHB0cik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdG90YWwgcmVmZXJlbmNlIGNvdW50Ci0gICAgICovCi0gICAgaW50IGdldFRvdGFsUmVmQ291bnQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9SZWZCb29sZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVmQm9vbGVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDY2ZjI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9SZWZCb29sZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaDsKLQotLyoqCi0gKiBAc2VlIFJlZkNvbnRhaW5lcgotICovCi1wdWJsaWMgY2xhc3MgUmVmQm9vbGVhbiBleHRlbmRzIFJlZkNvbnRhaW5lcnsKLQlwdWJsaWMgUmVmQm9vbGVhbihSZXNvdXJjZU1hbmFnZXIgcm0pewotCQlzdXBlcihybSwgU0laRU9GX0JPT0xFQU4pOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRWYWx1ZSgpewotCQlyZXR1cm4gX2dldFZhbHVlQnlCb29sZWFuKGdldFB0cigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSl7Ci0JCV9zZXRWYWx1ZUZvckJvb2xlYW4oZ2V0UHRyKCksIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVmQnl0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL1JlZkJ5dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYyODE5NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVmQnl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2g7Ci0KLS8qKgotICogQHNlZSBSZWZDb250YWluZXIKLSAqLwotcHVibGljIGNsYXNzIFJlZkJ5dGUgZXh0ZW5kcyBSZWZDb250YWluZXJ7Ci0JcHVibGljIFJlZkJ5dGUoUmVzb3VyY2VNYW5hZ2VyIHJtKXsKLQkJc3VwZXIocm0sIFNJWkVPRl9CWVRFKTsKLQl9Ci0JCi0JcHVibGljIGJ5dGUgZ2V0VmFsdWUoKXsKLQkJcmV0dXJuIF9nZXRWYWx1ZUJ5Qnl0ZShnZXRQdHIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGJ5dGUgdmFsdWUpewotCQlfc2V0VmFsdWVGb3JCeXRlKGdldFB0cigpLCB2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL1JlZkNvbnRhaW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL1JlZkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmJjNTdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9SZWZDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5pbXBsLklSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogUmVmQ29udGFpbmVyIGlzIGFic3RyYWN0IGNsYXNzIG9mIHJlZmVyZW5jZWQgdmFyaWFibGVzLgotICogVGhlIGluc3RhbmNlIG9mIHRoZSBSZWZDb250YWluZXIgaXMgdXNlZCBmb3IgY2FsbCBieSByZWZlcmVuY2UuCi0gKiBZb3UgZG9uJ3QgaGF2ZSB0byBjYXJlIGFib3V0IHRoZSByZXNvdXJjZSBtYW5hZ2VtZW50LCBiZWNhdXNlCi0gKiB0aGUgUmVzb3VyY2VNYW5hZ2VyIHRyZWF0IHRoZSByZXNvdXJjZSBsaWZlIGN5Y2xlLgotICogWW91IGNhbiByZWxlYXNlIHRoZSByZXNvdXJjZSBpZiB5b3UgZG9uJ3QgbmVlZCB0byBrZWVwIGl0LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmQ29udGFpbmVyIGV4dGVuZHMgSVJlc291cmNlSW1wbCB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTSVpFT0ZfQk9PTEVBTiA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX0JZVEUgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9TSE9SVCA9IDI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX0lOVCA9IDQ7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX0xPTkcgPSA4OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9GTE9BVCA9IDQ7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX0RPVUJMRSA9IDg7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0laRU9GX0lVTktPV04gPSA4OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9PQkpFQ1QgPSA4OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNJWkVPRl9WT0lEUFRSID0gODsKLQotCXByaXZhdGUgbG9uZyBwdHI7Ci0KLQlwcml2YXRlIG5hdGl2ZSB2b2lkIF9mcmVlKGxvbmcgcHRyKTsKLQlwcml2YXRlIG5hdGl2ZSBsb25nIF9jYWxsb2MoaW50IHNpemUpOwotCQotCXByb3RlY3RlZCBuYXRpdmUgYm9vbGVhbiBfZ2V0VmFsdWVCeUJvb2xlYW4obG9uZyBwdHIpOwotCXByb3RlY3RlZCBuYXRpdmUgYnl0ZSBfZ2V0VmFsdWVCeUJ5dGUobG9uZyBwdHIpOwotCXByb3RlY3RlZCBuYXRpdmUgc2hvcnQgX2dldFZhbHVlQnlTaG9ydChsb25nIHB0cik7Ci0JcHJvdGVjdGVkIG5hdGl2ZSBpbnQgX2dldFZhbHVlQnlJbnQobG9uZyBwdHIpOwotCXByb3RlY3RlZCBuYXRpdmUgbG9uZyBfZ2V0VmFsdWVCeUxvbmcobG9uZyBwdHIpOwotCXByb3RlY3RlZCBuYXRpdmUgZmxvYXQgX2dldFZhbHVlQnlGbG9hdChsb25nIHB0cik7Ci0JcHJvdGVjdGVkIG5hdGl2ZSBkb3VibGUgX2dldFZhbHVlQnlEb3VibGUobG9uZyBwdHIpOwotCXByb3RlY3RlZCBuYXRpdmUgbG9uZyBfZ2V0VmFsdWVCeUlVbmtub3duKGxvbmcgcHRyKTsKLQlwcm90ZWN0ZWQgbmF0aXZlIE9iamVjdCBfZ2V0VmFsdWVCeU9iamVjdChsb25nIHB0cik7Ci0JcHJvdGVjdGVkIG5hdGl2ZSBsb25nIF9nZXRWYWx1ZUJ5Vm9pZFB0cihsb25nIHB0cik7Ci0JcHJvdGVjdGVkIG5hdGl2ZSBTdHJpbmcgX2dldFZhbHVlQnlTdHJpbmcobG9uZyBwdHIpOwotCi0JcHJvdGVjdGVkIG5hdGl2ZSB2b2lkIF9zZXRWYWx1ZUZvckJvb2xlYW4obG9uZyBwdHIsIGJvb2xlYW4gdmFsdWUpOwotCXByb3RlY3RlZCBuYXRpdmUgdm9pZCBfc2V0VmFsdWVGb3JCeXRlKGxvbmcgcHRyLCBieXRlIHZhbHVlKTsKLQlwcm90ZWN0ZWQgbmF0aXZlIHZvaWQgX3NldFZhbHVlRm9yU2hvcnQobG9uZyBwdHIsIHNob3J0IHZhbHVlKTsKLQlwcm90ZWN0ZWQgbmF0aXZlIHZvaWQgX3NldFZhbHVlRm9ySW50KGxvbmcgcHRyLCBpbnQgdmFsdWUpOwotCXByb3RlY3RlZCBuYXRpdmUgdm9pZCBfc2V0VmFsdWVGb3JMb25nKGxvbmcgcHRyLCBsb25nIHZhbHVlKTsKLQlwcm90ZWN0ZWQgbmF0aXZlIHZvaWQgX3NldFZhbHVlRm9yRmxvYXQobG9uZyBwdHIsIGZsb2F0IHZhbHVlKTsKLQlwcm90ZWN0ZWQgbmF0aXZlIHZvaWQgX3NldFZhbHVlRm9yRG91YmxlKGxvbmcgcHRyLCBkb3VibGUgdmFsdWUpOwotCXByb3RlY3RlZCBuYXRpdmUgdm9pZCBfc2V0VmFsdWVGb3JJVW5rbm93bihsb25nIHB0ciwgbG9uZyB2YWx1ZSk7Ci0JcHJvdGVjdGVkIG5hdGl2ZSB2b2lkIF9zZXRWYWx1ZUZvck9iamVjdChsb25nIHB0ciwgT2JqZWN0IHZhbHVlKTsKLQlwcm90ZWN0ZWQgbmF0aXZlIHZvaWQgX3NldFZhbHVlRm9yVm9pZFB0cihsb25nIHB0ciwgbG9uZyB2YWx1ZSk7Ci0JcHJvdGVjdGVkIG5hdGl2ZSB2b2lkIF9zZXRWYWx1ZUZvclN0cmluZyhsb25nIHB0ciwgU3RyaW5nIHZhbHVlKTsKLQkKLQlwcm90ZWN0ZWQgUmVmQ29udGFpbmVyKFJlc291cmNlTWFuYWdlciBybSwgaW50IHNpemUpIHsKLSAgICAgICAgc3VwZXIocm0sIGZhbHNlKTsKLQkJcHRyID0gX2NhbGxvYyhzaXplKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklSZXNvdXJjZSNnZXRQdHIoKQotCSAqLwotCXB1YmxpYyBsb25nIGdldFB0cigpIHsKLQkJcmV0dXJuIHB0cjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLmltcGwuSVJlc291cmNlSW1wbCNyZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlfZnJlZShwdHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9SZWZEb3VibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9SZWZEb3VibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3MzAyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVmRG91YmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaDsKLQotLyoqCi0gKiBAc2VlIFJlZkNvbnRhaW5lcgotICovCi1wdWJsaWMgY2xhc3MgUmVmRG91YmxlIGV4dGVuZHMgUmVmQ29udGFpbmVyewotCXB1YmxpYyBSZWZEb3VibGUoUmVzb3VyY2VNYW5hZ2VyIHJtKXsKLQkJc3VwZXIocm0sIFNJWkVPRl9ET1VCTEUpOwotCX0KLQkKLQlwdWJsaWMgZG91YmxlIGdldFZhbHVlKCl7Ci0JCXJldHVybiBfZ2V0VmFsdWVCeURvdWJsZShnZXRQdHIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGRvdWJsZSB2YWx1ZSl7Ci0JCV9zZXRWYWx1ZUZvckRvdWJsZShnZXRQdHIoKSwgdmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9SZWZGbG9hdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL1JlZkZsb2F0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MDBjM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL1JlZkZsb2F0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaDsKLQotLyoqCi0gKiBAc2VlIFJlZkNvbnRhaW5lcgotICovCi1wdWJsaWMgY2xhc3MgUmVmRmxvYXQgZXh0ZW5kcyBSZWZDb250YWluZXJ7Ci0JcHVibGljIFJlZkZsb2F0KFJlc291cmNlTWFuYWdlciBybSl7Ci0JCXN1cGVyKHJtLCBTSVpFT0ZfRkxPQVQpOwotCX0KLQkKLQlwdWJsaWMgZmxvYXQgZ2V0VmFsdWUoKXsKLQkJcmV0dXJuIF9nZXRWYWx1ZUJ5RmxvYXQoZ2V0UHRyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShmbG9hdCB2YWx1ZSl7Ci0JCV9zZXRWYWx1ZUZvckZsb2F0KGdldFB0cigpLCB2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL1JlZklVbmtub3duLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVmSVVua25vd24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzNWFjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVmSVVua25vd24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5pbXBsLklVbmtub3duSW1wbDsKLQotLyoqCi0gKiBAc2VlIFJlZkNvbnRhaW5lcgotICovCi1wdWJsaWMgY2xhc3MgUmVmSVVua25vd24gZXh0ZW5kcyBSZWZDb250YWluZXIgewotCXB1YmxpYyBSZWZJVW5rbm93bihSZXNvdXJjZU1hbmFnZXIgcm0pIHsKLQkJc3VwZXIocm0sIFNJWkVPRl9JVU5LT1dOKTsKLQl9Ci0KLQlwdWJsaWMgSVVua25vd24gZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBuZXcgSVVua25vd25JbXBsKGdldFJlc291cmNlTWFuYWdlcigpLCBfZ2V0VmFsdWVCeUlVbmtub3duKGdldFB0cigpKSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoSVVua25vd24gdmFsdWUpIHsKLQkJX3NldFZhbHVlRm9ySVVua25vd24oZ2V0UHRyKCksIHZhbHVlLmdldFB0cigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVmSW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVmSW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OTk5ZTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL1JlZkludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2g7Ci0KLS8qKgotICogQHNlZSBSZWZDb250YWluZXIKLSAqLwotcHVibGljIGNsYXNzIFJlZkludCBleHRlbmRzIFJlZkNvbnRhaW5lcnsKLQlwdWJsaWMgUmVmSW50KFJlc291cmNlTWFuYWdlciBybSl7Ci0JCXN1cGVyKHJtLCBTSVpFT0ZfSU5UKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRWYWx1ZSgpewotCQlyZXR1cm4gX2dldFZhbHVlQnlJbnQoZ2V0UHRyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgdmFsdWUpewotCQlfc2V0VmFsdWVGb3JJbnQoZ2V0UHRyKCksIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVmTG9uZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL1JlZkxvbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2MDNlNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVmTG9uZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2g7Ci0KLS8qKgotICogQHNlZSBSZWZDb250YWluZXIKLSAqLwotcHVibGljIGNsYXNzIFJlZkxvbmcgZXh0ZW5kcyBSZWZDb250YWluZXJ7Ci0JcHVibGljIFJlZkxvbmcoUmVzb3VyY2VNYW5hZ2VyIHJtKXsKLQkJc3VwZXIocm0sIFNJWkVPRl9MT05HKTsKLQl9Ci0JCi0JcHVibGljIGxvbmcgZ2V0VmFsdWUoKXsKLQkJcmV0dXJuIF9nZXRWYWx1ZUJ5TG9uZyhnZXRQdHIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGxvbmcgdmFsdWUpewotCQlfc2V0VmFsdWVGb3JMb25nKGdldFB0cigpLCB2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL1JlZk9iamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL1JlZk9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTFjZGU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9SZWZPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoOwotCi0vKioKLSAqIEBzZWUgUmVmQ29udGFpbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZPYmplY3QgZXh0ZW5kcyBSZWZDb250YWluZXJ7Ci0JcHVibGljIFJlZk9iamVjdChSZXNvdXJjZU1hbmFnZXIgcm0pewotCQlzdXBlcihybSwgU0laRU9GX09CSkVDVCk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKXsKLQkJcmV0dXJuIF9nZXRWYWx1ZUJ5T2JqZWN0KGdldFB0cigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKXsKLQkJX3NldFZhbHVlRm9yT2JqZWN0KGdldFB0cigpLCB2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL1JlZlNob3J0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVmU2hvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUzYzY4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVmU2hvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoOwotCi0vKioKLSAqIEBzZWUgUmVmQ29udGFpbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZTaG9ydCBleHRlbmRzIFJlZkNvbnRhaW5lcnsKLQlwdWJsaWMgUmVmU2hvcnQoUmVzb3VyY2VNYW5hZ2VyIHJtKXsKLQkJc3VwZXIocm0sIFNJWkVPRl9TSE9SVCk7Ci0JfQotCQotCXB1YmxpYyBzaG9ydCBnZXRWYWx1ZSgpewotCQlyZXR1cm4gX2dldFZhbHVlQnlTaG9ydChnZXRQdHIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKHNob3J0IHZhbHVlKXsKLQkJX3NldFZhbHVlRm9yU2hvcnQoZ2V0UHRyKCksIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVmU3RyaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVmU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MzA3ZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL1JlZlN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2g7Ci0KLS8qKgotICogQHNlZSBSZWZDb250YWluZXIKLSAqLwotcHVibGljIGNsYXNzIFJlZlN0cmluZyBleHRlbmRzIFJlZkNvbnRhaW5lcnsKLSAgICAvLyBULkIuRC4KLSAgICBwdWJsaWMgUmVmU3RyaW5nKFJlc291cmNlTWFuYWdlciBybSl7Ci0gICAgICAgIHN1cGVyKHJtLCBTSVpFT0ZfQllURSk7Ci0gICAgfQotCQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKXsKLSAgICAgICAgcmV0dXJuIF9nZXRWYWx1ZUJ5U3RyaW5nKGdldFB0cigpKTsKLSAgICB9Ci0JCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKXsKLSAgICAgICAgX3NldFZhbHVlRm9yU3RyaW5nKGdldFB0cigpLCB2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL1JlZlZvaWQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9SZWZWb2lkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNzczNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL1JlZlZvaWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoOwotCi0vKioKLSAqIEBzZWUgUmVmQ29udGFpbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZWb2lkIGV4dGVuZHMgUmVmQ29udGFpbmVyewotCXB1YmxpYyBSZWZWb2lkKFJlc291cmNlTWFuYWdlciBybSl7Ci0JCXN1cGVyKHJtLCBTSVpFT0ZfVk9JRFBUUik7Ci0JfQotCQotCXB1YmxpYyBsb25nIGdldFZhbHVlKCl7Ci0JCXJldHVybiBfZ2V0VmFsdWVCeVZvaWRQdHIoZ2V0UHRyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShsb25nIHZhbHVlKXsKLQkJX3NldFZhbHVlRm9yVm9pZFB0cihnZXRQdHIoKSwgdmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9SZXNvdXJjZU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9SZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwYTU0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvUmVzb3VyY2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2g7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogUmVzb3VyY2VNYW5hZ2VyIHRyZWF0cyB0aGUgbGlmZSBjeWNsZSBvZiB0aGUgbmF0aXZlIHJlc291cmNlcy4gQWxsIHJlc291cmNlcwotICogYXJlIHdyYXBwZWQgYnkgSmF2YSBvYmplY3QsIHNvIHRoZSByZXNvdXJjZXMgY2FuIGJlIG1hbmFnZWQgYnkgdGhlIGdhcmJhZ2UKLSAqIGNvbGxlY3Rpb24gc3lzdGVtLgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyIHsKLQlwcml2YXRlIGZpbmFsIFJlc291cmNlTWFuYWdlciBwYXJlbnQ7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8UmVzb3VyY2VNYW5hZ2VyPiBjaGlsZFJNczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVNIU0laRSA9ICgxIDw8IDEzKSAtIDE7IC8vIE1lcnNlbm5lIDUuCi0JcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPElSZXNvdXJjZT4gcmVzb3VyY2VIYXNoQXJyYXlbXSA9IG5ldyBXZWFrUmVmZXJlbmNlW0hBU0hTSVpFXTsKLQotCS8qKgotCSAqIEBwYXJhbSBwdHIKLQkgKiAgICAgICAgICAgIHRoZSByZWZlcmVuY2UgcG9pbnRlciB0byBiZSBzZWFyY2hlZAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIElSZXNvdXJjZSBoYXZpbmcgcHRyLiBJdCByZXR1cm5zIG51bGwgaWYgcmVzb3VyY2UKLQkgKiAgICAgICAgIGlzIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGZpbmRJblJlc291cmNlKGxvbmcgcHRyKSB7Ci0JCWludCBpZHggPSAoaW50KSBwdHIgJSBIQVNIU0laRTsKLQkJV2Vha1JlZmVyZW5jZTxJUmVzb3VyY2U+IHdyID0gcmVzb3VyY2VIYXNoQXJyYXlbaWR4XTsKLQkJaWYgKHdyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVJlc291cmNlIHIgPSB3ci5nZXQoKTsKLQkJaWYgKHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoci5nZXRQdHIoKSA9PSBwdHIpCi0JCQlyZXR1cm4gcjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQWxsIHJlc291cmNlcyB3aWxsIGJlIHJlbGVhc2VkLgotCSAqIAotCSAqIEBwYXJhbSBleGNlcHQKLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSB0byBiZSBleGNsdWRlZCBmcm9tIHRoZSBjbGVhcmFuY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlQWxsKElSZXNvdXJjZSBleGNlcHQpIHsKLQkJaW50IGxlbiA9IHJlc291cmNlSGFzaEFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJV2Vha1JlZmVyZW5jZTxJUmVzb3VyY2U+IHdyID0gcmVzb3VyY2VIYXNoQXJyYXlbaV07Ci0JCQlpZiAod3IgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCXJlc291cmNlSGFzaEFycmF5W2ldID0gbnVsbDsKLQkJCUlSZXNvdXJjZSByID0gd3IuZ2V0KCk7Ci0JCQlpZiAociAhPSBudWxsKSB7Ci0JCQkJci5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQkJYWRkUmVzb3VyY2UoZXhjZXB0KTsKLQotCQlpZiAoY2hpbGRSTXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3I8UmVzb3VyY2VNYW5hZ2VyPiBpdG0gPSBjaGlsZFJNcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0bS5oYXNOZXh0KCkpIHsKLQkJCQlpdG0ubmV4dCgpLnJlbGVhc2VBbGwoZXhjZXB0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWFuYWdlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlsb25nIHB0ciA9IHJlc291cmNlLmdldFB0cigpOwotCQlpbnQgaWR4ID0gKGludCkgcHRyICUgSEFTSFNJWkU7Ci0JCVdlYWtSZWZlcmVuY2U8SVJlc291cmNlPiB3ciA9IHJlc291cmNlSGFzaEFycmF5W2lkeF07Ci0JCWlmICh3ciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJUmVzb3VyY2UgciA9IHdyLmdldCgpOwotCQlpZiAociA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUhhc2hBcnJheVtpZHhdID0gbnVsbDsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoci5nZXRQdHIoKSAhPSBwdHIpCi0JCQlyZXR1cm47Ci0JCXJlc291cmNlSGFzaEFycmF5W2lkeF0gPSBudWxsOwotCQl3ci5jbGVhcigpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHRvIGJlIGFkZGVkIHRvIHRoZSBtYW5hZ2VyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2UoSVJlc291cmNlIHRhcmdldCkgewotCQlsb25nIHB0ciA9IHRhcmdldC5nZXRQdHIoKTsKLQkJaW50IGlkeCA9IChpbnQpIHB0ciAlIEhBU0hTSVpFOwotCQlXZWFrUmVmZXJlbmNlPElSZXNvdXJjZT4gd3IgPSBuZXcgV2Vha1JlZmVyZW5jZTxJUmVzb3VyY2U+KHRhcmdldCk7Ci0JCXJlc291cmNlSGFzaEFycmF5W2lkeF0gPSB3cjsKLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgcmVzb3VyY2UgbWFuYWdlcgotCSAqIEByZXR1cm4gdGhlIG5ldyBpbnN0YW5jZSBvZiBSZXNvdXJjZU1hbmFnZXIgaGFzIHRoZSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlTWFuYWdlciBuZXdSZXNvdXJjZU1hbmFnZXIoUmVzb3VyY2VNYW5hZ2VyIHBhcmVudCkgewotCQlSZXNvdXJjZU1hbmFnZXIgcm0gPSBuZXcgUmVzb3VyY2VNYW5hZ2VyKHBhcmVudCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudC5jaGlsZFJNcyA9PSBudWxsKSB7Ci0JCQkJcGFyZW50LmNoaWxkUk1zID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZU1hbmFnZXI+KDEpOwotCQkJfQotCQkJcGFyZW50LmNoaWxkUk1zLmFkZChybSk7Ci0JCX0KLQkJcmV0dXJuIHJtOwotCX0KLQotCXByaXZhdGUgUmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlTWFuYWdlciBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL2ltcGwvRGlzcElERGljdGlvbmFyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL2ltcGwvRGlzcElERGljdGlvbmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGQ2YmI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9pbXBsL0Rpc3BJRERpY3Rpb25hcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLQotcHVibGljIGNsYXNzIERpc3BJRERpY3Rpb25hcnkgewotICAgIHN0YXRpYyBwdWJsaWMgRGlzcElERGljdGlvbmFyeSBnZXREaWN0aW9uYXJ5KFVVSUQgaWlkKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL2ltcGwvSURpc3BhdGNoSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL2ltcGwvSURpc3BhdGNoSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzJhNmFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9pbXBsL0lEaXNwYXRjaEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBEYWlzdWtlIFNBVE8KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guRGlzcGF0Y2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JVW5rbm93bjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLlJlc291cmNlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIElEaXNwYXRjaEltcGwgZXh0ZW5kcyBJVW5rbm93bkltcGwgaW1wbGVtZW50cyBJRGlzcGF0Y2ggewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQ0lEX1NZU1RFTV9ERUZBVUxUID0gMHg0MDA7Ci0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExDSURfVVNFUl9ERUZBVUxUID0gMHg4MDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTUEFUQ0hfTUVUSE9EID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTUEFUQ0hfUFJPUEVSVFlHRVQgPSAyOwotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNQQVRDSF9QUk9QRVJUWVBVVCA9IDQ7Ci0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU1BBVENIX1BST1BFUlRZUFVUUkVGID0gODsKLQotCXByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIExvbmc+IG5hbWVDYWNoZTsKLQotCXByaXZhdGUgbG9uZyBnZXREaXNwSUQoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWVDYWNoZSA9PSBudWxsKSB7Ci0JCQluYW1lQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExvbmc+KDQpOwotCQl9IGVsc2UgewotCQkJTG9uZyBsbCA9IG5hbWVDYWNoZS5nZXQobmFtZSk7Ci0JCQlpZiAobGwgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbGwubG9uZ1ZhbHVlKCk7Ci0JCX0KLQkJbG9uZ1tdIGlkbCA9IF9nZXRJRHNPZk5hbWVzKGdldFB0cigpLCBuZXcgU3RyaW5nW10geyBuYW1lIH0sCi0JCQkJTENJRF9TWVNURU1fREVGQVVMVCk7Ci0JCWlmIChpZGwgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJbG9uZyBkaXNwaWQgPSBpZGxbMF07Ci0JCW5hbWVDYWNoZS5wdXQobmFtZS5pbnRlcm4oKSwgZGlzcGlkKTsKLQkJcmV0dXJuIGRpc3BpZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjYWNoZURpc3BJRHMoU3RyaW5nW10gbmFtZXMpIHsKLQkJaWYgKG5hbWVDYWNoZSA9PSBudWxsKSB7Ci0JCQluYW1lQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExvbmc+KG5hbWVzLmxlbmd0aCk7Ci0JCX0KLQkJbG9uZ1tdIGlkbCA9IF9nZXRJRHNPZk5hbWVzKGdldFB0cigpLCBuYW1lcywgTENJRF9TWVNURU1fREVGQVVMVCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWRsLmxlbmd0aDsgaSsrKSB7Ci0JCQluYW1lQ2FjaGUucHV0KG5hbWVzW2ldLmludGVybigpLCBpZGxbaV0pOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBpbnZva2UoU3RyaW5nIG1ldGhvZCwgT2JqZWN0W10gYXJncykgewotCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4obWV0aG9kICsgIiBpcyBpbnZva2VkLiIgKyBhcmdzKTsKLQkJbG9uZyBpZCA9IGdldERpc3BJRChtZXRob2QpOwotCQlpZiAoaWQgPT0gLTEpCi0JCQl0aHJvdyBuZXcgRGlzcGF0Y2hFeGNlcHRpb24obWV0aG9kICsgIiBpcyBub3QgYXZhaWxhYmxlLiIpOwotCQlyZXR1cm4gaW52b2tlKGlkLCBhcmdzKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGludm9rZShsb25nIGlkLCBPYmplY3RbXSBhcmdzKSB7Ci0JCU9iamVjdCBvYmogPSBfaW52b2tlKGdldFB0cigpLCBpZCwgTENJRF9TWVNURU1fREVGQVVMVCwKLQkJCQlESVNQQVRDSF9NRVRIT0QsIGFyZ3MpOwotCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oIi0+IiArIG9iaik7Ci0JCXJldHVybiBvYmo7Ci0JfQotCi0JcHVibGljIE9iamVjdCBpbnZva2UwKFN0cmluZyBtZXRob2QpIHsKLQkJLy8gU3lzdGVtLmVyci5wcmludGxuKG1ldGhvZCArICIgaXMgaW52b2tlZCB0byAiICsgdGhpcyk7Ci0JCWxvbmcgaWQgPSBnZXREaXNwSUQobWV0aG9kKTsKLQkJaWYgKGlkID09IC0xKQotCQkJdGhyb3cgbmV3IERpc3BhdGNoRXhjZXB0aW9uKG1ldGhvZCArICIgaXMgbm90IGF2YWlsYWJsZS4iKTsKLQkJcmV0dXJuIGludm9rZTAoaWQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgaW52b2tlMChsb25nIGlkKSB7Ci0JCXJldHVybiBpbnZva2UoaWQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgaW52b2tlMShTdHJpbmcgbWV0aG9kLCBPYmplY3QgYXJnMSkgewotCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4obWV0aG9kICsgIiBpcyBpbnZva2VkIHRvICIgKyB0aGlzICsgIiB3aXRoICIrCi0JCS8vIGFyZzEpOwotCQlsb25nIGlkID0gZ2V0RGlzcElEKG1ldGhvZCk7Ci0JCWlmIChpZCA9PSAtMSkKLQkJCXRocm93IG5ldyBEaXNwYXRjaEV4Y2VwdGlvbihtZXRob2QgKyAiIGlzIG5vdCBhdmFpbGFibGUuIik7Ci0JCXJldHVybiBpbnZva2UxKGlkLCBhcmcxKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGludm9rZTEobG9uZyBpZCwgT2JqZWN0IGFyZzEpIHsKLQkJcmV0dXJuIGludm9rZShpZCwgbmV3IE9iamVjdFtdIHsgYXJnMSB9KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcgcHJvcCkgewotCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4ocHJvcCArICIgaXMgYWNjZXNzZWQgZm9yICIgKyB0aGlzKTsKLQkJbG9uZyBpZCA9IGdldERpc3BJRChwcm9wKTsKLQkJaWYgKGlkID09IC0xKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXQoaWQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0KGxvbmcgaWQpIHsKLQkJT2JqZWN0IG9iaiA9IF9pbnZva2UoZ2V0UHRyKCksIGlkLCBMQ0lEX1NZU1RFTV9ERUZBVUxULAotCQkJCURJU1BBVENIX1BST1BFUlRZR0VULCBudWxsKTsKLQkJLy8gU3lzdGVtLmVyci5wcmludGxuKCItPiIgKyBvYmopOwotCQlyZXR1cm4gb2JqOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0KFN0cmluZyBwcm9wLCBPYmplY3RbXSBhcmdzKSB7Ci0JCS8vIFN5c3RlbS5lcnIucHJpbnQocHJvcCArICIgaXMgYWNjZXNzZWQgZm9yICIgKyB0aGlzICsgIiB3aXRoICIpOwotCQkvLyBmb3IoaW50IGk9MDsgaTxhcmdzLmxlbmd0aDsgaSsrKXsKLQkJLy8gaWYoaSAhPSAwKQotCQkvLyBTeXN0ZW0uZXJyLnByaW50KCIsICIpOwotCQkvLyBTeXN0ZW0uZXJyLnByaW50KGFyZ3NbaV0pOwotCQkvLyB9Ci0JCS8vIFN5c3RlbS5lcnIucHJpbnRsbigpOwotCQlsb25nIGlkID0gZ2V0RGlzcElEKHByb3ApOwotCQlpZiAoaWQgPT0gLTEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldChpZCwgYXJncyk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXQobG9uZyBpZCwgT2JqZWN0W10gYXJncykgewotCQlPYmplY3Qgb2JqID0gX2ludm9rZShnZXRQdHIoKSwgaWQsIExDSURfU1lTVEVNX0RFRkFVTFQsCi0JCQkJRElTUEFUQ0hfUFJPUEVSVFlHRVQsIGFyZ3MpOwotCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oIi0+IiArIG9iaik7Ci0JCXJldHVybiBvYmo7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0KFN0cmluZyBwcm9wLCBPYmplY3QgdmFsKSB7Ci0JCWxvbmcgaWQgPSBnZXREaXNwSUQocHJvcCk7Ci0JCWlmIChpZCA9PSAtMSkKLQkJCXRocm93IG5ldyBEaXNwYXRjaEV4Y2VwdGlvbihwcm9wICsgIiBpcyBub3QgYXZhaWxhYmxlLiIpOwotCQlwdXQoaWQsIHZhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0KGxvbmcgaWQsIE9iamVjdCB2YWwpIHsKLQkJX3B1dChnZXRQdHIoKSwgaWQsIExDSURfU1lTVEVNX0RFRkFVTFQsIHZhbCk7Ci0JfQotCi0JcHVibGljIElEaXNwYXRjaEltcGwoUmVzb3VyY2VNYW5hZ2VyIHJtLCBsb25nIHB0ciwgYm9vbGVhbiBwZXJtYW5lbnQpIHsKLQkJc3VwZXIocm0sIHB0ciwgcGVybWFuZW50KTsKLQl9Ci0KLQlwdWJsaWMgSURpc3BhdGNoSW1wbChSZXNvdXJjZU1hbmFnZXIgcm0sIElVbmtub3duIGJhc2UpIHsKLQkJc3VwZXIocm0sIGJhc2UpOwotCX0KLQotCXB1YmxpYyBJRGlzcGF0Y2hJbXBsKElVbmtub3duSW1wbCBiYXNlKSB7Ci0JCXN1cGVyKGJhc2UpOwotCX0KLQotCXByaXZhdGUgbmF0aXZlIGxvbmdbXSBfZ2V0SURzT2ZOYW1lcyhsb25nIHB0ciwgU3RyaW5nW10gbmFtZXMsIGludCBsY2lkKTsKLQotCXByaXZhdGUgbmF0aXZlIE9iamVjdCBfaW52b2tlKGxvbmcgcHRyLCBsb25nIGRpc3BpZCwgaW50IGxjaWQsIGludCBmbGFnLAotCQkJT2JqZWN0W10gYXJncyk7Ci0KLQlwcml2YXRlIG5hdGl2ZSB2b2lkIF9wdXQobG9uZyBwdHIsIGxvbmcgZGlzcGlkLCBpbnQgbGNpZCwgT2JqZWN0IHZhbCk7Ci0KLQlwdWJsaWMgc3RhdGljIElEaXNwYXRjaCBuZXdJRGlzcGF0Y2goUmVzb3VyY2VNYW5hZ2VyIHJtLCBsb25nIHB0ciwKLQkJCWJvb2xlYW4gcGVybWFuZW50KSB7Ci0JCUlEaXNwYXRjaCBpZGlzcCA9IG5ldyBJRGlzcGF0Y2hJbXBsKHJtLCBwdHIsIHBlcm1hbmVudCk7Ci0JCXJtLmFkZFJlc291cmNlKGlkaXNwKTsKLQkJcmV0dXJuIGlkaXNwOwotCX0KLQotCXB1YmxpYyBJRGlzcGF0Y2ggbmV3SURpc3BhdGNoKGxvbmcgcHRyKSB7Ci0JCS8vIFN5c3RlbS5lcnIucHJpbnRsbigiTk46IiArIHB0cik7Ci0JCUlSZXNvdXJjZSByID0gZmluZEluUmVzb3VyY2UocHRyKTsKLQkJaWYgKHIgIT0gbnVsbCkgewotCQkJSURpc3BhdGNoIHggPSAoSURpc3BhdGNoKSByOwotCQkJLy8gU3lzdGVtLmVyci5wcmludGxuKHIgKyAiL1JlZkNvdW50OiIgKyB4LmFkZFJlZigpKTsKLQkJCS8vIHgucmVsZWFzZSgpOwotCQkJcmV0dXJuIHg7Ci0JCX0KLQkJSURpc3BhdGNoIGlkaXNwID0gbmV3IElEaXNwYXRjaEltcGwoZ2V0UmVzb3VyY2VNYW5hZ2VyKCksIHB0ciwgZmFsc2UpOwotCQlhZGRSZXNvdXJjZShpZGlzcCk7Ci0JCXJldHVybiBpZGlzcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvaW1wbC9JRW51bVVua25vd25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvaW1wbC9JRW51bVVua25vd25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OGE2NjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL2ltcGwvSUVudW1Vbmtub3duSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSUVudW1Vbmtub3duOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSVVua25vd247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5SZXNvdXJjZU1hbmFnZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgSUVudW1Vbmtub3duSW1wbCBleHRlbmRzIElVbmtub3duSW1wbCBpbXBsZW1lbnRzIElFbnVtVW5rbm93biB7Ci0KLSAgICBwdWJsaWMgSUVudW1Vbmtub3duSW1wbChSZXNvdXJjZU1hbmFnZXIgcm0sIGxvbmcgcHRyLCBib29sZWFuIHBlcm1hbmVudCkgewotICAgICAgICBzdXBlcihybSwgcHRyLCBwZXJtYW5lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBJRW51bVVua25vd25JbXBsKElVbmtub3duSW1wbCBpdW5rKSB7Ci0gICAgICAgIHRoaXMoaXVuay5nZXRSZXNvdXJjZU1hbmFnZXIoKSwgaXVuay5nZXRQdHIoKSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBJVW5rbm93bltdIG5leHQoaW50IG51bSkgewotICAgICAgICByZXR1cm4gX25leHQoZ2V0UHRyKCksIG51bSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVzZXQoKSB7Ci0gICAgICAgIHJldHVybiBfcmVzZXQoZ2V0UHRyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNraXAoaW50IG51bSkgewotICAgICAgICByZXR1cm4gX3NraXAoZ2V0UHRyKCksIG51bSk7Ci0gICAgfQotCi0gICAgcHVibGljIElFbnVtVW5rbm93biBfY2xvbmUoKSB7Ci0gICAgICAgIElVbmtub3duIGl1bmsgPSBfX2Nsb25lKGdldFB0cigpKTsKLSAgICAgICAgcmV0dXJuIG5ld0lFbnVtVW5rbm93bihpdW5rLmdldFB0cigpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBuYXRpdmUgSVVua25vd25bXSBfbmV4dChsb25nIHB0ciwgaW50IG51bSk7IAotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gX3Jlc2V0KGxvbmcgcHRyKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIF9za2lwKGxvbmcgcHRyLCBpbnQgbnVtKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBJVW5rbm93biBfX2Nsb25lKGxvbmcgcHRyKTsKLQotICAgIHB1YmxpYyBJRW51bVVua25vd24gbmV3SUVudW1Vbmtub3duKGxvbmcgcHRyKSB7Ci0gICAgICAgIElSZXNvdXJjZSByID0gZmluZEluUmVzb3VyY2UocHRyKTsKLSAgICAgICAgaWYgKHIgIT0gbnVsbCkgewotICAgICAgICAgICAgSUVudW1Vbmtub3duIHggPSAoSUVudW1Vbmtub3duKSByOwotICAgICAgICAgICAgcmV0dXJuIHg7Ci0gICAgICAgIH0KLSAgICAgICAgSUVudW1Vbmtub3duIGlldSA9IG5ldyBJRW51bVVua25vd25JbXBsKGdldFJlc291cmNlTWFuYWdlcigpLCBwdHIsIGZhbHNlKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoaWV1KTsKLSAgICAgICAgcmV0dXJuIGlldTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvaW1wbC9JT2xlQ29udGFpbmVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL2ltcGwvSU9sZUNvbnRhaW5lckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhYzBmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvaW1wbC9JT2xlQ29udGFpbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSUVudW1Vbmtub3duOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSU9sZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklVbmtub3duOwotCi0KLQotcHVibGljIGNsYXNzIElPbGVDb250YWluZXJJbXBsIGV4dGVuZHMgSVVua25vd25JbXBsIGltcGxlbWVudHMgSU9sZUNvbnRhaW5lciB7Ci0KLSAgICBwdWJsaWMgSU9sZUNvbnRhaW5lckltcGwoSVVua25vd25JbXBsIGJhc2UpIHsKLSAgICAgICAgc3VwZXIoYmFzZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJRW51bVVua25vd24gZW51bU9iamVjdHMoaW50IGZsYWdzKSB7Ci0gICAgICAgIElVbmtub3duIGl1bmsgPSBfZW51bU9iamVjdHMoZ2V0UHRyKCksIGZsYWdzKTsKLSAgICAgICAgSUVudW1Vbmtub3duIGlldSA9IG5ldyBJRW51bVVua25vd25JbXBsKChJVW5rbm93bkltcGwpIGl1bmspOwotICAgICAgICBpdW5rLnJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIGlldTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBsb2NrQ29udGFpbmVyKGJvb2xlYW4gbG9jaykgewotICAgICAgICByZXR1cm4gX2xvY2tDb250YWluZXIoZ2V0UHRyKCksIGxvY2spOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIG5hdGl2ZSBJVW5rbm93biBfZW51bU9iamVjdHMobG9uZyBwdHIsIGludCBmbGFncyk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiBfbG9ja0NvbnRhaW5lcihsb25nIHB0ciwgYm9vbGVhbiBsb2NrKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL2ltcGwvSVJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL2ltcGwvSVJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFkNjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9pbXBsL0lSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLlJlc291cmNlTWFuYWdlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIElSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBJUmVzb3VyY2UgewotICAgIHByaXZhdGUgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcjsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcGVybWFuZW50OwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQZXJtYW5lbnQoKSB7Ci0gICAgICAgIHJldHVybiBwZXJtYW5lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZU1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVzb3VyY2UoSVJlc291cmNlIHRhcmdldCkgewotICAgICAgICBpZiAocmVzb3VyY2VNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc291cmNlTWFuYWdlci5hZGRSZXNvdXJjZSh0YXJnZXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgaWYgKHJlc291cmNlTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNvdXJjZU1hbmFnZXIucmVtb3ZlUmVzb3VyY2UodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJlc291cmNlIGZpbmRJblJlc291cmNlKGxvbmcgcHRyKSB7Ci0gICAgICAgIGlmIChyZXNvdXJjZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlTWFuYWdlci5maW5kSW5SZXNvdXJjZShwdHIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGxvbmcgeCA9IGdldFB0cigpOwotICAgICAgICByZXR1cm4gKGludCkgKCh4ICYgMHhGRkZGRkZGRikgXiAoeCA+PiAzMikpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgSVJlc291cmNlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBJUmVzb3VyY2UgciA9IChJUmVzb3VyY2UpIG87Ci0gICAgICAgIHJldHVybiAoZ2V0UHRyKCkgPT0gci5nZXRQdHIoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiIFBUUjoiICsgZ2V0UHRyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElSZXNvdXJjZUltcGwoUmVzb3VyY2VNYW5hZ2VyIHJtLCBib29sZWFuIHBlcm1hbmVudCkgewotICAgICAgICB0aGlzLnJlc291cmNlTWFuYWdlciA9IHJtOwotICAgICAgICB0aGlzLnBlcm1hbmVudCA9IHBlcm1hbmVudDsKLSAgICB9Ci0KLSAgICAKLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvaW1wbC9JU2VydmljZVByb3ZpZGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL2ltcGwvSVNlcnZpY2VQcm92aWRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhM2FlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvaW1wbC9JU2VydmljZVByb3ZpZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSVNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklVbmtub3duOwotCi1wdWJsaWMgY2xhc3MgSVNlcnZpY2VQcm92aWRlckltcGwgZXh0ZW5kcyBJVW5rbm93bkltcGwgaW1wbGVtZW50cwotCQlJU2VydmljZVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBJU2VydmljZVByb3ZpZGVySW1wbChJVW5rbm93bkltcGwgYmFzZSkgewotCQlzdXBlcihiYXNlKTsKLQl9Ci0KLQlwdWJsaWMgSVVua25vd24gcXVlcnlTZXJ2aWNlKFVVSUQgZ3VpZFNlcnZpY2UsIFVVSUQgcmlpZCkgewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigicXVlcnlTXHQiK2dldFB0cigpKTsKLQkJcmV0dXJuIF9RdWVyeVNlcnZpY2UoZ2V0UHRyKCksIGd1aWRTZXJ2aWNlLmdldE1vc3RTaWduaWZpY2FudEJpdHMoKSwgZ3VpZFNlcnZpY2UKLQkJCQkuZ2V0TGVhc3RTaWduaWZpY2FudEJpdHMoKSwgcmlpZC5nZXRNb3N0U2lnbmlmaWNhbnRCaXRzKCksIHJpaWQKLQkJCQkuZ2V0TGVhc3RTaWduaWZpY2FudEJpdHMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBuYXRpdmUgSVVua25vd24gX1F1ZXJ5U2VydmljZShsb25nIHB0ciwgbG9uZyBtc2IxLCBsb25nIGxzYjEsIGxvbmcgbXNiMiwKLQkJCWxvbmcgbHNiMik7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9pbXBsL0lVbmtub3duSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL2ltcGwvSVVua25vd25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZTQ2ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvY29tY2x1dGNoL2ltcGwvSVVua25vd25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5VVUlEOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JVW5rbm93bjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIubXNhYS5pbXBsLklBY2Nlc3NpYmxlSW1wbDsKLQotcHVibGljIGNsYXNzIElVbmtub3duSW1wbCBleHRlbmRzIElSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBJVW5rbm93biB7Ci0JLyoKLQkgKiBwcml2YXRlIFVVSUQgZ3VpZDsgcHVibGljIFVVSUQgZ2V0R1VJRCgpIHsgcmV0dXJuIGd1aWQ7IH0KLQkgKi8KLQotCXByaXZhdGUgaW50IGludGVybmFsUmVmQ291bnQ7Ci0JcHJpdmF0ZSBsb25nIHB0cjsKLQotCXB1YmxpYyBsb25nIGdldFB0cigpIHsKLQkJcmV0dXJuIHB0cjsKLQl9Ci0KLQlwdWJsaWMgSVVua25vd24gcXVlcnlJbnRlcmZhY2UoVVVJRCBpaWQpIHsKLQkJSVVua25vd24gaXVuayA9IF9xdWVyeUludGVyZmFjZShwdHIsIGlpZC5nZXRNb3N0U2lnbmlmaWNhbnRCaXRzKCksIGlpZAotCQkJCS5nZXRMZWFzdFNpZ25pZmljYW50Qml0cygpKTsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlF1ZXJ5SVx0IitpdW5rLmdldFB0cigpKTsKLQotCQlpZiAoaXVuayBpbnN0YW5jZW9mIElVbmtub3duSW1wbCkgewotCQkJSVVua25vd25JbXBsIGl1bmtJbXBsID0gKElVbmtub3duSW1wbCkgaXVuazsKLQkJCWlmIChpaWQuZXF1YWxzKElVbmtub3duLklJRF9JT2xlQ29udGFpbmVyKSkgewotCQkJCUlVbmtub3duIGlvYyA9IG5ldyBJT2xlQ29udGFpbmVySW1wbChpdW5rSW1wbCk7Ci0JCQkJaXVuay5yZWxlYXNlKCk7Ci0JCQkJcmV0dXJuIGlvYzsKLQkJCX0gZWxzZSBpZiAoaWlkLmVxdWFscyhJVW5rbm93bi5JSURfSVdlYkJyb3dzZXIyKSkgewotCQkJCUlVbmtub3duIGlkaXNwID0gbmV3IElEaXNwYXRjaEltcGwoaXVua0ltcGwpOwotCQkJCWl1bmsucmVsZWFzZSgpOwotCQkJCXJldHVybiBpZGlzcDsKLQkJCX0gZWxzZSBpZiAoaWlkLmVxdWFscyhJVW5rbm93bi5JSURfSUFjY2Vzc2libGUpKSB7Ci0JCQkJSVVua25vd24gaWFjYyA9IG5ldyBJQWNjZXNzaWJsZUltcGwoaXVua0ltcGwpOwotCQkJCWl1bmsucmVsZWFzZSgpOwotCQkJCXJldHVybiBpYWNjOwotCQkJfSBlbHNlIGlmIChpaWQuZXF1YWxzKElVbmtub3duLklJRF9JU2VydmljZVByb3ZpZGVyKSkgewotCQkJCUlVbmtub3duIGlzcCA9IG5ldyBJU2VydmljZVByb3ZpZGVySW1wbChpdW5rSW1wbCk7Ci0JCQkJaXVuay5yZWxlYXNlKCk7Ci0JCQkJcmV0dXJuIGlzcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXVuazsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUmVsZWFzZVx0IitwdHIpOwotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCXdoaWxlIChpbnRlcm5hbFJlZkNvdW50ID4gMCkgewotCQkJX3JlbGVhc2UocHRyKTsKLQkJCWludGVybmFsUmVmQ291bnQtLTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VG90YWxSZWZDb3VudCgpIHsKLQkJaW50IHIgPSBfYWRkUmVmKHB0cik7Ci0JCV9yZWxlYXNlKHB0cik7Ci0JCXJldHVybiByIC0gMTsKLQl9Ci0KLQlwdWJsaWMgSVVua25vd25JbXBsKFJlc291cmNlTWFuYWdlciBybSwgbG9uZyBwdHIsIGJvb2xlYW4gcGVybWFuZW50KSB7Ci0JCXN1cGVyKHJtLCBwZXJtYW5lbnQpOwotCQl0aGlzLnB0ciA9IHB0cjsKLQkJdGhpcy5pbnRlcm5hbFJlZkNvdW50ID0gMTsKLQl9Ci0KLQlwdWJsaWMgSVVua25vd25JbXBsKFJlc291cmNlTWFuYWdlciBybSwgSVVua25vd24gYmFzZSkgewotCQl0aGlzKHJtLCBiYXNlLmdldFB0cigpLCBmYWxzZSk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJuZXcgSVVcdCIrYmFzZS5nZXRQdHIoKSk7Ci0JCWJhc2UuYWRkUmVmKGJhc2UuZ2V0UHRyKCkpOwotCX0KLQotCXByb3RlY3RlZCBJVW5rbm93bkltcGwoSVVua25vd25JbXBsIGJhc2UpIHsKLQkJdGhpcyhiYXNlLmdldFJlc291cmNlTWFuYWdlcigpLCBiYXNlLnB0ciwgZmFsc2UpOwotCQlhZGRSZWYodGhpcy5wdHIpOwotCX0KLQotCXByaXZhdGUgbmF0aXZlIGludCBfcmVsZWFzZShsb25nIHB0cik7Ci0KLQlwcml2YXRlIG5hdGl2ZSBpbnQgX2FkZFJlZihsb25nIHB0cik7Ci0KLQlwcml2YXRlIG5hdGl2ZSBJVW5rbm93biBfcXVlcnlJbnRlcmZhY2UobG9uZyBwdHIsIGxvbmcgaWlkbXNiLCBsb25nIGlpZGxzYik7Ci0KLQlwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBfYWRkUmVsZWFzZVdhaXRRdWV1ZShsb25nIHB0cik7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKLQkJaWYgKCFpc1Blcm1hbmVudCgpKSB7Ci0JCQl3aGlsZSAoaW50ZXJuYWxSZWZDb3VudCA+IDApIHsKLQkJCQlfYWRkUmVsZWFzZVdhaXRRdWV1ZShwdHIpOwotCQkJCWludGVybmFsUmVmQ291bnQtLTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVVua25vd24gbmV3SVVua25vd24oUmVzb3VyY2VNYW5hZ2VyIHJtLCBsb25nIHB0ciwKLQkJCWJvb2xlYW4gcGVybWFuZW50KSB7Ci0JCUlVbmtub3duIGl1bmsgPSBuZXcgSVVua25vd25JbXBsKHJtLCBwdHIsIHBlcm1hbmVudCk7Ci0JCXJtLmFkZFJlc291cmNlKGl1bmspOwotCQlyZXR1cm4gaXVuazsKLQl9Ci0KLQlwdWJsaWMgSVVua25vd24gbmV3SVVua25vd24obG9uZyBwdHIpIHsKLQkJSVVua25vd24gaXVuayA9IChJVW5rbm93bikgZmluZEluUmVzb3VyY2UocHRyKTsKLQkJaWYgKGl1bmsgIT0gbnVsbCkgewotCQkJaWYgKGl1bmsgaW5zdGFuY2VvZiBJVW5rbm93bkltcGwpIHsKLQkJCQkoKElVbmtub3duSW1wbCkgaXVuaykuaW50ZXJuYWxSZWZDb3VudCsrOwotCQkJfQotCQl9IGVsc2UgewotCQkJaXVuayA9IG5ldyBJVW5rbm93bkltcGwoZ2V0UmVzb3VyY2VNYW5hZ2VyKCksIHB0ciwgZmFsc2UpOwotCQkJYWRkUmVzb3VyY2UoaXVuayk7Ci0JCX0KLQkJcmV0dXJuIGl1bms7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVmKGxvbmcgcHRyKSB7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJBZGRSZWZcdCIrcHRyKTsKLQkJX2FkZFJlZihwdHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9pbXBsL0lVcmxIaXN0b3J5U3RnMkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2NvbWNsdXRjaC9pbXBsL0lVcmxIaXN0b3J5U3RnMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyZjVkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9jb21jbHV0Y2gvaW1wbC9JVXJsSGlzdG9yeVN0ZzJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5Ccm93c2VySGlzdG9yeTsKLQotCi0KLXB1YmxpYyBjbGFzcyBJVXJsSGlzdG9yeVN0ZzJJbXBsIGltcGxlbWVudHMgQnJvd3Nlckhpc3RvcnkgewotICAgIHByaXZhdGUgbG9uZyBwdHI7Ci0gICAgCi0gICAgcHVibGljIElVcmxIaXN0b3J5U3RnMkltcGwoKSB7Ci0gICAgICAgIHB0ciA9IF9pbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpdGVkKFN0cmluZyB1cmwpIHsKLSAgICAgICAgcmV0dXJuIF9pc1Zpc2l0ZWQocHRyLCB1cmwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0gICAgICAgIF9yZWxlYXNlKHB0cik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBuYXRpdmUgbG9uZyBfaW5pdGlhbGl6ZSgpOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gX2lzVmlzaXRlZChsb25nIHB0ciwgU3RyaW5nIHVybCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBfcmVsZWFzZShsb25nIHB0cik7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9rZXlob29rL0lLZXlIb29rLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9rZXlob29rL0lLZXlIb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMDI4MDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIva2V5aG9vay9JS2V5SG9vay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBIaXNhc2hpIE1JWUFTSElUQSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmtleWhvb2s7Ci0KLS8qKgotICogSUtleUhvb2sgaW50ZXJmYWNlIGRlZmluZXMgdGhlIG1ldGhvZHMgdG8gaG9vayBrZXlzIG9mIFdpbmRvd3MuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUtleUhvb2sgewotCS8qKgotCSAqIFJlZ2lzdGVyIHRoZSB2a2V5IG9uIHRoZSBuYXRpdmUga2V5IGhvb2sgdXRpbGl0eS4KLQkgKiAKLQkgKiBAcGFyYW0gdmtleQotCSAqICAgICAgICAgICAgdGhlIHZpcnR1YWwga2V5IGNvZGUgdG8gYmUgaG9va2VkLgotCSAqIEBwYXJhbSBtb2RpZmllcgotCSAqICAgICAgICAgICAgdGhlIG1vZGlmaWVyIGNvZGUgdG8gYmUgdXNlZCB3aGVuIHRoZSBrZXkgaXMgaG9va2VkLgotCSAqLwotCXZvaWQgcmVnaXN0ZXJIb29rZWRLZXkoaW50IHZrZXksIGludCBtb2RpZmllcik7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmxhZwotCSAqICAgICAgICAgICAgaWYgaXQgaXMgdHJ1ZSB0aGVuIGFsbCBvZiBrZXlzIGFyZSBob29rZWQsIGFuZCBpdCBpcyBmYWxzZQotCSAqICAgICAgICAgICAgdGhlbiBhbnkga2V5cyBhcmUgbm90IGhvb2tlZC4KLQkgKi8KLQl2b2lkIGhvb2tBbGwoYm9vbGVhbiBmbGFnKTsKLQotCS8qKgotCSAqIFlvdSBoYXZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHlvdSBkaXNwb3NlIHRoZSBpbnN0YW5jZS4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2tleWhvb2svSUtleUhvb2tMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIva2V5aG9vay9JS2V5SG9va0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YWViYzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIva2V5aG9vay9JS2V5SG9va0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIua2V5aG9vazsKLQotLyoqCi0gKiBUaGUgbGlzdGVuZXIgaW50ZXJmYWNlIGZvciByZWNlaXZpbmcgaG9va2VkIGtleSBldmVudHMuIFRoZSBjbGFzcyB0aGF0IGlzCi0gKiBpbnRlcmVzdGVkIGluIHByb2Nlc3NpbmcgaG9va2VkIGtleSBldmVudHMgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJS2V5SG9va0xpc3RlbmVyIHsKLQkvKioKLQkgKiBJbnZva2Ugd2hlbiBhIGtleSBpcyBob29rZWQuCi0JICogCi0JICogQHBhcmFtIHZrZXkKLQkgKiAgICAgICAgICAgIHRoZSB2aXJ0dWFsIGtleSBjb2RlLgotCSAqIEBwYXJhbSBtb2RpZmllcgotCSAqICAgICAgICAgICAgdGhlIG1vZGlmaWVyIG9mIHRoZSBrZXkuCi0JICogQHBhcmFtIGlzVXAKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGtleSBpcyB1cCBvciBkb3duLgotCSAqIEByZXR1cm4gaWYgdGhlIGtleSBpcyBwcm9jZXNzZWQgaW4gdGhpcyBsaXN0ZW5lciB0aGVuIHJldHVybiB0cnVlLiBUaGUKLQkgKiAgICAgICAgIGtleSB3aWxsIG5vdCBiZSBwcm9jZXNzZWQgYW5vdGhlciBhcHBsaWNhdGlvbnMuCi0JICovCi0JYm9vbGVhbiBob29rZWRLZXkoaW50IHZrZXksIGludCBtb2RpZmllciwgYm9vbGVhbiBpc1VwKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2tleWhvb2svSVNlbmRFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIva2V5aG9vay9JU2VuZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMTcwZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIva2V5aG9vay9JU2VuZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIua2V5aG9vazsKLQotLyoqCi0gKiBJU2VuZEV2ZW50IGludGVyZmFjZSBkZWZpbmVzIHRoZSBtZXRob2RzIHRvIHNlbmQgd2luZG93IGV2ZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VuZEV2ZW50IHsKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzZW5kIGEga2V5IGV2ZW50IHRvIHRoZSBmb2N1c2VkIHdpbmRvdy4KLQkgKiAKLQkgKiBAcGFyYW0gdmtleQotCSAqICAgICAgICAgICAgdGhlIHZpcnR1YWwga2V5IGNvZGUgdG8gYmUgc2VudC4KLQkgKiBAcGFyYW0gaXNVcAotCSAqICAgICAgICAgICAgdGhlIGtleSBzdGF0dXMgb2YgdXAvZG93bi4KLQkgKiBAcmV0dXJuIGlmIHRoaXMgZnVuY3Rpb24gaXMgc3VjY2VlZGVkIHRoZW4gaXQgcmV0dXJuIHRydWUuCi0JICovCi0JYm9vbGVhbiBwb3N0S2V5KGludCB2a2V5LCBib29sZWFuIGlzVXApOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2VuZCBhIG1vdXNlIGV2ZW50IHRvIHRoZSBmb2N1ZXNkIHdpbmRvdy4KLQkgKiAKLQkgKiBAcGFyYW0geAotCSAqICAgICAgICAgICAgVGhlIHggcG9zaXRpb24gb2YgdGhlIG1vdXNlIGN1cnNvciB0byBiZSBzZXQuCi0JICogQHBhcmFtIHkKLQkgKiAgICAgICAgICAgIFRoZSB5IHBvc2l0aW9uIG9mIHRoZSBtb3VzZSBjdXJzb3IgdG8gYmUgc2V0LgotCSAqIEBwYXJhbSBpc1VwCi0JICogICAgICAgICAgICBUaGUgbW91c2Ugc3RhdHVzIG9mIHVwL2Rvd24uCi0JICogQHJldHVybiBJZiB0aGlzIGZ1bmN0aW9uIGlzIHN1Y2NlZWRlZCB0aGVuIGl0IHJldHVybiB0cnVlLgotCSAqLwotCWJvb2xlYW4gcG9zdE1vdXNlKGludCB4LCBpbnQgeSwgYm9vbGVhbiBpc1VwKTsKLQotCS8qKgotCSAqIEBwYXJhbSBod25kCi0JICogICAgICAgICAgICBUaGUgd2luZG93IGhhbmRsZSB0byBiZSBmb2N1c2VkLgotCSAqIEByZXR1cm4gSWYgdGhpcyBmdW5jdGlvbiBpcyBzdWNjZWVkZWQgdGhlbiBpdCByZXR1cm4gdHJ1ZS4KLQkgKi8KLQlib29sZWFuIGZvY3VzV2luZG93KGxvbmcgaHduZCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaHduZAotCSAqICAgICAgICAgICAgVGhlIHdpbmRvdyBoYW5kbGUgdG8gd2hpY2ggdGhlIGtleSBldmVudCB3aWxsIGJlIHNlbnQuCi0JICogQHBhcmFtIHZrZXkKLQkgKiAgICAgICAgICAgIFRoZSB2aXJ0dWFsIGtleSBjb2RlIHRvIGJlIHNlbnQuCi0JICogQHBhcmFtIGlzVXAKLQkgKiAgICAgICAgICAgIFRoZSBrZXkgc3RhdHVzIG9mIHVwL2Rvd24uCi0JICogQHJldHVybiBJZiB0aGlzIGZ1bmN0aW9uIGlzIHN1Y2NlZWRlZCB0aGVuIGl0IHJldHVybiB0cnVlLgotCSAqLwotCWJvb2xlYW4gcG9zdEtleVRvV2luZG93KGxvbmcgaHduZCwgaW50IHZrZXksIGJvb2xlYW4gaXNVcCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaHduZAotCSAqICAgICAgICAgICAgVGhlIHdpbmRvdyBoYW5kbGUgdG8gd2hpY2ggdGhlIG1vdXNlIGV2ZW50IHdpbGwgYmUgc2VudC4KLQkgKiBAcGFyYW0geAotCSAqICAgICAgICAgICAgVGhlIHggcG9zaXRpb24gb2YgdGhlIG1vdXNlIGN1cnNvciB0byBiZSBzZXQuCi0JICogQHBhcmFtIHkKLQkgKiAgICAgICAgICAgIFRoZSB5IHBvc2l0aW9uIG9mIHRoZSBtb3VzZSBjdXJzb3IgdG8gYmUgc2V0LgotCSAqIEBwYXJhbSBpc1VwCi0JICogICAgICAgICAgICBUaGUgbW91c2Ugc3RhdHVzIG9mIHVwL2Rvd24uCi0JICogQHJldHVybiBJZiB0aGlzIGZ1bmN0aW9uIGlzIHN1Y2NlZWRlZCB0aGVuIGl0IHJldHVybiB0cnVlLgotCSAqLwotCWJvb2xlYW4gcG9zdE1vdXNlVG9XaW5kb3cobG9uZyBod25kLCBpbnQgeCwgaW50IHksIGJvb2xlYW4gaXNVcCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogICAgICAgICAgICBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgd2luZG93IHRvIGJlIHNlYXJjaGVkLgotCSAqIEBwYXJhbSB3aW5kb3dOYW1lCi0JICogICAgICAgICAgICBUaGUgd2luZG93IG5hbWUgb2YgdGhlIHdpbmRvdyB0byBiZSBzZWFyY2hlZC4KLQkgKiBAcmV0dXJuIElmIHRoaXMgZnVuY3Rpb24gaXMgc3VjY2VlZGVkIHRoZW4gaXQgcmV0dXJuIHRydWUuCi0JICovCi0JbG9uZyBmaW5kV2luZG93KFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyB3aW5kb3dOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2tleWhvb2svaW1wbC9LZXlIb29rSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIva2V5aG9vay9pbXBsL0tleUhvb2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjODRhNDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIva2V5aG9vay9pbXBsL0tleUhvb2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEhpc2FzaGkgTUlZQVNISVRBIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIua2V5aG9vay5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmtleWhvb2suSUtleUhvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmtleWhvb2suSUtleUhvb2tMaXN0ZW5lcjsKLQotCi0KLQotcHVibGljIGNsYXNzIEtleUhvb2tJbXBsIGltcGxlbWVudHMgSUtleUhvb2sgewotICAgIHN0YXRpYyB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIktleUhvb2siKTsKLSAgICAgICAgfSBjYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoU2V0PEtleUhvb2tJbXBsPiBob29rcyA9IG5ldyBIYXNoU2V0PEtleUhvb2tJbXBsPigpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBJS2V5SG9va0xpc3RlbmVyIGtleUhvb2tMaXN0ZW5lcjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKEtleUhvb2tJbXBsIGluc3QpIHsKLSAgICAgICAgaG9va3MuYWRkKGluc3QpOwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaG9va2VkS2V5RW50cnkoaW50IGlkeCwgaW50IHZrZXksIGludCBtb2RpZmllciwgYm9vbGVhbiBpc1VwKSB7Ci0gICAgICAgIEl0ZXJhdG9yPEtleUhvb2tJbXBsPiBpdCA9IGhvb2tzLml0ZXJhdG9yKCk7Ci0gICAgICAgIGJvb2xlYW4gZmlsdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgS2V5SG9va0ltcGwgaW5zdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGZpbHRlcmVkID0gIGluc3Qua2V5SG9va0xpc3RlbmVyLmhvb2tlZEtleSh2a2V5LCBtb2RpZmllciwgaXNVcCkgfHwgZmlsdGVyZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbHRlcmVkOwotICAgIH0KLSAgICAKLSAgICBzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgcmVnaXN0ZXJIb29rZWRLZXkoaW50IHZrZXksIGludCBtb2RpZmllcikgewotICAgICAgICBmaWx0ZXJLZXkoMCwgdmtleSwgbW9kaWZpZXIpOwotICAgIH0KLQotICAgIHN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBob29rQWxsKGJvb2xlYW4gZmxhZykgewotICAgICAgICBmaWx0ZXJBbGxLZXkoZmxhZyk7Ci0gICAgfQotCi0gICAgcHVibGljIEtleUhvb2tJbXBsKElLZXlIb29rTGlzdGVuZXIga2V5SG9va0xpc3RlbmVyLCBsb25nIGh3bmQpIHsKLSAgICAgICAgaWYgKCFpbml0aWFsaXplZCkgewotICAgICAgICAgICAgaW5pdGlhbGl6ZShod25kKTsKLSAgICAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZWdpc3Rlcih0aGlzKTsKLSAgICAgICAgdGhpcy5rZXlIb29rTGlzdGVuZXIgPSBrZXlIb29rTGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0aWFsaXplKGxvbmcgaHduZCk7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBmaWx0ZXJLZXkoaW50IGlkeCwgaW50IHZrZXksIGludCBtb2RpZmllcik7Ci0gICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBmaWx0ZXJBbGxLZXkoYm9vbGVhbiBmbGFnKTsKLQotICAgIHN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBob29rcy5yZW1vdmUodGhpcyk7Ci0gICAgfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIva2V5aG9vay9pbXBsL1NlbmRFdmVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL2tleWhvb2svaW1wbC9TZW5kRXZlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNDhmZmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIva2V5aG9vay9pbXBsL1NlbmRFdmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSGlzYXNoaSBNSVlBU0hJVEEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5rZXlob29rLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIua2V5aG9vay5JU2VuZEV2ZW50OwotCi0KLQotcHVibGljIGNsYXNzIFNlbmRFdmVudEltcGwgaW1wbGVtZW50cyBJU2VuZEV2ZW50IHsKLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3lzdGVtLmxvYWRMaWJyYXJ5KCJLZXlIb29rIik7Ci0gICAgICAgIH0gY2F0Y2goIEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNlbmRFdmVudEltcGwgaW5zdGFuY2UgPSBuZXcgU2VuZEV2ZW50SW1wbCgpOwotICAgIHB1YmxpYyBzdGF0aWMgSVNlbmRFdmVudCBnZXRTZW5kRXZlbnQoKSB7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwb3N0S2V5KGludCB2a2V5LCBib29sZWFuIGlzVXApIHsKLSAgICAgICAgcmV0dXJuIF9wb3N0S2V5TWVzc2FnZSgwLCB2a2V5LCBpc1VwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwb3N0TW91c2UoaW50IHgsIGludCB5LCBib29sZWFuIGlzVXApIHsKLSAgICAgICAgcmV0dXJuIF9wb3N0TW91c2VNZXNzYWdlKDAsIDAsIHgsIHksIGlzVXAsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHBvc3RNb3VzZVRvV2luZG93KGxvbmcgaHduZCwgaW50IHgsIGludCB5LCBib29sZWFuIGlzVXApIHsKLSAgICAgICAgcmV0dXJuIF9wb3N0TW91c2VNZXNzYWdlKGh3bmQsIDAsIHgsIHksIGlzVXAsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGZvY3VzV2luZG93KGxvbmcgaHduZCkgewotICAgICAgICByZXR1cm4gX2ZvY3VzV2luZG93KGh3bmQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHBvc3RLZXlUb1dpbmRvdyhsb25nIGh3bmQsIGludCB2a2V5LCBib29sZWFuIGlzVXApIHsKLSAgICAgICAgcmV0dXJuIF9wb3N0S2V5TWVzc2FnZShod25kLCB2a2V5LCBpc1VwKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGxvbmcgZmluZFdpbmRvdyhTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgd2luZG93TmFtZSkgewotICAgICAgICByZXR1cm4gX2ZpbmRXaW5kb3coY2xhc3NOYW1lLCB3aW5kb3dOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIF9wb3N0S2V5TWVzc2FnZShsb25nIGh3bmQsIGludCB2a2V5LCBib29sZWFuIGlzVXApOwotICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gX3Bvc3RNb3VzZU1lc3NhZ2UobG9uZyBod25kLCBpbnQgYnV0dG9uLCBpbnQgeCwgaW50IHksIGJvb2xlYW4gaXNVcCwgaW50IGZsYWdzKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBib29sZWFuIF9mb2N1c1dpbmRvdyhsb25nIGh3bmQpOwotICAgIHByaXZhdGUgbmF0aXZlIGxvbmcgX2ZpbmRXaW5kb3coU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHdpbmRvd05hbWUpOwotCi0gICAgcHJpdmF0ZSBTZW5kRXZlbnRJbXBsKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL21zYWEvSUFjY2Vzc2libGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL21zYWEvSUFjY2Vzc2libGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkMmEyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9tc2FhL0lBY2Nlc3NpYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5tc2FhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JRGlzcGF0Y2g7Ci0KLS8qKgotICogV3JhcHBlciBmb3IgSUFjY2Vzc2libGUgb2JqZWN0Ci0gKiBzZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2FjY2Vzc2liaWxpdHkuaWFjY2Vzc2libGUuYXNweAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY2Nlc3NpYmxlIGV4dGVuZHMgSURpc3BhdGNoewotCVN0cmluZyBnZXRBY2NLZXlib2FyZFNob3J0Y3V0KGludCBjaGlsZCk7Ci0KLQlpbnQgZ2V0QWNjU3RhdGUoaW50IGNoaWxkKTsKLQotCWJvb2xlYW4gYWNjRG9EZWZhdWx0QWN0aW9uKGludCBjaGlsZCk7Ci0KLQlpbnQgZ2V0QWNjQ2hpbGRDb3VudCgpOwotCi0JaW50IGdldEFjY1JvbGUoaW50IGNoaWxkKTsKLQotCVN0cmluZyBnZXRBY2NOYW1lKGludCBjaGlsZCk7Ci0KLQl2b2lkIGFjY1NlbGVjdChpbnQgc2VsZmxhZ1Rha2Vmb2N1cywgaW50IGNoaWxkKTsKLQotCVN0cmluZyBnZXRBY2NEZXNjcmlwdGlvbihpbnQgY2hpbGQpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvbXNhYS9NU0FBLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9tc2FhL01TQUEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1NTIwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9tc2FhL01TQUEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLm1zYWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklEaXNwYXRjaDsKLQotCi0vKioKLSAqIE1TQUEgaXMgdXRpbGl0eSBmb3IgTWljcm9zb2Z0IEFjdGl2ZSBBY2Nlc3NpYmlsaXR5IEludGVyZmFjZQotICogc2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczY5NzcwNy5hc3B4Ci0gKi8KLXB1YmxpYyBjbGFzcyBNU0FBIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENISUxESURfU0VMRiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWRElSX0RPV04gPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVkRJUl9GSVJTVENISUxEID0gNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZESVJfTEFTVENISUxEID0gODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZESVJfTEVGVCA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWRElSX05FWFQgPSA1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVkRJUl9QUkVWSU9VUyA9IDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFWRElSX1JJR0hUID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQVZESVJfVVAgPSAxOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTEZMQUdfVEFLRUZPQ1VTID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxGTEFHX1JFTU9WRVNFTEVDVElPTiA9IDE2OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUkVBRE9OTFkgPSAweDQwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lOVklTSUJMRSA9IDB4ODAwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURV9PRkZTQ1JFRU4gPSAweDEwMDAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9MRV9TWVNURU1fV0lORE9XID0gMHgwOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST0xFX1NZU1RFTV9DTElFTlQgPSAweDBhOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPTEVfU1lTVEVNX0xJTksgPSAweDFlOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPTEVfU1lTVEVNX1RFWFQgPSAweDJhOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPTEVfU1lTVEVNX1BVU0hCVVRUT04gPSAweDJiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPTEVfU1lTVEVNX0NIRUNLQlVUVE9OID0gMHgyYzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST0xFX1NZU1RFTV9SQURJT0JVVFRPTiA9IDB4MmQ7Ci0JCi0JCi0JLyoqCi0JICogV3JhcHBlciBmb3IgR2V0Um9sZVRleHQgbWV0aG9kCi0JICogc2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczY5NjE5MyhWUy44NSkuYXNweAotCSAqIEBwYXJhbSBhY2NSb2xlIHRoZSBvYmplY3Qgcm9sZSBjb25zdGFudHMKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJvbGVUZXh0KGludCBhY2NSb2xlKSB7Ci0JCXJldHVybiBfZ2V0Um9sZVRleHQoYWNjUm9sZSk7Ci0JfQotCi0JLyoqCi0JICogV3JhcHBlciBmb3IgV2luZG93RnJvbUFjY2Vzc2libGVPYmplY3QgbWV0aG9kCi0JICogc2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczY5NzIwMShWUy44NSkuYXNweAotCSAqIEBwYXJhbSBwdHIgdGhlIHBvaW50ZXIgdG8gdGhlIElBY2Nlc3NpYmxlIAotCSAqIEByZXR1cm4gdGhlIHdpbmRvdyBoYW5kbGUgdG8gYmUgcmV0cmlldmVkIGZyb20gdGhlIHBvaW50ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmcgV2luZG93RnJvbUFjY2Vzc2libGVPYmplY3QobG9uZyBwdHIpIHsKLQkJcmV0dXJuIF9XaW5kb3dGcm9tQWNjZXNzaWJsZU9iamVjdChwdHIpOwotCX0KLQotCS8qKgotCSAqIFdyYXBwZXIgZm9yIEFjY2Vzc2libGVDaGlsZHJlbiBtZXRob2QKLQkgKiBzZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNjk3MjQzKFZTLjg1KS5hc3B4Ci0JICogQHBhcmFtIGlkaXNwIHRoZSBwYXJlbnQgb2JqZWN0Ci0JICogQHBhcmFtIHN0YXJ0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hpbGQKLQkgKiBAcGFyYW0gY291bnQgdGhlIGFtb3VudCBvZiBjaGlsZHJlbiB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGNoaWxkcmVuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRBY2Nlc3NpYmxlQ2hpbGRyZW4oSURpc3BhdGNoIGlkaXNwLCBpbnQgc3RhcnQsIGludCBjb3VudCkgewotCQlyZXR1cm4gX2dldEFjY2Vzc2libGVDaGlsZHJlbihpZGlzcCwgaWRpc3AuZ2V0UHRyKCksIHN0YXJ0LCBjb3VudCk7Ci0JfSAKLQkKLQkvKioKLQkgKiBXcmFwcGVyIGZvciBBY2Nlc3NpYmxlT2JqZWN0RnJvbVdpbmRvdyBtZXRob2QKLQkgKiBzZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNjk2MTM3KFZTLjg1KS5hc3B4Ci0JICogQHBhcmFtIGh3bmQgdGhlIHdpbmRvdyBoYW5kbGUKLQkgKiBAcmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBJQWNjZXNzaWJsZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0QWNjZXNzaWJsZU9iamVjdEZyb21XaW5kb3cobG9uZyBod25kKSB7Ci0JCXJldHVybiBfQWNlc3NpYmxlT2JqZWN0RnJvbVdpbmRvdyhod25kKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBuYXRpdmUgbG9uZyBfV2luZG93RnJvbUFjY2Vzc2libGVPYmplY3QobG9uZyBwdHIpOwotCXByaXZhdGUgc3RhdGljIG5hdGl2ZSBPYmplY3RbXSBfZ2V0QWNjZXNzaWJsZUNoaWxkcmVuKElEaXNwYXRjaCBpZGlzcCwgbG9uZyBwdHIsIGludCBzdGFydCwgaW50IGVuZCk7Ci0JcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIFN0cmluZyBfZ2V0Um9sZVRleHQoaW50IGFjY1JvbGUpOwotCXByaXZhdGUgc3RhdGljIG5hdGl2ZSBsb25nIF9BY2Vzc2libGVPYmplY3RGcm9tV2luZG93KGxvbmcgcHRyKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvbXNhYS9pbXBsL0lBY2Nlc3NpYmxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvbXNhYS9pbXBsL0lBY2Nlc3NpYmxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2I0MTNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL21zYWEvaW1wbC9JQWNjZXNzaWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIERhaXN1a2UgU0FUTyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5tc2FhLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLkNvbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5EaXNwYXRjaEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLklEaXNwYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLlJlZkludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLlJlZlN0cmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLmltcGwuSURpc3BhdGNoSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLmltcGwuSVVua25vd25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5tc2FhLklBY2Nlc3NpYmxlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSUFjY2Vzc2libGVJbXBsIGV4dGVuZHMgSURpc3BhdGNoSW1wbCBpbXBsZW1lbnRzIElBY2Nlc3NpYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ0NfUEFSRU5UID0gMHhmZmZmZWM3ODsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNDX0NISUxEQ09VTlQgPSAweGZmZmZlYzc3OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ0NfQ0hJTEQgPSAweGZmZmZlYzc2OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ0NfTkFNRSA9IDB4ZmZmZmVjNzU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDQ19WQUxVRSA9IDB4ZmZmZmVjNzQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDQ19ERVNDUklQVElPTiA9IDB4ZmZmZmVjNzM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDQ19ST0xFID0gMHhmZmZmZWM3MjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNDX1NUQVRFID0gMHhmZmZmZWM3MTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNDX0hFTFAgPSAweGZmZmZlYzcwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ0NfSEVMUFRPUElDID0gMHhmZmZmZWM2ZjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNDX0tFWUJPQVJEU0hPUlRDVVQgPSAweGZmZmZlYzZlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ0NfRk9DVVMgPSAweGZmZmZlYzZkOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ0NfU0VMRUNUSU9OID0gMHhmZmZmZWM2YzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNDX0RFRkFVTFRBQ1RJT04gPSAweGZmZmZlYzZiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ0NfU0VMRUNUID0gMHhmZmZmZWM2YTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNDX0xPQ0FUSU9OID0gMHhmZmZmZWM2OTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNDX05BVklHQVRFID0gMHhmZmZmZWM2ODsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNDX0hJVFRFU1QgPSAweGZmZmZlYzY3OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ0NfRE9ERUZBVUxUQUNUSU9OID0gMHhmZmZmZWM2NjsKLQotCXB1YmxpYyBJQWNjZXNzaWJsZUltcGwoSVVua25vd25JbXBsIGl1bmtJbXBsKSB7Ci0JCXN1cGVyKGl1bmtJbXBsKTsKLQl9Ci0KLQlwdWJsaWMgSUFjY2Vzc2libGVJbXBsKFJlc291cmNlTWFuYWdlciBybSwgbG9uZyBwdHIsIGJvb2xlYW4gcGVybWFuZW50KSB7Ci0JCXN1cGVyKHJtLCBwdHIsIHBlcm1hbmVudCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0QWNjRGVzY3JpcHRpb24oaW50IGNoaWxkSWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU3RyaW5nKSBnZXQoQUNDX0RFU0NSSVBUSU9OLCBuZXcgT2JqZWN0W10geyBjaGlsZElkIH0pOwotCQl9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0UHRyKCkgKyAiIChhY2MgZGVzYyk6ICIgKyBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRBY2NLZXlib2FyZFNob3J0Y3V0KGludCBjaGlsZElkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZ2V0KEFDQ19LRVlCT0FSRFNIT1JUQ1VULCBuZXcgT2JqZWN0W10geyBjaGlsZElkIH0pOwotCQl9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0UHRyKCkgKyAiIChhY2Mga2V5KTogIiArIGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldEFjY05hbWUoaW50IGNoaWxkSWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU3RyaW5nKSBnZXQoQUNDX05BTUUsIG5ldyBPYmplY3RbXSB7IGNoaWxkSWQgfSk7Ci0JCX0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRQdHIoKSArICIgKGFjYyBuYW1lKTogIiArIGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldEFjY1JvbGUoaW50IGNoaWxkSWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSW50ZWdlcikgZ2V0KEFDQ19ST0xFLCBuZXcgT2JqZWN0W10geyBjaGlsZElkIH0pOwotCQl9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0UHRyKCkgKyAiIChhY2Mgcm9sZSk6ICIgKyBlKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRBY2NTdGF0ZShpbnQgY2hpbGRJZCkgewotCQl0cnkgewotCQkJcmV0dXJuIChJbnRlZ2VyKSBnZXQoQUNDX1NUQVRFLCBuZXcgT2JqZWN0W10geyBjaGlsZElkIH0pOwotCQl9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0UHRyKCkgKyAiIChhY2Mgc3RhdGUpOiAiICsgZSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0QWNjQ2hpbGRDb3VudCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSW50ZWdlcikgZ2V0KEFDQ19DSElMRENPVU5UKTsKLQkJfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldFB0cigpICsgIiAoY2hpbGQgY291bnQpOiAiICsgZSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJQWNjZXNzaWJsZSBnZXRBY2NDaGlsZChpbnQgaWQpIHsKLQkJdHJ5IHsKLQkJCUlEaXNwYXRjaCBpZGlzcCA9IChJRGlzcGF0Y2gpIGdldChBQ0NfQ0hJTEQsIG5ldyBPYmplY3RbXSB7IGlkIH0pOwotCQkJaWYgKGlkaXNwID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBDb21TZXJ2aWNlLm5ld0lBY2Nlc3NpYmxlKGlkaXNwKTsKLQkJfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhY2NEb0RlZmF1bHRBY3Rpb24oaW50IGNoaWxkSWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoQm9vbGVhbikgaW52b2tlMShBQ0NfRE9ERUZBVUxUQUNUSU9OLCBjaGlsZElkKTsKLQkJfSBjYXRjaCAoRGlzcGF0Y2hFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWNjU2VsZWN0KGludCBzZWxmbGFnVGFrZWZvY3VzLCBpbnQgY2hpbGRJZCkgewotCQl0cnkgewotCQkJaW52b2tlKEFDQ19TRUxFQ1QsIG5ldyBPYmplY3RbXSB7IHNlbGZsYWdUYWtlZm9jdXMsIGNoaWxkSWQgfSk7Ci0JCX0gY2F0Y2ggKERpc3BhdGNoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRQdHIoKSArICIgKHNlbGVjdDogIiArIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJQWNjZXNzaWJsZSBnZXRBY2NQYXJlbnQoKSB7Ci0JCXRyeSB7Ci0JCQlJRGlzcGF0Y2ggaWRpc3AgPSAoSURpc3BhdGNoKSBnZXQoQUNDX1BBUkVOVCk7Ci0JCQlpZiAoaWRpc3AgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIENvbVNlcnZpY2UubmV3SUFjY2Vzc2libGUoaWRpc3ApOwotCQl9IGNhdGNoIChEaXNwYXRjaEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0QWNjVmFsdWUoaW50IGNoaWxkSWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU3RyaW5nKSBnZXQoQUNDX1ZBTFVFLCBuZXcgT2JqZWN0W10geyBjaGlsZElkIH0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldEFjY0RlZmF1bHRBY3Rpb24oaW50IGNoaWxkSWQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU3RyaW5nKSBnZXQoQUNDX0RFRkFVTFRBQ1RJT04sIG5ldyBPYmplY3RbXSB7IGNoaWxkSWQgfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0QWNjRm9jdXMoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0KEFDQ19GT0NVUyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0QWNjSGVscChpbnQgY2hpbGRJZCkgewotCQl0cnkgewotCQkJcmV0dXJuIChTdHJpbmcpIGdldChBQ0NfSEVMUCwgbmV3IE9iamVjdFtdIHsgY2hpbGRJZCB9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRBY2NIZWxwVG9waWMoUmVmU3RyaW5nIGhlbHBGaWxlLCBpbnQgY2hpbGRJZCkgewotCQl0cnkgewotCQkJcmV0dXJuIChJbnRlZ2VyKSBnZXQoQUNDX0hFTFBUT1BJQywgbmV3IE9iamVjdFtdIHsgaGVscEZpbGUsCi0JCQkJCWNoaWxkSWQgfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgYWNjSGl0VGVzdChpbnQgeExlZnQsIGludCB5VG9wKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaW52b2tlKEFDQ19ISVRURVNULCBuZXcgT2JqZWN0W10geyB4TGVmdCwgeVRvcCB9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWNjTG9jYXRpb24oUmVmSW50IHB4TGVmdCwgUmVmSW50IHB5VG9wLCBSZWZJbnQgcGN4V2lkdGgsCi0JCQlSZWZJbnQgcGN5SGVpZ2h0LCBpbnQgY2hpbGRJZCkgewotCQl0cnkgewotCQkJaW52b2tlKEFDQ19MT0NBVElPTiwgbmV3IE9iamVjdFtdIHsgcHhMZWZ0LCBweVRvcCwgcGN4V2lkdGgsCi0JCQkJCXBjeUhlaWdodCwgY2hpbGRJZCB9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGFjY05hdmlnYXRlKGludCBuYXZEaXIsIGludCBzdGFydCkgewotCQl0cnkgewotCQkJaW52b2tlKEFDQ19OQVZJR0FURSwgbmV3IE9iamVjdFtdIHsgbmF2RGlyLCBzdGFydCB9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBnZXRBY2NTZWxlY3Rpb24oKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0KEFDQ19TRUxFQ1RJT04pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUFjY2Vzc2libGUgbmV3SUFjY2Vzc2libGUoUmVzb3VyY2VNYW5hZ2VyIHJtLAotCQkJbG9uZyBwdHIsIGJvb2xlYW4gcGVybWFuZW50KSB7Ci0JCUlBY2Nlc3NpYmxlIGlhY2MgPSBuZXcgSUFjY2Vzc2libGVJbXBsKHJtLCBwdHIsIHBlcm1hbmVudCk7Ci0JCXJtLmFkZFJlc291cmNlKGlhY2MpOwotCQlyZXR1cm4gaWFjYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzJkMDQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS5kbGwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkuZGxsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTZmMWU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS5kbGwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNThjYzFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRWNsaXBzZSBBQ1RGIFdpbjMyIFRvb2xraXQgKEluY3ViYXRpb24pCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIKLUJ1bmRsZS1WZXJzaW9uOiAwLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2gKLUVjbGlwc2UtTGF6eVN0YXJ0OiBmYWxzZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MWRiY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgNSwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIAotdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNTA0ZDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotCQkJICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIEFjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS5kbGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NzZmZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLURlYnVnCi1SZWxlYXNlCi0qLm5jYgotKi5zdW8KLSoudXNlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS5jcHAgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEyMTZkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIEFjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS5jcHAgOiBEZWZpbmVzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIERMTCBhcHBsaWNhdGlvbi4KLS8vCi0KLSNpbmNsdWRlICJzdGRhZnguaCIKLQotCi0jaWZkZWYgX01BTkFHRUQKLSNwcmFnbWEgbWFuYWdlZChwdXNoLCBvZmYpCi0jZW5kaWYKLQotQk9PTCBBUElFTlRSWSBEbGxNYWluKCBITU9EVUxFIGhNb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgIERXT1JEICB1bF9yZWFzb25fZm9yX2NhbGwsCi0gICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFJlc2VydmVkCi0JCQkJCSApCi17Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLSNpZmRlZiBfTUFOQUdFRAotI3ByYWdtYSBtYW5hZ2VkKHBvcCkKLSNlbmRpZgotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5LnNsbiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkuc2xuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTcwZDc0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkuc2xuCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAot77u/DQotTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOS4wMA0KLSMgVmlzdWFsIFN0dWRpbyAyMDA1DQotUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJBY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkiLCAiQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5LnZjcHJvaiIsICJ7NDM1Qjk3QzAtRDIwMi00ODQyLUFEOTMtQkRFMDMzNEMwRDFEfSINCi1FbmRQcm9qZWN0DQotR2xvYmFsDQotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQotCQlEZWJ1Z3xXaW4zMiA9IERlYnVnfFdpbjMyDQotCQlSZWxlYXNlfFdpbjMyID0gUmVsZWFzZXxXaW4zMg0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQotCQl7NDM1Qjk3QzAtRDIwMi00ODQyLUFEOTMtQkRFMDMzNEMwRDFEfS5EZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KLQkJezQzNUI5N0MwLUQyMDItNDg0Mi1BRDkzLUJERTAzMzRDMEQxRH0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyDQotCQl7NDM1Qjk3QzAtRDIwMi00ODQyLUFEOTMtQkRFMDMzNEMwRDFEfS5SZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCi0JCXs0MzVCOTdDMC1EMjAyLTQ4NDItQUQ5My1CREUwMzM0QzBEMUR9LlJlbGVhc2V8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2V8V2luMzINCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KLQkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQotCUVuZEdsb2JhbFNlY3Rpb24NCi1FbmRHbG9iYWwNCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5LnZjcHJvaiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkudmNwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDJkZDE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkudmNwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InNoaWZ0X2ppcyI/Pg0KLTxWaXN1YWxTdHVkaW9Qcm9qZWN0DQotCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KLQlWZXJzaW9uPSI4LjAwIg0KLQlOYW1lPSJBY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkiDQotCVByb2plY3RHVUlEPSJ7NDM1Qjk3QzAtRDIwMi00ODQyLUFEOTMtQkRFMDMzNEMwRDFEfSINCi0JUm9vdE5hbWVzcGFjZT0iQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5Ig0KLQlLZXl3b3JkPSJXaW4zMlByb2oiDQotCT4NCi0JPFBsYXRmb3Jtcz4NCi0JCTxQbGF0Zm9ybQ0KLQkJCU5hbWU9IldpbjMyIg0KLQkJLz4NCi0JPC9QbGF0Zm9ybXM+DQotCTxUb29sRmlsZXM+DQotCTwvVG9vbEZpbGVzPg0KLQk8Q29uZmlndXJhdGlvbnM+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iJChTb2x1dGlvbkRpcikkKENvbmZpZ3VyYXRpb25OYW1lKSINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSIyIg0KLQkJCUNoYXJhY3RlclNldD0iMSINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9IiQoSkFWQV9IT01FKVxpbmNsdWRlOyQoSkFWQV9IT01FKVxpbmNsdWRlXHdpbjMyIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19XSU5ET1dTO19VU1JETEw7QUNDRVNTSUJJTFRZV0lOMzJMSUJSQVJZX0VYUE9SVFMiDQotCQkJCU1pbmltYWxSZWJ1aWxkPSJ0cnVlIg0KLQkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIg0KLQkJCQlVc2VQcmVjb21waWxlZEhlYWRlcj0iMiINCi0JCQkJV2FybmluZ0xldmVsPSIzIg0KLQkJCQlEZXRlY3Q2NEJpdFBvcnRhYmlsaXR5UHJvYmxlbXM9InRydWUiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiDQotCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiINCi0JCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIg0KLQkJCQlTdWJTeXN0ZW09IjIiDQotCQkJCVRhcmdldE1hY2hpbmU9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIg0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iJChDb25maWd1cmF0aW9uTmFtZSkiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQotCQkJQ2hhcmFjdGVyU2V0PSIxIg0KLQkJCVdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj0iMSINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIkKEpBVkFfSE9NRSlcaW5jbHVkZTskKEpBVkFfSE9NRSlcaW5jbHVkZVx3aW4zMiINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfV0lORE9XUztfVVNSRExMO0FDQ0VTU0lCSUxUWVdJTjMyTElCUkFSWV9FWFBPUlRTIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMCINCi0JCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjIiDQotCQkJCVdhcm5pbmdMZXZlbD0iMyINCi0JCQkJRGV0ZWN0NjRCaXRQb3J0YWJpbGl0eVByb2JsZW1zPSJ0cnVlIg0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KLQkJCQlMaW5rSW5jcmVtZW50YWw9IjEiDQotCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSINCi0JCQkJU3ViU3lzdGVtPSIyIg0KLQkJCQlPcHRpbWl6ZVJlZmVyZW5jZXM9IjIiDQotCQkJCUVuYWJsZUNPTURBVEZvbGRpbmc9IjIiDQotCQkJCVRhcmdldE1hY2hpbmU9IjEiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCTwvQ29uZmlndXJhdGlvbnM+DQotCTxSZWZlcmVuY2VzPg0KLQk8L1JlZmVyZW5jZXM+DQotCTxGaWxlcz4NCi0JCTxGaWx0ZXINCi0JCQlOYW1lPSJTb3VyY2UgRmlsZXMiDQotCQkJRmlsdGVyPSJjcHA7YztjYztjeHg7ZGVmO29kbDtpZGw7aHBqO2JhdDthc207YXNteCINCi0JCQlVbmlxdWVJZGVudGlmaWVyPSJ7NEZDNzM3RjEtQzdBNS00Mzc2LUEwNjYtMkEzMkQ3NTJBMkZGfSINCi0JCQk+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuXEFjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS5jcHAiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuXG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9DT01VdGlsLmNwcCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii5cb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX1dpbmRvd1V0aWwuY3BwIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLlxzdGRhZnguY3BwIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KLQkJCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjEiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCi0JCQkJCU5hbWU9IlJlbGVhc2V8V2luMzIiDQotCQkJCQk+DQotCQkJCQk8VG9vbA0KLQkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjEiDQotCQkJCQkvPg0KLQkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KLQkJCTwvRmlsZT4NCi0JCTwvRmlsdGVyPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IkhlYWRlciBGaWxlcyINCi0JCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmw7aW5jO3hzZCINCi0JCQlVbmlxdWVJZGVudGlmaWVyPSJ7OTM5OTUzODAtODlCRC00YjA0LTg4RUItNjI1RkJFNTJFQkZCfSINCi0JCQk+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuXHN0ZGFmeC5oIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJPC9GaWx0ZXI+DQotCQk8RmlsdGVyDQotCQkJTmFtZT0iUmVzb3VyY2UgRmlsZXMiDQotCQkJRmlsdGVyPSJyYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU7cmVzeDt0aWZmO3RpZjtwbmc7d2F2Ig0KLQkJCVVuaXF1ZUlkZW50aWZpZXI9Ins2N0RBNkFCNi1GODAwLTRjMDgtOEI3QS04M0JCMTIxQUFEMDF9Ig0KLQkJCT4NCi0JCTwvRmlsdGVyPg0KLQkJPEZpbGUNCi0JCQlSZWxhdGl2ZVBhdGg9Ii5cUmVhZE1lLnR4dCINCi0JCQk+DQotCQk8L0ZpbGU+DQotCTwvRmlsZXM+DQotCTxHbG9iYWxzPg0KLQk8L0dsb2JhbHM+DQotPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbC5jcHAgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDRiYzYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgInN0ZGFmeC5oIgotI2luY2x1ZGUgIm9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9DT01VdGlsLmgiCi0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJCi0gIChKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIpCi17Ci0JamludCByYyA9IDA7Ci0JdHJ5IHsKLQkJcmMgPSAoamludCkoKGppbnQgKFNURE1FVEhPRENBTExUWVBFICopKGppbnQsIGppbnQpKSgqKGppbnQgKiopYXJnMSlbYXJnMF0pKGFyZzEsIGFyZzIpOwotCX0KLQljYXRjaCguLi4pIHsKLQkJcmMgPSAxOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJSQotICAoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMpCi17Ci0JamludCByYyA9IDA7Ci0JdHJ5IHsKLQkJcmMgPSAoamludCkoKGppbnQgKFNURE1FVEhPRENBTExUWVBFICopKGppbnQsIGppbnQsIGppbnQpKSgqKGppbnQgKiopYXJnMSlbYXJnMF0pKGFyZzEsIGFyZzIsIGFyZzMpOwotCX0KLQljYXRjaCguLi4pIHsKLQkJcmMgPSAxOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJSUkKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQpCi17Ci0JamludCByYyA9IDA7Ci0JdHJ5IHsKLQkJcmMgPSAoamludCkoKGppbnQgKFNURE1FVEhPRENBTExUWVBFICopKGppbnQsIGppbnQsIGppbnQsIGppbnQpKSgqKGppbnQgKiopYXJnMSlbYXJnMF0pKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOwotCX0KLQljYXRjaCguLi4pIHsKLQkJcmMgPSAxOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJSUlJCi0gIChKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqaW50IGFyZzUpCi17Ci0JamludCByYyA9IDA7Ci0JdHJ5IHsKLQkJcmMgPSAoamludCkoKGppbnQgKFNURE1FVEhPRENBTExUWVBFICopKGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQpKSgqKGppbnQgKiopYXJnMSlbYXJnMF0pKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwotCX0KLQljYXRjaCguLi4pIHsKLQkJcmMgPSAxOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJSUlJSQotICAoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYpCi17Ci0JamludCByYyA9IDA7Ci0JdHJ5IHsKLQkJcmMgPSAoamludCkoKGppbnQgKFNURE1FVEhPRENBTExUWVBFICopKGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQpKSgqKGppbnQgKiopYXJnMSlbYXJnMF0pKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYpOwotCX0KLQljYXRjaCguLi4pIHsKLQkJcmMgPSAxOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJSUlJSUkKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgdGhhdCwgamludCBhcmcwLCBqaW50IGFyZzEsIGppbnQgYXJnMiwgamludCBhcmczLCBqaW50IGFyZzQsIGppbnQgYXJnNSwgamludCBhcmc2LCBqaW50IGFyZzcpCi17Ci0JamludCByYyA9IDA7Ci0JdHJ5IHsKLQkJcmMgPSAoamludCkoKGppbnQgKFNURE1FVEhPRENBTExUWVBFICopKGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQpKSgqKGppbnQgKiopYXJnMSlbYXJnMF0pKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzcpOwotCX0KLQljYXRjaCguLi4pIHsKLQkJcmMgPSAxOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJSUlJSUlJCi0gIChKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgYXJnMCwgamludCBhcmcxLCBqaW50IGFyZzIsIGppbnQgYXJnMywgamludCBhcmc0LCBqaW50IGFyZzUsIGppbnQgYXJnNiwgamludCBhcmc3LCBqaW50IGFyZzgpCi17Ci0JamludCByYyA9IDA7Ci0JdHJ5IHsKLQkJcmMgPSAoamludCkoKGppbnQgKFNURE1FVEhPRENBTExUWVBFICopKGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQpKSgqKGppbnQgKiopYXJnMSlbYXJnMF0pKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzcsIGFyZzgpOwotCX0KLQljYXRjaCguLi4pIHsKLQkJcmMgPSAxOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJSUlJSUlJSQotICAoSk5JRW52ICplbnYsIGpjbGFzcyB0aGF0LCBqaW50IGFyZzAsIGppbnQgYXJnMSwgamludCBhcmcyLCBqaW50IGFyZzMsIGppbnQgYXJnNCwgamludCBhcmc1LCBqaW50IGFyZzYsIGppbnQgYXJnNywgamludCBhcmc4LCBqaW50IGFyZzkpCi17Ci0JamludCByYyA9IDA7Ci0JdHJ5IHsKLQkJcmMgPSAoamludCkoKGppbnQgKFNURE1FVEhPRENBTExUWVBFICopKGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQpKSgqKGppbnQgKiopYXJnMSlbYXJnMF0pKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzcsIGFyZzgsIGFyZzkpOwotCX0KLQljYXRjaCguLi4pIHsKLQkJcmMgPSAxOwotCX0KLQlyZXR1cm4gcmM7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWwuaCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGUyN2NmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRE8gTk9UIEVESVQgVEhJUyBGSUxFIC0gaXQgaXMgbWFjaGluZSBnZW5lcmF0ZWQgKi8KLSNpbmNsdWRlIDxqbmkuaD4KLS8qIEhlYWRlciBmb3IgY2xhc3Mgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWwgKi8KLQotI2lmbmRlZiBfSW5jbHVkZWRfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX0NPTVV0aWwKLSNkZWZpbmUgX0luY2x1ZGVkX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9DT01VdGlsCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbAotICogTWV0aG9kOiAgICBWdGJsQ2FsbAotICogU2lnbmF0dXJlOiAoSUlJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9DT01VdGlsX1Z0YmxDYWxsX19JSUkKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbAotICogTWV0aG9kOiAgICBWdGJsQ2FsbAotICogU2lnbmF0dXJlOiAoSUlJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJSQotICAoSk5JRW52ICosIGpjbGFzcywgamludCwgamludCwgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9DT01VdGlsCi0gKiBNZXRob2Q6ICAgIFZ0YmxDYWxsCi0gKiBTaWduYXR1cmU6IChJSUlJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJSUkKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbAotICogTWV0aG9kOiAgICBWdGJsQ2FsbAotICogU2lnbmF0dXJlOiAoSUlJSUlJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9DT01VdGlsX1Z0YmxDYWxsX19JSUlJSUkKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbAotICogTWV0aG9kOiAgICBWdGJsQ2FsbAotICogU2lnbmF0dXJlOiAoSUlJSUlJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJSUlJSQotICAoSk5JRW52ICosIGpjbGFzcywgamludCwgamludCwgamludCwgamludCwgamludCwgamludCwgamludCk7Ci0KLS8qCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9DT01VdGlsCi0gKiBNZXRob2Q6ICAgIFZ0YmxDYWxsCi0gKiBTaWduYXR1cmU6IChJSUlJSUlJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJSUlJSUkKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbAotICogTWV0aG9kOiAgICBWdGJsQ2FsbAotICogU2lnbmF0dXJlOiAoSUlJSUlJSUlJKUkKLSAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9DT01VdGlsX1Z0YmxDYWxsX19JSUlJSUlJSUkKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQsIGppbnQpOwotCi0vKgotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbAotICogTWV0aG9kOiAgICBWdGJsQ2FsbAotICogU2lnbmF0dXJlOiAoSUlJSUlJSUlJSSlJCi0gKi8KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfQ09NVXRpbF9WdGJsQ2FsbF9fSUlJSUlJSUlJSQotICAoSk5JRW52ICosIGpjbGFzcywgamludCwgamludCwgamludCwgamludCwgamludCwgamludCwgamludCwgamludCwgamludCwgamludCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfV2luZG93VXRpbC5jcHAgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX1dpbmRvd1V0aWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDA0YTQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfV2luZG93VXRpbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAic3RkYWZ4LmgiCi0jaW5jbHVkZSAib3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX1dpbmRvd1V0aWwuaCIKLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9XaW5kb3dVdGlsX1NldExheWVyZWRXaW5kb3dBdHRyaWJ1dGVzCi0gIChKTklFbnYgKmVudiwgamNsYXNzIHRoYXQsIGppbnQgaHduZCwgamludCBjcktleSwgamNoYXIgYkFscGhhLCBqaW50IGR3RmxhZ3MpCi17Ci0JcmV0dXJuIFNldExheWVyZWRXaW5kb3dBdHRyaWJ1dGVzKChIV05EKWh3bmQsIGNyS2V5LCBiQWxwaGEsIGR3RmxhZ3MpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9XaW5kb3dVdGlsLmggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX1dpbmRvd1V0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg3MjVhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX1dpbmRvd1V0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERPIE5PVCBFRElUIFRISVMgRklMRSAtIGl0IGlzIG1hY2hpbmUgZ2VuZXJhdGVkICovCi0jaW5jbHVkZSA8am5pLmg+Ci0vKiBIZWFkZXIgZm9yIGNsYXNzIG9yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9XaW5kb3dVdGlsICovCi0KLSNpZm5kZWYgX0luY2x1ZGVkX29yZ19lY2xpcHNlX2FjdGZfdXRpbF93aW4zMl9XaW5kb3dVdGlsCi0jZGVmaW5lIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV9hY3RmX3V0aWxfd2luMzJfV2luZG93VXRpbAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotLyoKLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX1dpbmRvd1V0aWwKLSAqIE1ldGhvZDogICAgU2V0TGF5ZXJlZFdpbmRvd0F0dHJpYnV0ZXMKLSAqIFNpZ25hdHVyZTogKElJQ0kpSQotICovCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfYWN0Zl91dGlsX3dpbjMyX1dpbmRvd1V0aWxfU2V0TGF5ZXJlZFdpbmRvd0F0dHJpYnV0ZXMKLSAgKEpOSUVudiAqLCBqY2xhc3MsIGppbnQsIGppbnQsIGpjaGFyLCBqaW50KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L3N0ZGFmeC5jcHAgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvc3RkYWZ4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmMjU4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9saWJyYXJ5X3NyYy9BY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkvc3RkYWZ4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIHN0ZGFmeC5jcHAgOiBzb3VyY2UgZmlsZSB0aGF0IGluY2x1ZGVzIGp1c3QgdGhlIHN0YW5kYXJkIGluY2x1ZGVzCi0vLyBBY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkucGNoIHdpbGwgYmUgdGhlIHByZS1jb21waWxlZCBoZWFkZXIKLS8vIHN0ZGFmeC5vYmogd2lsbCBjb250YWluIHRoZSBwcmUtY29tcGlsZWQgdHlwZSBpbmZvcm1hdGlvbgotCi0jaW5jbHVkZSAic3RkYWZ4LmgiCi0KLS8vIFRPRE86IHJlZmVyZW5jZSBhbnkgYWRkaXRpb25hbCBoZWFkZXJzIHlvdSBuZWVkIGluIFNUREFGWC5ICi0vLyBhbmQgbm90IGluIHRoaXMgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L3N0ZGFmeC5oIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvbGlicmFyeV9zcmMvQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5L3N0ZGFmeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTM5MWM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL2xpYnJhcnlfc3JjL0FjY2Vzc2liaWx0eVdpbjMyTGlicmFyeS9zdGRhZnguaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIHN0ZGFmeC5oIDogaW5jbHVkZSBmaWxlIGZvciBzdGFuZGFyZCBzeXN0ZW0gaW5jbHVkZSBmaWxlcywKLS8vIG9yIHByb2plY3Qgc3BlY2lmaWMgaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSB1c2VkIGZyZXF1ZW50bHksIGJ1dAotLy8gYXJlIGNoYW5nZWQgaW5mcmVxdWVudGx5Ci0vLwotCi0jcHJhZ21hIG9uY2UKLQotLy8gTW9kaWZ5IHRoZSBmb2xsb3dpbmcgZGVmaW5lcyBpZiB5b3UgaGF2ZSB0byB0YXJnZXQgYSBwbGF0Zm9ybSBwcmlvciB0byB0aGUgb25lcyBzcGVjaWZpZWQgYmVsb3cuCi0vLyBSZWZlciB0byBNU0ROIGZvciB0aGUgbGF0ZXN0IGluZm8gb24gY29ycmVzcG9uZGluZyB2YWx1ZXMgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMuCi0jaWZuZGVmIFdJTlZFUgkJCQkvLyBBbGxvdyB1c2Ugb2YgZmVhdHVyZXMgc3BlY2lmaWMgdG8gV2luZG93cyBYUCBvciBsYXRlci4KLSNkZWZpbmUgV0lOVkVSIDB4MDUwMQkJLy8gQ2hhbmdlIHRoaXMgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIHRvIHRhcmdldCBvdGhlciB2ZXJzaW9ucyBvZiBXaW5kb3dzLgotI2VuZGlmCi0KLSNpZm5kZWYgX1dJTjMyX1dJTk5UCQkvLyBBbGxvdyB1c2Ugb2YgZmVhdHVyZXMgc3BlY2lmaWMgdG8gV2luZG93cyBYUCBvciBsYXRlci4gICAgICAgICAgICAgICAgICAgCi0jZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA1MDEJLy8gQ2hhbmdlIHRoaXMgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIHRvIHRhcmdldCBvdGhlciB2ZXJzaW9ucyBvZiBXaW5kb3dzLgotI2VuZGlmCQkJCQkJCi0KLSNpZm5kZWYgX1dJTjMyX1dJTkRPV1MJCS8vIEFsbG93IHVzZSBvZiBmZWF0dXJlcyBzcGVjaWZpYyB0byBXaW5kb3dzIDk4IG9yIGxhdGVyLgotI2RlZmluZSBfV0lOMzJfV0lORE9XUyAweDA0MTAgLy8gQ2hhbmdlIHRoaXMgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIHRvIHRhcmdldCBXaW5kb3dzIE1lIG9yIGxhdGVyLgotI2VuZGlmCi0KLSNpZm5kZWYgX1dJTjMyX0lFCQkJLy8gQWxsb3cgdXNlIG9mIGZlYXR1cmVzIHNwZWNpZmljIHRvIElFIDYuMCBvciBsYXRlci4KLSNkZWZpbmUgX1dJTjMyX0lFIDB4MDYwMAkvLyBDaGFuZ2UgdGhpcyB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgdG8gdGFyZ2V0IG90aGVyIHZlcnNpb25zIG9mIElFLgotI2VuZGlmCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgkJLy8gRXhjbHVkZSByYXJlbHktdXNlZCBzdHVmZiBmcm9tIFdpbmRvd3MgaGVhZGVycwotLy8gV2luZG93cyBIZWFkZXIgRmlsZXM6Ci0jaW5jbHVkZSA8d2luZG93cy5oPgotCi0KLQotLy8gVE9ETzogcmVmZXJlbmNlIGFkZGl0aW9uYWwgaGVhZGVycyB5b3VyIHByb2dyYW0gcmVxdWlyZXMgaGVyZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC9pbnRlcm5hbC93aW4zMi9BY2Nlc3NpYmxlSGlsaWdodGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL3dpbjMyL0FjY2Vzc2libGVIaWxpZ2h0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGExMzNkNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL3dpbjMyL0FjY2Vzc2libGVIaWxpZ2h0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwuaW50ZXJuYWwud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuV2luZG93VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gc2hvdyByZWN0YW5nbGUgdXNpbmcgT3ZlbGF5V2luZG93Ci0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NpYmxlSGlsaWdodGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFRocmVhZCBsYXN0VGhyZWFkID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfWUVMTE9XID0gMHgwMEZGRkY7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTE9SX0dSRUVOID0gMHgwMEZGMDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W11bXSBGTEFTSElOR19DT0xPUlMgPSB7IHsgQ09MT1JfWUVMTE9XLCAyNTAgfSwKLQkJCXsgQ09MT1JfR1JFRU4sIDI1MCB9LCB7IENPTE9SX1lFTExPVywgMjUwIH0sIHsgQ09MT1JfR1JFRU4sIDI1MCB9LAotCQkJeyBDT0xPUl9ZRUxMT1csIDI1MCB9LCB7IENPTE9SX0dSRUVOLCAyNTAgfSwgeyBDT0xPUl9ZRUxMT1csIDEwMDAgfSB9OwotCi0JLyoqCi0JICogRmxhc2ggcmVjdGFuZ2xlIHdpdGhvdXQgdXNpbmcgT3ZlcmxheVdpbmRvdy4KLQkgKiAKLQkgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIG1heSBsZWF2ZSBnYXJiYWdlcyBvbiB0aGUgc2NyZWVuLgotCSAqIAotCSAqIEBwYXJhbSByZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZsYXNoUmVjdGFuZ2xlKGZpbmFsIFJlY3RhbmdsZSByZWN0KSB7Ci0JCWlmIChudWxsICE9IGxhc3RUaHJlYWQpIHsKLQkJCWxhc3RUaHJlYWQuaW50ZXJydXB0KCk7Ci0JCX0KLQkJaWYgKG51bGwgIT0gcmVjdCkgewotCQkJbGFzdFRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaW50IGh3bmREcmF3ID0gV2luZG93VXRpbC5HZXREZXNrdG9wV2luZG93KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IEZMQVNISU5HX0NPTE9SUy5sZW5ndGg7IGkrKykgewotCQkJCQkJCURyYXdVdGlsLmRyYXdSZWN0YW5nbGUoaHduZERyYXcsIHJlY3QsCi0JCQkJCQkJCQlGTEFTSElOR19DT0xPUlNbaV1bMF0pOwotCQkJCQkJCVRocmVhZC5zbGVlcChGTEFTSElOR19DT0xPUlNbaV1bMV0pOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQkJRHJhd1V0aWwucmVkcmF3UmVjdGFuZ2xlKGh3bmREcmF3LCByZWN0KTsKLQkJCQkJaWYgKGxhc3RUaHJlYWQgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkgewotCQkJCQkJbGFzdFRocmVhZCA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCWxhc3RUaHJlYWQuc3RhcnQoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvd2luMzIvRHJhd1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvaW50ZXJuYWwvd2luMzIvRHJhd1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwYzQyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL2ludGVybmFsL3dpbjMyL0RyYXdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLmludGVybmFsLndpbjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLlJFQ1Q7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBkcmF3IHJlY3RhbmdsZQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIERyYXdVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBiYW5kV2lkdGggPSAzOwotCi0JLyoqCi0JICogRHJhdyByZWN0YW5nbGUKLQkgKiAKLQkgKiBAcGFyYW0gaHduZERyYXcKLQkgKiAgICAgICAgICAgIHRhcmdldCB3aW5kb3cKLQkgKiBAcGFyYW0gcmVjdAotCSAqICAgICAgICAgICAgcmVjdGFuZ2xlCi0JICogQHBhcmFtIGNvbG9yCi0JICogICAgICAgICAgICBjb2xvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkcmF3UmVjdGFuZ2xlKGludCBod25kRHJhdywgUmVjdGFuZ2xlIHJlY3QsIGludCBjb2xvcikgewotCQlpbnQgaERDID0gT1MuR2V0RENFeChod25kRHJhdywgMCwgT1MuRENYX0NBQ0hFKTsKLQkJaW50IG9sZEJydXNoID0gT1MuU2VsZWN0T2JqZWN0KGhEQywgT1MuQ3JlYXRlU29saWRCcnVzaChjb2xvcikpOwotCQlPUy5QYXRCbHQoaERDLCByZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgYmFuZFdpZHRoLCBPUy5QQVRDT1BZKTsKLQkJT1MuUGF0Qmx0KGhEQywgcmVjdC54LCByZWN0LnkgKyBiYW5kV2lkdGgsIGJhbmRXaWR0aCwgcmVjdC5oZWlnaHQKLQkJCQktIChiYW5kV2lkdGggKiAyKSwgT1MuUEFUQ09QWSk7Ci0JCU9TLlBhdEJsdChoREMsIHJlY3QueCArIHJlY3Qud2lkdGggLSBiYW5kV2lkdGgsIHJlY3QueSArIGJhbmRXaWR0aCwKLQkJCQliYW5kV2lkdGgsIHJlY3QuaGVpZ2h0IC0gKGJhbmRXaWR0aCAqIDIpLCBPUy5QQVRDT1BZKTsKLQkJT1MuUGF0Qmx0KGhEQywgcmVjdC54LCByZWN0LnkgKyByZWN0LmhlaWdodCAtIGJhbmRXaWR0aCwgcmVjdC53aWR0aCwKLQkJCQliYW5kV2lkdGgsIE9TLlBBVENPUFkpOwotCQlPUy5EZWxldGVPYmplY3QoT1MuU2VsZWN0T2JqZWN0KGhEQywgb2xkQnJ1c2gpKTsKLQkJT1MuUmVsZWFzZURDKGh3bmREcmF3LCBoREMpOwotCX0KLQotCS8qKgotCSAqIFJlZHJhdyBzcGVjaWZpZWQgcmVjdGFuZ2xlLiBDYWxsIHRoaXMgbWV0aG9kIGFmdGVyIGRyYXdSZWN0YW5nbGUgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBod25kRHJhdwotCSAqICAgICAgICAgICAgdGFyZ2V0IHdpbmRvdwotCSAqIEBwYXJhbSByZWN0Ci0JICogICAgICAgICAgICB0YXJnZXQgcmVjdGFuZ2xlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZHJhd1JlY3RhbmdsZShpbnQgaHduZERyYXcsIFJlY3RhbmdsZSByZWN0KSB7Ci0JCVJFQ1Qgb3NSZWN0ID0gbmV3IFJFQ1QoKTsKLQkJb3NSZWN0LmxlZnQgPSByZWN0LnggLSBiYW5kV2lkdGg7Ci0JCW9zUmVjdC50b3AgPSByZWN0LnkgLSBiYW5kV2lkdGg7Ci0JCW9zUmVjdC5yaWdodCA9IHJlY3QueCArIHJlY3Qud2lkdGggKyBiYW5kV2lkdGg7Ci0JCW9zUmVjdC5ib3R0b20gPSByZWN0LnkgKyByZWN0LmhlaWdodCArIGJhbmRXaWR0aDsKLQkJT1MuUmVkcmF3V2luZG93KGh3bmREcmF3LCBvc1JlY3QsIDAsIE9TLlJEV19JTlZBTElEQVRFCi0JCQkJfCBPUy5SRFdfQUxMQ0hJTERSRU4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9DT01VdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0NPTVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2NzM0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0NPTVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5DT007Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5HVUlEOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5vbGUud2luMzIuT0xFOwotCi0vKioKLSAqIENPTSByZWxhdGVkIHV0aWxpdGllcy4gQ2FsbGluZyB2dGFibGUgbWV0aG9kLCBjcmVhdGluZyBHVUlELCBhbmQgY3JlYXRpbmcKLSAqIGRpc3BhdGNoIG9iamVjdCBmcm9tIEdVSUQuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQ09NVXRpbCB7Ci0KLQlzdGF0aWMgewotCQl0cnkgewotCQkJU3lzdGVtLmxvYWRMaWJyYXJ5KCJBY2Nlc3NpYmlsdHlXaW4zMkxpYnJhcnkiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBkaXNwYXRjaCBvYmplY3QgZnJvbSBHVUlECi0JICogCi0JICogQHBhcmFtIHJjbHNpZAotCSAqICAgICAgICAgICAgR1VJRAotCSAqIEByZXR1cm4gZGlzcGF0Y2ggb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY3JlYXRlRGlzcGF0Y2goR1VJRCByY2xzaWQpIHsKLQkJaW50W10gcHB2ID0gbmV3IGludFsxXTsKLQkJaW50IHJlc3VsdCA9IENPTS5Db0NyZWF0ZUluc3RhbmNlKHJjbHNpZCwgMCwgQ09NLkNMU0NUWF9JTlBST0NfSEFORExFUgotCQkJCXwgQ09NLkNMU0NUWF9JTlBST0NfU0VSVkVSIHwgQ09NLkNMU0NUWF9MT0NBTF9TRVJWRVIKLQkJCQl8IENPTS5DTFNDVFhfUkVNT1RFX1NFUlZFUiwgQ09NLklJRElEaXNwYXRjaCwgcHB2KTsKLQkJaWYgKHJlc3VsdCAhPSBPTEUuU19PSykKLQkJCU9MRS5lcnJvcihPTEUuRVJST1JfQ0FOTk9UX0NSRUFURV9PQkpFQ1QsIHJlc3VsdCk7Ci0JCXJldHVybiBwcHZbMF07Ci0JfQotCi0JLyoqCi0JICogQ2FsbGluZyB2dGFibGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGZuTnVtYmVyCi0JICogICAgICAgICAgICB2dGFibGUgaW5kZXgKLQkgKiBAcGFyYW0gcHBWdGJsCi0JICogICAgICAgICAgICB2dGFibGUgcG9pbnRlcgotCSAqIEBwYXJhbSBhcmcwCi0JICogICAgICAgICAgICBhcmd1bWVudCAwCi0JICogQHJldHVybiBocmVzdWx0Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IFZ0YmxDYWxsKGludCBmbk51bWJlciwgaW50IHBwVnRibCwgaW50IGFyZzApOwotCi0JLyoqCi0JICogQHBhcmFtIGZuTnVtYmVyCi0JICogQHBhcmFtIHBwVnRibAotCSAqIEBwYXJhbSBhcmcwCi0JICogICAgICAgICAgICBhcmd1bWVudCAwCi0JICogQHBhcmFtIGFyZzEKLQkgKiAgICAgICAgICAgIGFyZ3VtZW50IDEKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IFZ0YmxDYWxsKGludCBmbk51bWJlciwgaW50IHBwVnRibCwgaW50IGFyZzAsCi0JCQlpbnQgYXJnMSk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZm5OdW1iZXIKLQkgKiBAcGFyYW0gcHBWdGJsCi0JICogQHBhcmFtIGFyZzAKLQkgKiAgICAgICAgICAgIGFyZ3VtZW50IDAKLQkgKiBAcGFyYW0gYXJnMQotCSAqICAgICAgICAgICAgYXJndW1lbnQgMQotCSAqIEBwYXJhbSBhcmcyCi0JICogICAgICAgICAgICBhcmd1bWVudCAyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBWdGJsQ2FsbChpbnQgZm5OdW1iZXIsIGludCBwcFZ0YmwsIGludCBhcmcwLAotCQkJaW50IGFyZzEsIGludCBhcmcyKTsKLQotCS8qKgotCSAqIEBwYXJhbSBmbk51bWJlcgotCSAqIEBwYXJhbSBwcFZ0YmwKLQkgKiBAcGFyYW0gYXJnMAotCSAqICAgICAgICAgICAgYXJndW1lbnQgMAotCSAqIEBwYXJhbSBhcmcxCi0JICogICAgICAgICAgICBhcmd1bWVudCAxCi0JICogQHBhcmFtIGFyZzIKLQkgKiAgICAgICAgICAgIGFyZ3VtZW50IDIKLQkgKiBAcGFyYW0gYXJnMwotCSAqICAgICAgICAgICAgYXJndW1lbnQgMwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgVnRibENhbGwoaW50IGZuTnVtYmVyLCBpbnQgcHBWdGJsLCBpbnQgYXJnMCwKLQkJCWludCBhcmcxLCBpbnQgYXJnMiwgaW50IGFyZzMpOwotCi0JLyoqCi0JICogQHBhcmFtIGZuTnVtYmVyCi0JICogQHBhcmFtIHBwVnRibAotCSAqIEBwYXJhbSBhcmcwCi0JICogICAgICAgICAgICBhcmd1bWVudCAwCi0JICogQHBhcmFtIGFyZzEKLQkgKiAgICAgICAgICAgIGFyZ3VtZW50IDEKLQkgKiBAcGFyYW0gYXJnMgotCSAqICAgICAgICAgICAgYXJndW1lbnQgMgotCSAqIEBwYXJhbSBhcmczCi0JICogICAgICAgICAgICBhcmd1bWVudCAzCi0JICogQHBhcmFtIGFyZzQKLQkgKiAgICAgICAgICAgIGFyZ3VtZW50IDQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IFZ0YmxDYWxsKGludCBmbk51bWJlciwgaW50IHBwVnRibCwgaW50IGFyZzAsCi0JCQlpbnQgYXJnMSwgaW50IGFyZzIsIGludCBhcmczLCBpbnQgYXJnNCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZm5OdW1iZXIKLQkgKiBAcGFyYW0gcHBWdGJsCi0JICogQHBhcmFtIGFyZzAKLQkgKiAgICAgICAgICAgIGFyZ3VtZW50IDAKLQkgKiBAcGFyYW0gYXJnMQotCSAqICAgICAgICAgICAgYXJndW1lbnQgMQotCSAqIEBwYXJhbSBhcmcyCi0JICogICAgICAgICAgICBhcmd1bWVudCAyCi0JICogQHBhcmFtIGFyZzMKLQkgKiAgICAgICAgICAgIGFyZ3VtZW50IDMKLQkgKiBAcGFyYW0gYXJnNAotCSAqICAgICAgICAgICAgYXJndW1lbnQgNAotCSAqIEBwYXJhbSBhcmc1Ci0JICogICAgICAgICAgICBhcmd1bWVudCA1Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbmF0aXZlIGludCBWdGJsQ2FsbChpbnQgZm5OdW1iZXIsIGludCBwcFZ0YmwsIGludCBhcmcwLAotCQkJaW50IGFyZzEsIGludCBhcmcyLCBpbnQgYXJnMywgaW50IGFyZzQsIGludCBhcmc1KTsKLQotCS8qKgotCSAqIEBwYXJhbSBmbk51bWJlcgotCSAqIEBwYXJhbSBwcFZ0YmwKLQkgKiBAcGFyYW0gYXJnMAotCSAqICAgICAgICAgICAgYXJndW1lbnQgMAotCSAqIEBwYXJhbSBhcmcxCi0JICogICAgICAgICAgICBhcmd1bWVudCAxCi0JICogQHBhcmFtIGFyZzIKLQkgKiAgICAgICAgICAgIGFyZ3VtZW50IDIKLQkgKiBAcGFyYW0gYXJnMwotCSAqICAgICAgICAgICAgYXJndW1lbnQgMwotCSAqIEBwYXJhbSBhcmc0Ci0JICogICAgICAgICAgICBhcmd1bWVudCA0Ci0JICogQHBhcmFtIGFyZzUKLQkgKiAgICAgICAgICAgIGFyZ3VtZW50IDUKLQkgKiBAcGFyYW0gYXJnNgotCSAqICAgICAgICAgICAgYXJndW1lbnQgNgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIG5hdGl2ZSBpbnQgVnRibENhbGwoaW50IGZuTnVtYmVyLCBpbnQgcHBWdGJsLCBpbnQgYXJnMCwKLQkJCWludCBhcmcxLCBpbnQgYXJnMiwgaW50IGFyZzMsIGludCBhcmc0LCBpbnQgYXJnNSwgaW50IGFyZzYpOwotCi0JLyoqCi0JICogQHBhcmFtIGZuTnVtYmVyCi0JICogQHBhcmFtIHBwVnRibAotCSAqIEBwYXJhbSBhcmcwCi0JICogICAgICAgICAgICBhcmd1bWVudCAwCi0JICogQHBhcmFtIGFyZzEKLQkgKiAgICAgICAgICAgIGFyZ3VtZW50IDEKLQkgKiBAcGFyYW0gYXJnMgotCSAqICAgICAgICAgICAgYXJndW1lbnQgMgotCSAqIEBwYXJhbSBhcmczCi0JICogICAgICAgICAgICBhcmd1bWVudCAzCi0JICogQHBhcmFtIGFyZzQKLQkgKiAgICAgICAgICAgIGFyZ3VtZW50IDQKLQkgKiBAcGFyYW0gYXJnNQotCSAqICAgICAgICAgICAgYXJndW1lbnQgNQotCSAqIEBwYXJhbSBhcmc2Ci0JICogICAgICAgICAgICBhcmd1bWVudCA2Ci0JICogQHBhcmFtIGFyZzcKLQkgKiAgICAgICAgICAgIGFyZ3VtZW50IDcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IFZ0YmxDYWxsKGludCBmbk51bWJlciwgaW50IHBwVnRibCwgaW50IGFyZzAsCi0JCQlpbnQgYXJnMSwgaW50IGFyZzIsIGludCBhcmczLCBpbnQgYXJnNCwgaW50IGFyZzUsIGludCBhcmc2LCBpbnQgYXJnNyk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgR1VJRCBmcm9tIHRhcmdldCBTdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gbHBzegotCSAqICAgICAgICAgICAgdGFyZ2V0Ci0JICogQHJldHVybiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyBHVUlEIElJREZyb21TdHJpbmcoU3RyaW5nIGxwc3opIHsKLQkJaW50IGxlbmd0aCA9IGxwc3oubGVuZ3RoKCk7Ci0JCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltsZW5ndGggKyAxXTsKLQkJbHBzei5nZXRDaGFycygwLCBsZW5ndGgsIGJ1ZmZlciwgMCk7Ci0JCUdVSUQgbHBpaWQgPSBuZXcgR1VJRCgpOwotCQlpZiAoQ09NLklJREZyb21TdHJpbmcoYnVmZmVyLCBscGlpZCkgPT0gT0xFLlNfT0spCi0JCQlyZXR1cm4gbHBpaWQ7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvQ09QWURBVEFTVFJVQ1QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvQ09QWURBVEFTVFJVQ1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiMmVhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0NPUFlEQVRBU1RSVUNULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBzZW5kL3JlY2VpdmUgbWVzc2FnZXMgd2l0aCBvdGhlciB3aW5kb3cKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBDT1BZREFUQVNUUlVDVCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXTV9DT1BZREFUQSA9IDB4NGE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2l6ZW9mID0gMTI7Ci0KLQlwdWJsaWMgaW50IGR3RGF0YTsKLQlwdWJsaWMgaW50IGNiRGF0YTsKLQlwdWJsaWMgaW50IGxwRGF0YTsKLQlwdWJsaWMgYnl0ZVtdIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBDT1BZREFUQVNUUlVDVCBvYmplY3QgdXNpbmcgU3RyaW5nIGRhdGEKLQkgKiAKLQkgKiBAcGFyYW0gZHdEYXRhCi0JICogQHBhcmFtIHN0ckRhdGEKLQkgKi8KLQlwdWJsaWMgQ09QWURBVEFTVFJVQ1QoaW50IGR3RGF0YSwgU3RyaW5nIHN0ckRhdGEpIHsKLQkJdGhpcyhkd0RhdGEsIHN0ckRhdGEuZ2V0Qnl0ZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgQ09QWURBVEFTVFJVQ1Qgb2JqZWN0IHVzaW5nIGJpbmFyeSBkYXRhCi0JICogCi0JICogQHBhcmFtIGR3RGF0YQotCSAqIEBwYXJhbSBkYXRhCi0JICovCi0JcHVibGljIENPUFlEQVRBU1RSVUNUKGludCBkd0RhdGEsIGJ5dGVbXSBkYXRhKSB7Ci0JCXRoaXMuZHdEYXRhID0gZHdEYXRhOwotCQlpZiAobnVsbCAhPSBkYXRhKSB7Ci0JCQl0aGlzLmNiRGF0YSA9IGRhdGEubGVuZ3RoOwotCQkJdGhpcy5kYXRhID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCB0aGlzLmRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIENPUFlEQVRBU1RSVUNUIG9iamVjdCB1c2luZyBsUGFyYW0KLQkgKiAKLQkgKiBAcGFyYW0gbFBhcmFtCi0JICovCi0JcHVibGljIENPUFlEQVRBU1RSVUNUKGludCBsUGFyYW0pIHsKLQkJaW50W10gcEVudHJpZXMgPSBuZXcgaW50WzNdOwotCQlPUy5Nb3ZlTWVtb3J5KHBFbnRyaWVzLCBsUGFyYW0sIHNpemVvZik7Ci0JCWR3RGF0YSA9IHBFbnRyaWVzWzBdOwotCQljYkRhdGEgPSBwRW50cmllc1sxXTsKLQkJbHBEYXRhID0gcEVudHJpZXNbMl07Ci0JCWlmICgwICE9IGxwRGF0YSAmJiBjYkRhdGEgPiAwKSB7Ci0JCQlkYXRhID0gbmV3IGJ5dGVbY2JEYXRhXTsKLQkJCU9TLk1vdmVNZW1vcnkoZGF0YSwgbHBEYXRhLCBjYkRhdGEpOwotCQl9IGVsc2UgewotCQkJZGF0YSA9IG5ldyBieXRlWzBdOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29weSBhIENPUFlEQVRBU1RSVUNUIG9iamVjdCB0byBtZW1vcnkKLQkgKiAKLQkgKiBAcGFyYW0gcERhdGEKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RGF0YShpbnQgcERhdGEpIHsKLQkJaW50IHAgPSAwOwotCQlpZiAobnVsbCAhPSBkYXRhKSB7Ci0JCQlwID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsIGNiRGF0YSk7Ci0JCQlPUy5Nb3ZlTWVtb3J5KHAsIGRhdGEsIGNiRGF0YSk7Ci0JCX0KLQkJT1MuTW92ZU1lbW9yeShwRGF0YSwgbmV3IGludFtdIHsgZHdEYXRhLCBjYkRhdGEsIHAgfSwgc2l6ZW9mKTsKLQl9Ci0KLQkvKioKLQkgKiBTZW5kIGEgQ09QWURBVEFTVFJVQ1Qgb2JqZWN0IHRvIGFub3RoZXIgd2luZG93IHVzaW5nIFdNX0NPUFlEQVRBCi0JICogCi0JICogQHBhcmFtIGh3bmRUbwotCSAqICAgICAgICAgICAgdGFyZ2V0IHdpbmRvdyB0byBzZW5kIGRhdGEKLQkgKiBAcGFyYW0gaHduZEZyb20KLQkgKiAgICAgICAgICAgIHNlbmQgZGF0YSBmcm9tIHRoaXMgd2luZG93Ci0JICogQHJldHVybiByZXN1bHQgY29kZQotCSAqLwotCXB1YmxpYyBpbnQgc2VuZE1lc3NhZ2UoaW50IGh3bmRUbywgaW50IGh3bmRGcm9tKSB7Ci0JCWludCBscERhdGEgPSBPUy5HbG9iYWxBbGxvYyhPUy5HTUVNX0ZJWEVEIHwgT1MuR01FTV9aRVJPSU5JVCwgc2l6ZW9mKTsKLQkJdHJ5IHsKLQkJCXNldERhdGEobHBEYXRhKTsKLQkJCXJldHVybiBPUy5TZW5kTWVzc2FnZShod25kVG8sIFdNX0NPUFlEQVRBLCBod25kRnJvbSwgbHBEYXRhKTsKLQkJfSBmaW5hbGx5IHsKLQkJCU9TLkdsb2JhbEZyZWUobHBEYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIGEgU3RyaW5nIGRhdGEKLQkgKiAKLQkgKiBAcmV0dXJuIGRhdGEgYXMgbmV3IFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nRGF0YSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgU3RyaW5nKGRhdGEpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiZHdEYXRhPSIgKyBkd0RhdGEgKyAiLCBjYkRhdGE9IiArIGNiRGF0YSArICIsIGxwRGF0YT0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGxwRGF0YSkgKyAiLCBkYXRhPVwiIiArIG5ldyBTdHJpbmcoZGF0YSkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0ZsYXNoTVNBQU9iamVjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9GbGFzaE1TQUFPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0OGU2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0ZsYXNoTVNBQU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgRGFpc3VrZSBTQVRPIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5Db21TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSURpc3BhdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5tc2FhLklBY2Nlc3NpYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5tc2FhLk1TQUE7Ci0KLS8qKgotICogRmxhc2hNU0FBT2JqZWN0IGlzIGEgd3JhcHBlciBjbGFzcyBvZiBuYXRpdmUgTVNBQSBvYmplY3QgZm9yIEZsYXNoIGNvbnRlbnQKLSAqLwotcHVibGljIGNsYXNzIEZsYXNoTVNBQU9iamVjdCB7Ci0KLQlGbGFzaE1TQUFPYmplY3QgcGFyZW50OwotCUlBY2Nlc3NpYmxlIGlhY2M7Ci0JaW50IGNoaWxkSWQgPSBNU0FBLkNISUxESURfU0VMRjsKLQotCS8qKgotCSAqIEBwYXJhbSBpYWNjCi0JICogICAgICAgICAgICBuYXRpdmUgd3JhcHBlZCBJQWNjZXNzaWJsZSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgRmxhc2hNU0FBT2JqZWN0KElBY2Nlc3NpYmxlIGlhY2MpIHsKLQkJdGhpcy5pYWNjID0gaWFjYzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGNoaWxkSWQKLQkgKiAgICAgICAgICAgIHRoZSBjaGlsZCBJRCB0byBiZSB1c2VkIHRvIG9idGFpbiB0aGUgYWN0dWFsIGNoaWxkIG9iamVjdCBmcm9tCi0JICogICAgICAgICAgICB0aGUgcGFyZW50LgotCSAqLwotCXB1YmxpYyBGbGFzaE1TQUFPYmplY3QoRmxhc2hNU0FBT2JqZWN0IHBhcmVudCwgaW50IGNoaWxkSWQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMuY2hpbGRJZCA9IGNoaWxkSWQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0Q2hpbGRJZCgpIHsKLQkJcmV0dXJuIGNoaWxkSWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmF0aXZlIHdyYXBwZWQgSUFjY2Vzc2libGUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBJQWNjZXNzaWJsZSBnZXRJQWNjZXNzaWJsZSgpIHsKLQkJaWYgKGlhY2MgIT0gbnVsbCkKLQkJCXJldHVybiBpYWNjOwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50LmdldElBY2Nlc3NpYmxlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUFjY2Vzc2libGUjZ2V0QWNjS2V5Ym9hcmRTaG9ydGN1dChpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY2NLZXlib2FyZFNob3J0Y3V0KCkgewotCQlyZXR1cm4gZ2V0SUFjY2Vzc2libGUoKS5nZXRBY2NLZXlib2FyZFNob3J0Y3V0KGdldENoaWxkSWQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQWNjZXNzaWJsZSNnZXRBY2NSb2xlKGludCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFjY1JvbGUoKSB7Ci0JCXJldHVybiBnZXRJQWNjZXNzaWJsZSgpLmdldEFjY1JvbGUoZ2V0Q2hpbGRJZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElBY2Nlc3NpYmxlI2dldEFjY0Rlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjY0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ2V0SUFjY2Vzc2libGUoKS5nZXRBY2NEZXNjcmlwdGlvbihnZXRDaGlsZElkKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUFjY2Vzc2libGUjZ2V0QWNjU3RhdGUoaW50KQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QWNjU3RhdGUoKSB7Ci0JCXJldHVybiBnZXRJQWNjZXNzaWJsZSgpLmdldEFjY1N0YXRlKGdldENoaWxkSWQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQWNjZXNzaWJsZSNhY2NEb0RlZmF1bHRBY3Rpb24oaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGRvRGVmYXVsdEFjdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRJQWNjZXNzaWJsZSgpLmFjY0RvRGVmYXVsdEFjdGlvbihnZXRDaGlsZElkKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElBY2Nlc3NpYmxlI2dldEFjY0NoaWxkQ291bnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKLQkJaWYgKGlhY2MgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlhY2MuZ2V0QWNjQ2hpbGRDb3VudCgpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUFjY2Vzc2libGUjZ2V0QWNjTmFtZShpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY2NOYW1lKCkgewotCQlyZXR1cm4gZ2V0SUFjY2Vzc2libGUoKS5nZXRBY2NOYW1lKGdldENoaWxkSWQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQWNjZXNzaWJsZSNhY2NTZWxlY3QoaW50LCBpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2VsZWN0KGludCBzZWxmbGFnVGFrZWZvY3VzKSB7Ci0JCWdldElBY2Nlc3NpYmxlKCkuYWNjU2VsZWN0KHNlbGZsYWdUYWtlZm9jdXMsIGdldENoaWxkSWQoKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgRmxhc2hNU0FBT2JqZWN0W10gY2FjaGVkQ2hpbGRyZW4gPSBuZXcgRmxhc2hNU0FBT2JqZWN0WzBdOwotCi0JLyoqCi0JICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgRmxhc2hNU0FBT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCWludCBjaGlsZENvdW50ID0gTWF0aC5tYXgoMCwgZ2V0Q2hpbGRDb3VudCgpKTsKLQkJaWYgKGNoaWxkQ291bnQgPT0gY2FjaGVkQ2hpbGRyZW4ubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQkJaWYgKGNoaWxkQ291bnQgPiAzMiAqIDEwMjQpIHsKLQkJCVN5c3RlbS5lcnIKLQkJCQkJLnByaW50bG4oIlRvbyBtYW55IGNoaWxkcmVuKCIgKyBjaGlsZENvdW50ICsgIiksIHdlIGRvbid0IGZlY3RjaC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXJldHVybiBuZXcgRmxhc2hNU0FBT2JqZWN0WzBdOwotCQl9Ci0JCWNhY2hlZENoaWxkcmVuID0gbmV3IEZsYXNoTVNBQU9iamVjdFtjaGlsZENvdW50XTsKLQkJaWYgKGNoaWxkQ291bnQgPiAwKSB7Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IE1TQUEuZ2V0QWNjZXNzaWJsZUNoaWxkcmVuKGdldElBY2Nlc3NpYmxlKCksIDAsCi0JCQkJCWNoaWxkQ291bnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspIHsKLQkJCQlpZiAoY2hpbGRyZW5baV0gIT0gbnVsbCkgewotCQkJCQlpZiAoY2hpbGRyZW5baV0gaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJCQljYWNoZWRDaGlsZHJlbltpXSA9IG5ldyBGbGFzaE1TQUFPYmplY3QodGhpcywKLQkJCQkJCQkJKEludGVnZXIpIGNoaWxkcmVuW2ldKTsKLQkJCQkJfSBlbHNlIGlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIElEaXNwYXRjaCkgewotCQkJCQkJLy8gSUFjY2Vzc2libGUgaWFjYyA9IChJQWNjZXNzaWJsZSkgKChJRGlzcGF0Y2gpCi0JCQkJCQkvLyBjaGlsZHJlbltpXSkucXVlcnlJbnRlcmZhY2UoSVVua25vd24uSUlEX0lBY2Nlc3NpYmxlKTsKLQotCQkJCQkJSUFjY2Vzc2libGUgaWFjYyA9IENvbVNlcnZpY2UKLQkJCQkJCQkJLm5ld0lBY2Nlc3NpYmxlKChJRGlzcGF0Y2gpIGNoaWxkcmVuW2ldKTsKLQotCQkJCQkJY2FjaGVkQ2hpbGRyZW5baV0gPSBuZXcgRmxhc2hNU0FBT2JqZWN0KGlhY2MpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBzdHJDbGFzc05hbWU7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB3aW5kb3cgY2xhc3MgbmFtZSBvZiB0aGUgd3JhcHBlZCBvYmplY3QgKFdpbmRvd3MgbmF0aXZlKS4gSWYKLQkgKiAgICAgICAgIGNsYXNzIG5hbWUgY2FuJ3QgYmUgb2J0YWluZWQgZnJvbSB0aGUgd3JhcHBlZCBvYmplY3QgdGhlbiByZXR1cm4KLQkgKiAgICAgICAgIG51bGwuCi0JICogQHNlZSBXaW5kb3dVdGlsI0dldFdpbmRvd0NsYXNzTmFtZShpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCWlmIChudWxsID09IHN0ckNsYXNzTmFtZSkgewotCQkJbG9uZyBod25kID0gdGhpcy5nZXRXaW5kb3coKTsKLQkJCXN0ckNsYXNzTmFtZSA9IG51bGw7Ci0JCQlpZiAoMCAhPSBod25kKSB7Ci0JCQkJc3RyQ2xhc3NOYW1lID0gV2luZG93VXRpbC5HZXRXaW5kb3dDbGFzc05hbWUoKGludCkgaHduZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0ckNsYXNzTmFtZTsKLQl9Ci0KLQlwcml2YXRlIGxvbmcgYWNjV2luZG93ID0gLTE7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSB3aW5kb3cgaGFuZGxlIG9mIHRoZSB3cmFwcGVkIG9iamVjdC4gSWYgd2luZG93Ci0JICogICAgICAgICBoYW5kbGUgY2FuJ3QgYmUgb2J0YWluZWQgZnJvbSB0aGUgd3JhcHBlZCBvYmplY3QgdGhlbiByZXR1cm4gMC4KLQkgKiBAc2VlIE1TQUEjV2luZG93RnJvbUFjY2Vzc2libGVPYmplY3QKLQkgKi8KLQlwdWJsaWMgaW50IGdldFdpbmRvdygpIHsKLQkJaWYgKC0xID09IGFjY1dpbmRvdykgewotCQkJdHJ5IHsKLQkJCQlhY2NXaW5kb3cgPSBNU0FBLldpbmRvd0Zyb21BY2Nlc3NpYmxlT2JqZWN0KGdldElBY2Nlc3NpYmxlKCkKLQkJCQkJCS5nZXRQdHIoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWFjY1dpbmRvdyA9IDA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChpbnQpIGFjY1dpbmRvdzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBuYXRpdmUgYWRkcmVzcyBvZiB0aGUgd3JhcHBlZCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgaW50IGdldFB0cigpIHsKLQkJcmV0dXJuIChpbnQpIGdldElBY2Nlc3NpYmxlKCkuZ2V0UHRyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0ZsYXNoTVNBQU9iamVjdEZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvRmxhc2hNU0FBT2JqZWN0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTYxNDQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvRmxhc2hNU0FBT2JqZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBEYWlzdWtlIFNBVE8gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIuY29tY2x1dGNoLkNvbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5JU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5jb21jbHV0Y2guSVVua25vd247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLmNvbWNsdXRjaC5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLm1zYWEuSUFjY2Vzc2libGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyLm1zYWEuTVNBQTsKLQotLyoqCi0gKiBUaGUgZmFjdG9yeSBjbGFzcyBvZiBGbGFzaE1TQUFPYmplY3QKLSAqLwotcHVibGljIGNsYXNzIEZsYXNoTVNBQU9iamVjdEZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlTWFuYWdlciByZXNvdWNlTWFuYWdlciA9IG51bGw7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGh3bmQKLQkgKiAgICAgICAgICAgIHRoZSB3aW5kb3cgaGFuZGxlIHRvIGJlIHVzZWQgdG8gb2J0YWluIEZsYXNoTVNBQU9iamVjdAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBGbGFzaE1TQUFPYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgPGk+aHduZDwvaT4KLQkgKiBAc2VlIHtAbGluayBGbGFzaE1TQUFPYmplY3R9Ci0JICovCi0JcHVibGljIHN0YXRpYyBGbGFzaE1TQUFPYmplY3QgZ2V0Rmxhc2hNU0FBT2JqZWN0RnJvbVdpbmRvdyhsb25nIGh3bmQpIHsKLQkJaWYgKHJlc291Y2VNYW5hZ2VyID09IG51bGwpIHsKLQkJCXJlc291Y2VNYW5hZ2VyID0gUmVzb3VyY2VNYW5hZ2VyLm5ld1Jlc291cmNlTWFuYWdlcihudWxsKTsKLQkJfQotCQlsb25nIGlhY2NQdHIgPSBNU0FBLmdldEFjY2Vzc2libGVPYmplY3RGcm9tV2luZG93KGh3bmQpOwotCQlJQWNjZXNzaWJsZSBpYWNjID0gQ29tU2VydmljZS5uZXdJQWNjZXNzaWJsZShyZXNvdWNlTWFuYWdlciwgaWFjY1B0ciwgdHJ1ZSk7Ci0JCXJldHVybiBuZXcgRmxhc2hNU0FBT2JqZWN0KGlhY2MpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpYWNjCi0JICogICAgICAgICAgICB0aGUgYWRkcmVzcyBvZiBuYXRpdmUgSUFjY2Vzc2libGUgb2JqZWN0IAotCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoZSBGbGFzaE1TQUFPYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgPGk+aHduZDwvaT4KLQkgKiBAc2VlIHtAbGluayBGbGFzaE1TQUFPYmplY3R9Ci0JICovCi0JcHVibGljIHN0YXRpYyBGbGFzaE1TQUFPYmplY3QgZ2V0Rmxhc2hNU0FBT2JqZWN0RnJvbVB0cihsb25nIGFkZHJlc3MpIHsKLQkJaWYgKHJlc291Y2VNYW5hZ2VyID09IG51bGwpIHsKLQkJCXJlc291Y2VNYW5hZ2VyID0gUmVzb3VyY2VNYW5hZ2VyLm5ld1Jlc291cmNlTWFuYWdlcihudWxsKTsKLQkJfQotCQlJQWNjZXNzaWJsZSBpYWNjID0gQ29tU2VydmljZS5uZXdJQWNjZXNzaWJsZShyZXNvdWNlTWFuYWdlciwgYWRkcmVzcywgdHJ1ZSk7Ci0JCXJldHVybiBuZXcgRmxhc2hNU0FBT2JqZWN0KGlhY2MpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpdW5rCi0JICogICAgICAgICAgICB0aGUgSVVua25vd24gaW5zdGFuY2Ugb2YgdGhlIEhUTUwgZWxlbWVudCB0byBiZSB1c2VkIHRvCi0JICogICAgICAgICAgICBvYnRhaW4gRmxhc2hNU0FBT2JqZWN0Ci0JICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgdGhlIEZsYXNoTVNBQU9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSA8aT5pdW5rPC9pPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmxhc2hNU0FBT2JqZWN0IGdldEZsYXNoTVNBQU9iamVjdEZyb21FbGVtZW50KElVbmtub3duIGl1bmspIHsKLQkJSVNlcnZpY2VQcm92aWRlciBpc3AgPSAoSVNlcnZpY2VQcm92aWRlcikgaXVuawotCQkJCS5xdWVyeUludGVyZmFjZShJVW5rbm93bi5JSURfSVNlcnZpY2VQcm92aWRlcik7Ci0JCWlmIChpc3AgIT0gbnVsbCkgewotCQkJSVVua25vd24gaWFjYyA9IGlzcC5xdWVyeVNlcnZpY2UoSVVua25vd24uSUlEX0lBY2Nlc3NpYmxlLAotCQkJCQlJVW5rbm93bi5JSURfSUFjY2Vzc2libGUpOwotCQkJaWYgKGl1bmsgIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgRmxhc2hNU0FBT2JqZWN0KENvbVNlcnZpY2UubmV3SUFjY2Vzc2libGUoaWFjYykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvSGlnaGxpZ2h0Q29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL0hpZ2hsaWdodENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTEzNDU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvSGlnaGxpZ2h0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFjdGYudXRpbC5pbnRlcm5hbC53aW4zMi5BY2Nlc3NpYmxlSGlsaWdodGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEhpZ2hsaWdodENvbXBvc2l0ZSBpcyB1c2VkIHRvIGhpZ2hsaWdodCBhbiBvYmplY3QuIFRoZSBjb21wb3NpdGUgaXMgdXNlZCBpbgotICoge0BsaW5rIE92ZXJsYXlXaW5kb3d9LgotICovCi1wdWJsaWMgY2xhc3MgSGlnaGxpZ2h0Q29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSUludGVydmFsRXhlYyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQk9SREVSX1dJRFRIID0gMzsKLQotCXByaXZhdGUgc3RhdGljIEhpZ2hsaWdodENvbXBvc2l0ZSBpbnN0YW5jZTsKLQotCXByaXZhdGUgU3R5bGVkVGV4dCB0ZXh0OwotCi0JcHJpdmF0ZSBEaXNwbGF5IGRpc3BsYXk7Ci0KLQlwcml2YXRlIGludCBmbGFzaGluZ0luZGV4ID0gLTE7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgc3VwcHJlc3NSZWZDb3VudCA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG5lZWRSZWRyYXcgPSB0cnVlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W11bXSBGTEFTSElOR19DT0xPUlMgPSB7IHsgU1dULkNPTE9SX1lFTExPVywgMjUwIH0sCi0JCQl7IFNXVC5DT0xPUl9HUkVFTiwgMjUwIH0sIHsgU1dULkNPTE9SX1lFTExPVywgMjUwIH0sCi0JCQl7IFNXVC5DT0xPUl9HUkVFTiwgMjUwIH0sIHsgU1dULkNPTE9SX1lFTExPVywgMjUwIH0sCi0JCQl7IFNXVC5DT0xPUl9HUkVFTiwgMjUwIH0sIHsgU1dULkNPTE9SX1lFTExPVywgMTAwMCB9IH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9DT0xPUiA9IFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9CQUNLID0gU1dULkNPTE9SX0lORk9fQkFDS0dST1VORDsKLQotCXByaXZhdGUgSGlnaGxpZ2h0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJZGlzcGxheSA9IGdldERpc3BsYXkoKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gQk9SREVSX1dJRFRIOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHRoaXMsIFNXVC5OT05FKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdGV4dC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXRCYWNrZ3JvdW5kKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaG93KFJlY3RhbmdsZSByZWN0LCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoLTEgIT0gZmxhc2hpbmdJbmRleCkgewotCQkJbmVlZFJlZHJhdyA9IHRydWU7Ci0JCX0KLQkJZmxhc2hpbmdJbmRleCA9IDA7Ci0JCWlmIChudWxsICE9IG1lc3NhZ2UpIHsKLQkJCXRleHQuc2V0VGV4dChtZXNzYWdlKTsKLQkJCVN0eWxlUmFuZ2UgcmFuZ2UgPSBuZXcgU3R5bGVSYW5nZSgpOwotCQkJcmFuZ2Uuc3RhcnQgPSAwOwotCQkJcmFuZ2UubGVuZ3RoID0gdGV4dC5nZXRDaGFyQ291bnQoKTsKLQkJCXJhbmdlLmZvcmVncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKE1FU1NBR0VfQ09MT1IpOwotCQkJcmFuZ2UuYmFja2dyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoTUVTU0FHRV9CQUNLKTsKLQkJCXRleHQuc2V0U3R5bGVSYW5nZShyYW5nZSk7Ci0JCX0KLQkJZ2V0T3ZlcmxheVdpbmRvdygpLmdldENvbXBvc2l0ZSgpLm1vdmVBYm92ZShudWxsKTsKLQkJbW92ZUFib3ZlKG51bGwpOwotCQlzZXRCb3VuZHMocmVjdC54LCByZWN0LnksIE1hdGgubWF4KEJPUkRFUl9XSURUSCwgcmVjdC53aWR0aCksIE1hdGgubWF4KAotCQkJCUJPUkRFUl9XSURUSCwgcmVjdC5oZWlnaHQpKTsKLQkJc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi5JSW50ZXJ2YWxFeGVjI2V4ZWMoKQotCSAqLwotCXB1YmxpYyBpbnQgZXhlYygpIHsKLQkJaWYgKC0xICE9IGZsYXNoaW5nSW5kZXgpIHsKLQkJCWlmIChmbGFzaGluZ0luZGV4IDwgRkxBU0hJTkdfQ09MT1JTLmxlbmd0aCkgewotCQkJCXNldEJhY2tncm91bmQoZGlzcGxheQotCQkJCQkJLmdldFN5c3RlbUNvbG9yKEZMQVNISU5HX0NPTE9SU1tmbGFzaGluZ0luZGV4XVswXSkpOwotCQkJCXJldHVybiBGTEFTSElOR19DT0xPUlNbZmxhc2hpbmdJbmRleCsrXVsxXTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmxhc2hpbmdJbmRleCA9IC0xOwotCQkJCXNldFZpc2libGUoZmFsc2UpOwotCQkJCWlmIChuZWVkUmVkcmF3KSB7Ci0JCQkJCW5lZWRSZWRyYXcgPSBmYWxzZTsKLQkJCQkJZ2V0T3ZlcmxheVdpbmRvdygpLmdldENvbXBvc2l0ZSgpLnJlZHJhdygpOyAvLyBDbGVhciBibGFjawotCQkJCQkvLyBibG9jawotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBGbGFzaCByZWN0YW5nbGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVjdAotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIHRvIGJlIGhpZ2hsaWdodGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmbGFzaFJlY3RhbmdsZShSZWN0YW5nbGUgcmVjdCkgewotCQlpZiAobnVsbCAhPSByZWN0ICYmIDAgPT0gc3VwcHJlc3NSZWZDb3VudCkgewotCQkJaWYgKE92ZXJsYXlXaW5kb3cuZ2V0VmlzaWJsZSgpKSB7Ci0JCQkJT3ZlcmxheVdpbmRvdyB3aW5kb3cgPSBnZXRPdmVybGF5V2luZG93KCk7Ci0JCQkJaWYgKG51bGwgPT0gaW5zdGFuY2UpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgSGlnaGxpZ2h0Q29tcG9zaXRlKHdpbmRvdy5nZXRDb21wb3NpdGUoKSwKLQkJCQkJCQlTV1QuTk9ORSk7Ci0JCQkJfQotCQkJCWluc3RhbmNlLnNob3cocmVjdCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJd2luZG93LnJ1bigpOwotCQkJfSBlbHNlIHsKLQkJCQlBY2Nlc3NpYmxlSGlsaWdodGVyLmZsYXNoUmVjdGFuZ2xlKHJlY3QpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzeW5jaHJvbml6ZSB0aGUgdmlldyB1cGRhdGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gaW5jcmVtZW50Ci0JICogICAgICAgICAgICB0aGUgaW5jcmVtZW50KCspIC8gZGVjcmVtZW50KC0pIHdpZHRoLgotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc3VwcHJlc3MgY291bnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgdXBkYXRlU3VwcHJlc3NDb3VudChpbnQgaW5jcmVtZW50KSB7Ci0JCXN1cHByZXNzUmVmQ291bnQgKz0gaW5jcmVtZW50OwotCQlyZXR1cm4gc3VwcHJlc3NSZWZDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGZsYWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG9iamVjdCBmb3IgaGlnaGxpZ2h0IGlzIHNob3duIG9yCi0JICogbm90LgotCSAqIAotCSAqIEBwYXJhbSBzaG93Ci0JICogICAgICAgICAgICB0cnVlIHRvIHNob3cgaGlnaGxpZ2h0IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2hvdyhib29sZWFuIHNob3cpIHsKLQkJaWYgKG51bGwgIT0gaW5zdGFuY2UpIHsKLQkJCWluc3RhbmNlLnNldFZpc2libGUoc2hvdyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IG92ZXJsYXkgd2luZG93LgotCSAqLwotCXByaXZhdGUgc3RhdGljIE92ZXJsYXlXaW5kb3cgZ2V0T3ZlcmxheVdpbmRvdygpIHsKLQkJcmV0dXJuIE92ZXJsYXlXaW5kb3cuZ2V0SW5zdGFuY2UoT3ZlcmxheVdpbmRvdy5JTkRFWF9ISUdITElHSFQsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgZGVmYXVsdCBvdmVybGF5IHdpbmRvdy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdE92ZXJsYXlXaW5kb3coKSB7Ci0JCWdldE92ZXJsYXlXaW5kb3coKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvSUludGVydmFsRXhlYy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9JSW50ZXJ2YWxFeGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYmVhYjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9JSW50ZXJ2YWxFeGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyOwotCi0KLS8qKgotICogSUludGVydmFsRXhlYyBpbnRlcmZhY2UgZGVmaW5lcyBhIG1ldGhvZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgb2JqZWN0IHdoaWNoIHdpbGwgYmUKLSAqIGV4ZWN1dGVkIGluIGNlcnRhaW4gaW50ZXJ2YWwuIEl0IGhhcyB0aGUgc2FtZSBmdW5jdGlvbiBvZiB7QGxpbmsgUnVubmFibGV9LCBidXQgdGhlCi0gKiBleGVjKCkgbWV0aG9kIGhhcyBhIHJldHVybiB2YWx1ZS4gCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUludGVydmFsRXhlYyB7Ci0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbmV4dCBpbnRlcnZhbCB0aW1lIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGV4ZWMoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvTWVtb3J5VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9NZW1vcnlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZjdmMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9NZW1vcnlVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5vbGUud2luMzIuQ09NOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIG1hbmlwdWxhdGUgbWVtb3J5LgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIE1lbW9yeVV0aWwgewotCi0JLyoqCi0JICogR2xvYmFsQWxsb2MgdGhlIG1lbW9yeQotCSAqIAotCSAqIEBwYXJhbSBkd0J5dGVzCi0JICogICAgICAgICAgICBzaXplCi0JICogQHJldHVybiBwb2ludGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgR2xvYmFsQWxsb2MoaW50IGR3Qnl0ZXMpIHsKLQkJcmV0dXJuIE9TLkdsb2JhbEFsbG9jKE9TLkdNRU1fRklYRUQgfCBPUy5HTUVNX1pFUk9JTklULCBkd0J5dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHbG9iYWxGcmVlIHRhcmdldCBtZW1vcnkKLQkgKiAKLQkgKiBAcGFyYW0gaE1lbQotCSAqICAgICAgICAgICAgdGFyZ2V0IG1lbW9yeQotCSAqIEByZXR1cm4gcmV0dXJuIGNvZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBHbG9iYWxGcmVlKGludCBoTWVtKSB7Ci0JCXJldHVybiBPUy5HbG9iYWxGcmVlKGhNZW0pOwotCX0KLQotCS8qKgotCSAqIEFsbG9jYXRlIE9MRSBTdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gc3oKLQkgKiAgICAgICAgICAgIHRhcmdldCBTdHJpbmcgYXMgYXJyYXkgb2YgY2hhcgotCSAqIEByZXR1cm4gQlNUUiBwb2ludGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgU3lzQWxsb2NTdHJpbmcoY2hhcltdIHN6KSB7Ci0JCXJldHVybiBDT00uU3lzQWxsb2NTdHJpbmcoc3opOwotCX0KLQotCS8qKgotCSAqIEZyZWUgT0xFIFN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBic3RyCi0JICogICAgICAgICAgICB0YXJnZXQgQlNUUiBwb2ludGVyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIFN5c0ZyZWVTdHJpbmcoaW50IGJzdHIpIHsKLQkJQ09NLlN5c0ZyZWVTdHJpbmcoYnN0cik7Ci0JfQotCi0JLyoqCi0JICogTW92ZU1lbW9yeQotCSAqIAotCSAqIEBwYXJhbSBEZXN0aW5hdGlvbgotCSAqIEBwYXJhbSBTb3VyY2UKLQkgKiBAcGFyYW0gTGVuZ3RoCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIE1vdmVNZW1vcnkoaW50W10gRGVzdGluYXRpb24sIGludCBTb3VyY2UsIGludCBMZW5ndGgpIHsKLQkJT1MuTW92ZU1lbW9yeShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIE1vdmVNZW1vcnkKLQkgKiAKLQkgKiBAcGFyYW0gRGVzdGluYXRpb24KLQkgKiBAcGFyYW0gU291cmNlUHRyCi0JICogQHBhcmFtIExlbmd0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBNb3ZlTWVtb3J5KHNob3J0W10gRGVzdGluYXRpb24sIGludCBTb3VyY2VQdHIsIGludCBMZW5ndGgpIHsKLQkJT1MuTW92ZU1lbW9yeShEZXN0aW5hdGlvbiwgU291cmNlUHRyLCBMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIE1vdmVNZW1vcnkKLQkgKiAKLQkgKiBAcGFyYW0gRGVzdGluYXRpb24KLQkgKiBAcGFyYW0gU291cmNlUHRyCi0JICogQHBhcmFtIExlbmd0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBNb3ZlTWVtb3J5KGNoYXJbXSBEZXN0aW5hdGlvbiwgaW50IFNvdXJjZVB0ciwgaW50IExlbmd0aCkgewotCQlPUy5Nb3ZlTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2VQdHIsIExlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogTW92ZU1lbW9yeQotCSAqIAotCSAqIEBwYXJhbSBEZXN0aW5hdGlvblB0cgotCSAqIEBwYXJhbSBTb3VyY2UKLQkgKiBAcGFyYW0gTGVuZ3RoCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIE1vdmVNZW1vcnkoaW50IERlc3RpbmF0aW9uUHRyLCBzaG9ydFtdIFNvdXJjZSwgaW50IExlbmd0aCkgewotCQlPUy5Nb3ZlTWVtb3J5KERlc3RpbmF0aW9uUHRyLCBTb3VyY2UsIExlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogTW92ZU1lbW9yeQotCSAqIAotCSAqIEBwYXJhbSBEZXN0aW5hdGlvblB0cgotCSAqIEBwYXJhbSBTb3VyY2UKLQkgKiBAcGFyYW0gTGVuZ3RoCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIE1vdmVNZW1vcnkoaW50IERlc3RpbmF0aW9uUHRyLCBpbnRbXSBTb3VyY2UsIGludCBMZW5ndGgpIHsKLQkJT1MuTW92ZU1lbW9yeShEZXN0aW5hdGlvblB0ciwgU291cmNlLCBMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIE1vdmVNZW1vcnkKLQkgKiAKLQkgKiBAcGFyYW0gRGVzdGluYXRpb25QdHIKLQkgKiBAcGFyYW0gU291cmNlCi0JICogQHBhcmFtIExlbmd0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBNb3ZlTWVtb3J5KGludCBEZXN0aW5hdGlvblB0ciwgY2hhcltdIFNvdXJjZSwgaW50IExlbmd0aCkgewotCQlPUy5Nb3ZlTWVtb3J5KERlc3RpbmF0aW9uUHRyLCBTb3VyY2UsIExlbmd0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL05hdGl2ZUludEFjY2Vzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9OYXRpdmVJbnRBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyY2Q3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL05hdGl2ZUludEFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBhY2Nlc3MgbmF0aXZlIGludGVnZXIKLSAqLwotcHVibGljIGNsYXNzIE5hdGl2ZUludEFjY2VzcyB7Ci0JcHJpdmF0ZSBpbnQgcEludEFkZHJlc3MgPSAwOwotCi0JLyoqCi0JICogRGVmYXVsdCBDb25zdHJ1Y3RvciAoc2l6ZT0xKQotCSAqLwotCXB1YmxpYyBOYXRpdmVJbnRBY2Nlc3MoKSB7Ci0JCXRoaXMoMSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgdGhlIGNsYXNzCi0JICogCi0JICogQHBhcmFtIHNpemUKLQkgKiAgICAgICAgICAgIGFycmF5IHNpemUKLQkgKi8KLQlwdWJsaWMgTmF0aXZlSW50QWNjZXNzKGludCBzaXplKSB7Ci0JCXBJbnRBZGRyZXNzID0gTWVtb3J5VXRpbC5HbG9iYWxBbGxvYyg0ICogc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZSB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJTWVtb3J5VXRpbC5HbG9iYWxGcmVlKHBJbnRBZGRyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG5hdGl2ZSBhZGRyZXNzIChpbmRleD0wKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QWRkcmVzcygpIHsKLQkJcmV0dXJuIGdldEFkZHJlc3MoMCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0YXJnZXQgaW5kZXgKLQkgKiBAcmV0dXJuIG5hdGl2ZSBhZGRyZXNzCi0JICovCi0JcHVibGljIGludCBnZXRBZGRyZXNzKGludCBpbmRleCkgewotCQlyZXR1cm4gcEludEFkZHJlc3MgKyBpbmRleCAqIDQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnRlZ2VyIHZhbHVlIChpbmRleD0wKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50KCkgewotCQlyZXR1cm4gZ2V0SW50KDApOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGFyZ2V0IGluZGV4Ci0JICogQHJldHVybiBpbnRlZ2VyIHZhbHVlCi0JICovCi0JcHVibGljIGludCBnZXRJbnQoaW50IGluZGV4KSB7Ci0JCWludFtdIHBJbnQgPSBuZXcgaW50WzFdOwotCQlNZW1vcnlVdGlsLk1vdmVNZW1vcnkocEludCwgZ2V0QWRkcmVzcyhpbmRleCksIDQpOwotCQlyZXR1cm4gcEludFswXTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbmF0aXZlIGludGVnZXIgdmFsdWUgYXQgaW5kZXggMAotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGFyZ2V0IHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW50KGludCB2YWx1ZSkgewotCQlzZXRJbnQoMCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldCBuYXRpdmUgaW50ZWdlciB2YWx1ZSBhdCB0YXJnZXQgaW5kZXgKLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRhcmdldCBpbmRleAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGFyZ2V0IHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW50KGludCBpbmRleCwgaW50IHZhbHVlKSB7Ci0JCWludFtdIHBJbnQgPSBuZXcgaW50WzFdOwotCQlwSW50WzBdID0gdmFsdWU7Ci0JCU1lbW9yeVV0aWwuTW92ZU1lbW9yeShnZXRBZGRyZXNzKGluZGV4KSwgcEludCwgNCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9OYXRpdmVTdHJpbmdBY2Nlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvTmF0aXZlU3RyaW5nQWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNDJhOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9OYXRpdmVTdHJpbmdBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkNPTTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGFjY2VzcyBuYXRpdmUgU3RyaW5nCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgTmF0aXZlU3RyaW5nQWNjZXNzIHsKLQlwcml2YXRlIGludCBwQlNUUkFkZHJlc3MgPSAwOwotCi0JcHJpdmF0ZSBpbnRbXSBoTWVtID0gbmV3IGludFsxXTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIG9mIHRoZSBjbGFzcwotCSAqLwotCXB1YmxpYyBOYXRpdmVTdHJpbmdBY2Nlc3MoKSB7Ci0JCXBCU1RSQWRkcmVzcyA9IE1lbW9yeVV0aWwuR2xvYmFsQWxsb2MoNCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZSB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKDAgIT0gaE1lbVswXSkgewotCQkJQ09NLlN5c0ZyZWVTdHJpbmcoaE1lbVswXSk7Ci0JCX0KLQkJTWVtb3J5VXRpbC5HbG9iYWxGcmVlKHBCU1RSQWRkcmVzcyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBuYXRpdmUgYWRkcmVzcwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QWRkcmVzcygpIHsKLQkJcmV0dXJuIHBCU1RSQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHN0cmluZyB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQlNZW1vcnlVdGlsLk1vdmVNZW1vcnkoaE1lbSwgcEJTVFJBZGRyZXNzLCA0KTsKLQkJaWYgKDAgIT0gaE1lbVswXSkgewotCQkJaW50IHNpemUgPSBDT00uU3lzU3RyaW5nQnl0ZUxlbihoTWVtWzBdKTsKLQkJCWlmIChzaXplID4gMCkgewotCQkJCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhclsoc2l6ZSArIDEpIC8gMl07Ci0JCQkJTWVtb3J5VXRpbC5Nb3ZlTWVtb3J5KGJ1ZmZlciwgaE1lbVswXSwgc2l6ZSk7Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsvLyAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNldCBuYXRpdmUgU3RyaW5nIHZhbHVlCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHRleHQpIHsKLQkJTWVtb3J5VXRpbC5Nb3ZlTWVtb3J5KGhNZW0sIHBCU1RSQWRkcmVzcywgNCk7Ci0JCWlmICgwICE9IGhNZW1bMF0pIHsKLQkJCUNPTS5TeXNGcmVlU3RyaW5nKGhNZW1bMF0pOwotCQl9Ci0JCWNoYXJbXSBkYXRhID0gKHRleHQgKyAiXDAiKS50b0NoYXJBcnJheSgpOyAvLyROT04tTkxTLTEkCi0JCWludCBwdHIgPSBDT00uU3lzQWxsb2NTdHJpbmcoZGF0YSk7Ci0JCUNPTS5Nb3ZlTWVtb3J5KHBCU1RSQWRkcmVzcywgbmV3IGludFtdIHsgcHRyIH0sIDQpOwotCQlNZW1vcnlVdGlsLk1vdmVNZW1vcnkoaE1lbSwgcEJTVFJBZGRyZXNzLCA0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL05hdGl2ZVZhcmlhbnRBY2Nlc3MuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvTmF0aXZlVmFyaWFudEFjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Y3MDJjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvTmF0aXZlVmFyaWFudEFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLkNPTTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLklEaXNwYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLk9MRTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLlZhcmlhbnQ7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBhY2Nlc3MgbmF0aXZlIFZhcmlhbnQKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBOYXRpdmVWYXJpYW50QWNjZXNzIHsKLQlwcml2YXRlIGludCBzaXplOwotCi0JcHJpdmF0ZSBpbnQgcFZhcmlhbnRBZGRyZXNzOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgdGhlIGNsYXNzIChzaXplPTEpCi0JICovCi0JcHVibGljIE5hdGl2ZVZhcmlhbnRBY2Nlc3MoKSB7Ci0JCXRoaXMoMSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgdGhlIGNsYXNzCi0JICogCi0JICogQHBhcmFtIHNpemUKLQkgKiAgICAgICAgICAgIGFycmF5IHNpemUKLQkgKi8KLQlwdWJsaWMgTmF0aXZlVmFyaWFudEFjY2VzcyhpbnQgc2l6ZSkgewotCQl0aGlzLnNpemUgPSBzaXplOwotCQl0aGlzLnBWYXJpYW50QWRkcmVzcyA9IE1lbW9yeVV0aWwuR2xvYmFsQWxsb2MoVmFyaWFudC5zaXplb2YgKiBzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUNPTS5WYXJpYW50SW5pdChnZXRBZGRyZXNzKGkpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UgdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlDT00uVmFyaWFudENsZWFyKGdldEFkZHJlc3MoaSkpOwotCQl9Ci0JCU1lbW9yeVV0aWwuR2xvYmFsRnJlZShwVmFyaWFudEFkZHJlc3MpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbmF0aXZlIGFkZHJlc3MgKGluZGV4PTApCi0JICovCi0JcHVibGljIGludCBnZXRBZGRyZXNzKCkgewotCQlyZXR1cm4gZ2V0QWRkcmVzcygwKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRhcmdldCBpbmRleAotCSAqIEByZXR1cm4gbmF0aXZlIGFkZHJlc3MgYXQgdGhlIGluZGV4Ci0JICovCi0JcHVibGljIGludCBnZXRBZGRyZXNzKGludCBpbmRleCkgewotCQlyZXR1cm4gcFZhcmlhbnRBZGRyZXNzICsgVmFyaWFudC5zaXplb2YgKiBpbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHR5cGUgb2YgVmFyaWFudCAoaW5kZXg9MCkKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldFR5cGUoMCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0YXJnZXQgaW5kZXgKLQkgKiBAcmV0dXJuIHR5cGUgb2YgVmFyaWFudCBhdCB0aGUgaW5kZXgKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZShpbnQgaW5kZXgpIHsKLQkJc2hvcnRbXSBwVHlwZSA9IG5ldyBzaG9ydFsxXTsKLQkJTWVtb3J5VXRpbC5Nb3ZlTWVtb3J5KHBUeXBlLCBnZXRBZGRyZXNzKGluZGV4KSwgMik7Ci0JCXJldHVybiBwVHlwZVswXTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludGVnZXIgdmFsdWUgKGluZGV4PTApCi0JICovCi0JcHVibGljIGludCBnZXRJbnQoKSB7Ci0JCXJldHVybiBnZXRJbnQoMCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0YXJnZXQgaW5kZXgKLQkgKiBAcmV0dXJuIGludGVnZXIgdmFsdWUgYXQgdGhlIGluZGV4Ci0JICovCi0JcHVibGljIGludCBnZXRJbnQoaW50IGluZGV4KSB7Ci0JCWlmIChPTEUuVlRfSTQgPT0gZ2V0VHlwZShpbmRleCkpIHsKLQkJCWludFtdIHBJbnQgPSBuZXcgaW50WzFdOwotCQkJTWVtb3J5VXRpbC5Nb3ZlTWVtb3J5KHBJbnQsIGdldEFkZHJlc3MoaW5kZXgpICsgOCwgNCk7Ci0JCQlyZXR1cm4gcEludFswXTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBJRGlzcGF0Y2ggYXQgaW5kZXggMAotCSAqLwotCXB1YmxpYyBJRGlzcGF0Y2ggZ2V0RGlzcGF0Y2goKSB7Ci0JCXJldHVybiBnZXREaXNwYXRjaCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRhcmdldCBpbmRleAotCSAqIEByZXR1cm4gSURpc3BhdGNoIGF0IHRoZSBpbmRleAotCSAqLwotCXB1YmxpYyBJRGlzcGF0Y2ggZ2V0RGlzcGF0Y2goaW50IGluZGV4KSB7Ci0JCWlmIChPTEUuVlRfRElTUEFUQ0ggPT0gZ2V0VHlwZShpbmRleCkpIHsKLQkJCWludFtdIHBJbnQgPSBuZXcgaW50WzFdOwotCQkJTWVtb3J5VXRpbC5Nb3ZlTWVtb3J5KHBJbnQsIGdldEFkZHJlc3MoaW5kZXgpICsgOCwgNCk7Ci0JCQlyZXR1cm4gbmV3IElEaXNwYXRjaChwSW50WzBdKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG5hdGl2ZSBTdHJpbmcgKGluZGV4PTApCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoMCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0YXJnZXQgaW5kZXgKLQkgKiBAcmV0dXJuIG5hdGl2ZSBTdHJpbmcgYXQgdGhlIGluZGV4Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGluZGV4KSB7Ci0JCWlmIChPTEUuVlRfQlNUUiA9PSBnZXRUeXBlKGluZGV4KSkgewotCQkJaW50W10gaE1lbSA9IG5ldyBpbnRbMV07Ci0JCQlNZW1vcnlVdGlsLk1vdmVNZW1vcnkoaE1lbSwgZ2V0QWRkcmVzcyhpbmRleCkgKyA4LCA0KTsKLQkJCWlmICgwICE9IGhNZW1bMF0pIHsKLQkJCQlpbnQgc2l6ZSA9IENPTS5TeXNTdHJpbmdCeXRlTGVuKGhNZW1bMF0pOwotCQkJCWlmIChzaXplID4gMCkgewotCQkJCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbKHNpemUgKyAxKSAvIDJdOwotCQkJCQlNZW1vcnlVdGlsLk1vdmVNZW1vcnkoYnVmZmVyLCBoTWVtWzBdLCBzaXplKTsKLQkJCQkJcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBWYXJpYW50IChpbmRleD0wKQotCSAqLwotCXB1YmxpYyBWYXJpYW50IGdldFZhcmlhbnQoKSB7Ci0JCXJldHVybiBnZXRWYXJpYW50KDApOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGFyZ2V0IGluZGV4Ci0JICogQHJldHVybiBWYXJpYW50IGF0IHRoZSBpbmRleAotCSAqLwotCXB1YmxpYyBWYXJpYW50IGdldFZhcmlhbnQoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoZ2V0VHlwZShpbmRleCkpIHsKLQkJY2FzZSBPTEUuVlRfSTQ6Ci0JCQlyZXR1cm4gbmV3IFZhcmlhbnQoZ2V0SW50KGluZGV4KSk7Ci0JCWNhc2UgT0xFLlZUX0JTVFI6Ci0JCQlyZXR1cm4gbmV3IFZhcmlhbnQoZ2V0U3RyaW5nKGluZGV4KSk7Ci0JCWNhc2UgT0xFLlZUX0VNUFRZOgotCQkJcmV0dXJuIG5ldyBWYXJpYW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL092ZXJsYXlMYWJlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9PdmVybGF5TGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5YTUwMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL092ZXJsYXlMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLQotLyoqCi0gKiBPdmVybGF5TGFiZWwgaXMgdXNlZCB0byBzaG93IHNvbWUgaW5mb3JtYXRpb24gb24gdGhlIGFwcGxpY2F0aW9uIHdpbmRvd3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBPdmVybGF5TGFiZWwgZXh0ZW5kcyBDTGFiZWwgewotCi0JcHVibGljIE9iamVjdCBhc3NvY2lhdGVkT2JqZWN0OwotCi0JcHJpdmF0ZSBNZW51IHBvcHVwTWVudTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBvd25lcklkID0gbnVsbDsKLQotCXByaXZhdGUgT3ZlcmxheUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJc2V0Rm9yZWdyb3VuZChnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCkpOwotCQlzZXRCYWNrZ3JvdW5kKGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0JCXNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlhZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGdldENsaWVudEFyZWEoKTsKLQkJCQlldmVudC5nYy5kcmF3UmVjdGFuZ2xlKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoIC0gMSwKLQkJCQkJCXJlY3QuaGVpZ2h0IC0gMSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgbGFiZWwgZnJvbSB0aGUgb3ZlcmxheSB3aW5kb3cgZm9yIG92ZXJsYXkgbGFiZWxzLiBBbGwgbGFiZWxzCi0JICogd2lsbCBiZSByZW1vdmVkIHdpdGggc3luY2hyb25pemF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0JCXJlbW92ZUFsbCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIGxhYmVsIGZyb20gdGhlIG92ZXJsYXkgd2luZG93IGZvciBvdmVybGF5IGxhYmVscy4KLQkgKiAKLQkgKiBAcGFyYW0gZm9yY2UKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgcmVtb3ZlIHdpdGhvdXQgc3luY2hyb25pemUgb3Igbm90LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGwoYm9vbGVhbiBmb3JjZSkgewotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0T3ZlcmxheUNvbXBvc2l0ZShmYWxzZSk7Ci0JCWlmIChudWxsICE9IGNvbXBvc2l0ZSkgewotCQkJaWYgKGZvcmNlKSB7Ci0JCQkJcmVtb3ZlQ2hpbGRyZW4oY29tcG9zaXRlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29tcG9zaXRlLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoIWNvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkKLQkJCQkJCQkJJiYgbnVsbCA9PSBjb21wb3NpdGUuZ2V0RGlzcGxheSgpCi0JCQkJCQkJCQkJLmdldEFjdGl2ZVNoZWxsKCkpIHsKLQkJCQkJCQlyZW1vdmVDaGlsZHJlbihjb21wb3NpdGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUNoaWxkcmVuKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJQ29udHJvbFtdIGNvbnRyb2xzID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb250cm9sc1tpXSBpbnN0YW5jZW9mIE92ZXJsYXlMYWJlbCkgewotCQkJCWNvbnRyb2xzW2ldLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBvdmVybGF5IGxhYmVsCi0JICogCi0JICogQHBhcmFtIGFzc29jaWF0ZWRPYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IG9mIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgT3ZlcmxheUxhYmVsIGluc3RhbmNlIGlmIHRoZSA8aT5hc3NvY2lhdGVkT2JqZWN0PC9pPiBpcwotCSAqICAgICAgICAgbm90IGFscmVhZHkgdXNlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE92ZXJsYXlMYWJlbCBjcmVhdGUoT2JqZWN0IGFzc29jaWF0ZWRPYmplY3QpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldE92ZXJsYXlDb21wb3NpdGUodHJ1ZSk7Ci0JCWNvbXBvc2l0ZS5tb3ZlQWJvdmUobnVsbCk7Ci0JCUNvbnRyb2xbXSBjb250cm9scyA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29udHJvbHNbaV0gaW5zdGFuY2VvZiBPdmVybGF5TGFiZWwpIHsKLQkJCQlpZiAoYXNzb2NpYXRlZE9iamVjdAotCQkJCQkJLmVxdWFscygoKE92ZXJsYXlMYWJlbCkgY29udHJvbHNbaV0pLmFzc29jaWF0ZWRPYmplY3QpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlPdmVybGF5TGFiZWwgbGFiZWwgPSBuZXcgT3ZlcmxheUxhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5hc3NvY2lhdGVkT2JqZWN0ID0gYXNzb2NpYXRlZE9iamVjdDsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwge0BsaW5rIE92ZXJsYXlMYWJlbH0gYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBwb3NpdGlvbgotCSAqIEByZXR1cm4gdGhlIGFycmF5cyBvZiBPdmVybGF5TGFiZWxzIHBsYWNlZCBhdCB0aGUgPGk+cG9zaXRpb248L2k+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3ZlcmxheUxhYmVsW10gZ2V0TGFiZWxzQXRQb3NpdGlvbihQb2ludCBwb3NpdGlvbikgewotCQlMaXN0PE92ZXJsYXlMYWJlbD4gbGFiZWxMaXN0ID0gbmV3IEFycmF5TGlzdDxPdmVybGF5TGFiZWw+KCk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRPdmVybGF5Q29tcG9zaXRlKGZhbHNlKTsKLQkJaWYgKG51bGwgIT0gY29tcG9zaXRlKSB7Ci0JCQlDb250cm9sW10gY29udHJvbHMgPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY29udHJvbHNbaV0gaW5zdGFuY2VvZiBPdmVybGF5TGFiZWwpIHsKLQkJCQkJaWYgKGNvbnRyb2xzW2ldLmdldEJvdW5kcygpLmNvbnRhaW5zKHBvc2l0aW9uKSkgewotCQkJCQkJbGFiZWxMaXN0LmFkZCgoT3ZlcmxheUxhYmVsKSBjb250cm9sc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChPdmVybGF5TGFiZWxbXSkgbGFiZWxMaXN0LnRvQXJyYXkobmV3IE92ZXJsYXlMYWJlbFtsYWJlbExpc3QKLQkJCQkuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcG9zaXRlIGdldE92ZXJsYXlDb21wb3NpdGUoYm9vbGVhbiBjcmVhdGUpIHsKLQkJT3ZlcmxheVdpbmRvdyB3aW5kb3cgPSBPdmVybGF5V2luZG93LmdldEluc3RhbmNlKAotCQkJCU92ZXJsYXlXaW5kb3cuSU5ERVhfTEFCRUxTLCBjcmVhdGUpOwotCQlpZiAobnVsbCAhPSB3aW5kb3cpIHsKLQkJCXJldHVybiB3aW5kb3cuZ2V0Q29tcG9zaXRlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHBvcHVwIG1lbnUuCi0JICogCi0JICogQHJldHVybiB0aGUgcG9wdXAgbWVudS4KLQkgKi8KLQlwdWJsaWMgTWVudSBjcmVhdGVQb3B1cE1lbnUoKSB7Ci0JCWlmIChudWxsICE9IHBvcHVwTWVudSAmJiAhcG9wdXBNZW51LmlzRGlzcG9zZWQoKSkgewotCQkJcG9wdXBNZW51LmRpc3Bvc2UoKTsKLQkJfQotCQlwb3B1cE1lbnUgPSBuZXcgTWVudSh0aGlzKTsKLQkJcmV0dXJuIHBvcHVwTWVudTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAobnVsbCAhPSBwb3B1cE1lbnUgJiYgIXBvcHVwTWVudS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXBvcHVwTWVudS5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGlkIG9mIHRoZSBvd25lciB2aWV3LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE93bmVySWQoKSB7Ci0JCXJldHVybiBvd25lcklkOwotCX0KLQotCS8qKgotCSAqIFNldCBJRCBvZiB0aGUgb3duZXIgdmlldy4KLQkgKiAKLQkgKiBAcGFyYW0gdGhlCi0JICogICAgICAgICAgICBpZCBvZiB0aGUgb3duZXIgdmlldy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3duZXJJZChTdHJpbmcgaWQpIHsKLQkJb3duZXJJZCA9IGlkOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU5VX1NFUEFSQVRPUiA9ICJcbi0tLS0tLS0tLS0tLS0tLS0iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXQgdGhlIHRvb2x0aXAgdGV4dCBvZiB0aGUgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0b29sdGlwIHRleHQKLQkgKiBAcGFyYW0gcHJvcGVydGllcwotCSAqICAgICAgICAgICAgdGhlIHNldCBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgdmFsdWVzLiBbMF09bmFtZSwgWzFdPXZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2x0b3AoU3RyaW5nIHRleHQsIFN0cmluZ1tdW10gcHJvcGVydGllcykgewotCQl0ZXh0ICs9IE1FTlVfU0VQQVJBVE9SOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwcm9wZXJ0aWVzW2ldWzFdLmxlbmd0aCgpID4gMCkgewotCQkJCXRleHQgKz0gIlxuIiArIHByb3BlcnRpZXNbaV1bMF0gKyAiOiAiICsgcHJvcGVydGllc1tpXVsxXTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJc2V0VG9vbFRpcFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgdGV4dCB0byBiZSBzaG93biBvbiBtZW51LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVudVRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0VG9vbFRpcFRleHQoKTsKLQkJaW50IHNlcCA9IHRleHQuaW5kZXhPZihNRU5VX1NFUEFSQVRPUik7Ci0JCWlmIChzZXAgPiAwKSB7Ci0JCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgc2VwKTsKLQkJfQotCQl0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKCJcbiIsICIgfCAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiB0ZXh0OwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9PdmVybGF5V2luZG93LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL092ZXJsYXlXaW5kb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhZWM3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL092ZXJsYXlXaW5kb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFRha2FzaGkgSVRPSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyOwotCi1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NFbnZpcm9ubWVudDsKLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2hlbGxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogT3ZlcmxheVdpbmRvdyBpcyB0cmFuc3BhcmVudCB3aW5kb3cuIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gb3ZlcmxheQotICogc29tZSBsYWJlbHMgYW5kIGhpZ2hsaWdodCBib3JkZXJzIG9uIHRoZSBhcHBsaWNhdGlvbiB3aW5kb3dzLiBUaGUKLSAqIE92ZXJsYXlXaW5kb3cgY292ZXJzIHRoZSBlbnRpcmUgc2NyZWVuLiBDdXJyZW50bHkgaXQgc3VwcG9ydHMgb25seSB0aGUgbWFpbgotICogc2NyZWVuLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIE92ZXJsYXlXaW5kb3cgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5ET1dfVEVYVCA9ICJbT3ZlcmxheSBXaW5kb3ddIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOREVYX0hJR0hMSUdIVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfTEFCRUxTID0gMTsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHZpc2libGUgPSB0cnVlOwotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByaXZhdGUgRGlzcGxheSBkaXNwbGF5OwotCi0JcHJpdmF0ZSBzdGF0aWMgT3ZlcmxheVdpbmRvd1tdIGluc3RhbmNlID0gbmV3IE92ZXJsYXlXaW5kb3dbMl07Ci0KLQlwcml2YXRlIE92ZXJsYXlXaW5kb3coaW50IGluZGV4KSB7Ci0JCS8vIENyZWF0ZSBPdmVybGF5V2luZG93IHNoZWxsCi0JCXNoZWxsID0gbmV3IFNoZWxsKFNXVC5NT0RFTEVTUyB8IFNXVC5OT19UUklNIHwgU1dULk9OX1RPUCk7Ci0JCXNoZWxsLnNldFRleHQoV0lORE9XX1RFWFQpOwotCQlzaGVsbC5zZXRCYWNrZ3JvdW5kKHNoZWxsLmdldEJhY2tncm91bmQoKSk7IC8vIEZpeCBmb3IgY29sb3IgY2hhbmdlCi0JCWRpc3BsYXkgPSBzaGVsbC5nZXREaXNwbGF5KCk7Ci0JCVNoZWxsIGFjdGl2ZVNoZWxsID0gZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpOwotCQlpZiAobnVsbCAhPSBhY3RpdmVTaGVsbCkgewotCQkJYWN0aXZlU2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJLy8gTWFrZSBzaGVsbCB3aW5kb3cgdHJhbnNwYXJlbnQKLQkJT3ZlcmxheVdpbmRvdy5zZXRMYXllcmVkKHNoZWxsLCBJTkRFWF9ISUdITElHSFQgPT0gaW5kZXgpOwotCi0JCS8vIEluaXQgdGhlIHNoZWxsCi0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JhcGhpY3NFbnZpcm9ubWVudCBlbnYgPSBHcmFwaGljc0Vudmlyb25tZW50Ci0JCQkJLmdldExvY2FsR3JhcGhpY3NFbnZpcm9ubWVudCgpOwotCQlSZWN0YW5nbGUgcmVjdCA9IGVudi5nZXREZWZhdWx0U2NyZWVuRGV2aWNlKCkuZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKQotCQkJCS5nZXRCb3VuZHMoKTsKLQkJc2hlbGwuc2V0Qm91bmRzKDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJLy8gc2hlbGwuc2V0Qm91bmRzKDAsIDAsIE9TLkdldFN5c3RlbU1ldHJpY3MoT1MuU01fQ1hTQ1JFRU4pLAotCQkvLyBPUy5HZXRTeXN0ZW1NZXRyaWNzKE9TLlNNX0NZU0NSRUVOKSk7Ci0JCXNoZWxsLnNldFZpc2libGUodmlzaWJsZSk7Ci0KLQkJLy8KLQkJaWYgKElOREVYX0xBQkVMUyA9PSBpbmRleCkgewotCQkJc2hlbGwuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNoZWxsRGVhY3RpdmF0ZWQoU2hlbGxFdmVudCBlKSB7Ci0JCQkJCU92ZXJsYXlMYWJlbC5yZW1vdmVBbGwoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBvdmVybGF5LCBpdCBtdXN0IGJlIElOREVYX0hJR0hMSUdIVCBvcgotCSAqICAgICAgICAgICAgSU5ERVhfTEFCRUxTCi0JICogQHBhcmFtIGNyZWF0ZQotCSAqICAgICAgICAgICAgd2hldGhlciBjcmVhdGUgYSBuZXcgaW50YW5jZSBvciBub3QKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGUgT3ZlcmxheVdpbmRvdwotCSAqIEBzZWUgI0lOREVYX0hJR0hMSUdIVAotCSAqIEBzZWUgI0lOREVYX0xBQkVMUwotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3ZlcmxheVdpbmRvdyBnZXRJbnN0YW5jZShpbnQgaW5kZXgsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCWlmIChpbmRleCA8IGluc3RhbmNlLmxlbmd0aCkgewotCQkJaWYgKGNyZWF0ZSAmJiBudWxsID09IGluc3RhbmNlW2luZGV4XSkgewotCQkJCWluc3RhbmNlW2luZGV4XSA9IG5ldyBPdmVybGF5V2luZG93KGluZGV4KTsKLQkJCX0KLQkJCXJldHVybiBpbnN0YW5jZVtpbmRleF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBvdmVybGF5IHdpbmRvdyBpcyB2aXNpYmxlIG9yIG5vdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRWaXNpYmxlKCkgewotCQlyZXR1cm4gdmlzaWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VmlzaWJsZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgb3ZlcmxheSB3aW5kb3cgaXMgdmlzaWJsZSBvciBub3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIG5ld1Zpc2libGUpIHsKLQkJaWYgKHZpc2libGUgIT0gbmV3VmlzaWJsZSkgewotCQkJdmlzaWJsZSA9IG5ld1Zpc2libGU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG51bGwgIT0gaW5zdGFuY2VbaV0pIHsKLQkJCQkJaW5zdGFuY2VbaV0uc2hlbGwuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBpbnRlcm5hbCBjb21wb3NpdGUgb2JqZWN0LiBPdmVybGF5TGFiZWwgYW5kCi0JICogICAgICAgICBIaWdobGlnaHRDb21wb3NpdGUgYXJlIGFkZGVkIHRvIHRoaXMgY29tcG9zaXRlLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgZ2V0Q29tcG9zaXRlKCkgewotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlDb250cm9sW10gY2hpbGRyZW4gPSBzaGVsbC5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIElJbnRlcnZhbEV4ZWMpIHsKLQkJCQkJaW50IG5leHRJbnRlcnZhbCA9ICgoSUludGVydmFsRXhlYykgY2hpbGRyZW5baV0pLmV4ZWMoKTsKLQkJCQkJaWYgKG5leHRJbnRlcnZhbCA+IDApIHsKLQkJCQkJCWRpc3BsYXkudGltZXJFeGVjKG5leHRJbnRlcnZhbCwgdGhpcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEBwYXJhbSB0cmFuc3BhcmVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0TGF5ZXJlZChDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gdHJhbnNwYXJlbnQpIHsKLQkJaW50IHdzID0gT1MuR2V0V2luZG93TG9uZ1coY29udHJvbC5oYW5kbGUsIE9TLkdXTF9FWFNUWUxFKTsKLQkJd3MgfD0gV2luZG93VXRpbC5XU19FWF9MQVlFUkVEOwotCQlpZiAodHJhbnNwYXJlbnQpIHsKLQkJCXdzIHw9IE9TLldTX0VYX1RSQU5TUEFSRU5UOwotCQl9Ci0JCU9TLlNldFdpbmRvd0xvbmcoY29udHJvbC5oYW5kbGUsIE9TLkdXTF9FWFNUWUxFLCB3cyk7Ci0JCVdpbmRvd1V0aWwuU2V0TGF5ZXJlZFdpbmRvd0F0dHJpYnV0ZXMoY29udHJvbC5oYW5kbGUsIGNvbnRyb2wKLQkJCQkuZ2V0QmFja2dyb3VuZCgpLmhhbmRsZSwgKGNoYXIpIDAsIFdpbmRvd1V0aWwuTFdBX0NPTE9SS0VZKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmFjdGYudXRpbC53aW4zMi9zcmMvb3JnL2VjbGlwc2UvYWN0Zi91dGlsL3dpbjMyL1dNQ01vbml0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvV01DTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDI5NjczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvV01DTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgVGFrYXNoaSBJVE9IIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLndpbjMyLk9TOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIG1lc3NhZ2UgdHJhbnNmZXIgd2l0aCBvdGhlciB3aW5kb3dzIHZpYQotICoge0BsaW5rIENPUFlEQVRBU1RSVUNUfQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdNQ01vbml0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByb2R1Y3ROYW1lID0gIlVua25vd24iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHsKLQkJSVByb2R1Y3QgcHJvZHVjdCA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKTsKLQkJaWYgKG51bGwgIT0gcHJvZHVjdCkgewotCQkJcHJvZHVjdE5hbWUgPSBwcm9kdWN0LmdldE5hbWUoKTsKLQkJfQotCX0KLQlwcml2YXRlIGludCBvbGRTaGVsbFByb2MgPSAwOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgV01DTW9uaXRvciB3aXRoIGRlZmF1bHQgdGl0bGUKLQkgKi8KLQlwdWJsaWMgV01DTW9uaXRvcigpIHsKLQkJdGhpcygiV01DV2luZG93OiIgKyBwcm9kdWN0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBXTUNNb25pdG9yCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB3aW5kb3cgdGl0bGUKLQkgKi8KLQlwdWJsaWMgV01DTW9uaXRvcihTdHJpbmcgdGl0bGUpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChudWxsICE9IGRpc3BsYXkpIHsKLQkJCVNoZWxsIGFjdGl2ZVNoZWxsID0gZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJaWYgKG51bGwgIT0gYWN0aXZlU2hlbGwpIHsKLQkJCQlDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBDYWxsYmFjayh0aGlzLCAic2hlbGxXaW5kb3dQcm9jIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgYWRkcmVzcyA9IGNhbGxiYWNrLmdldEFkZHJlc3MoKTsKLQkJCQlpZiAoYWRkcmVzcyAhPSAwKSB7Ci0JCQkJCWZpbmFsIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JCQkJCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQlzaGVsbC5zZXRCb3VuZHMoMCwgMCwgMCwgMCk7Ci0JCQkJCXNoZWxsLnNldFRleHQodGl0bGUpOwotCQkJCQlvbGRTaGVsbFByb2MgPSBPUy5HZXRXaW5kb3dMb25nKHNoZWxsLmhhbmRsZSwKLQkJCQkJCQlPUy5HV0xfV05EUFJPQyk7Ci0JCQkJCU9TLlNldFdpbmRvd0xvbmcoc2hlbGwuaGFuZGxlLCBPUy5HV0xfV05EUFJPQywgYWRkcmVzcyk7Ci0JCQkJCWFjdGl2ZVNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQkJCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNhbGxiYWNrLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXaW5kb3cgcHJvY2VkdXJlCi0JICogCi0JICogQHBhcmFtIGh3bmQKLQkgKiBAcGFyYW0gbXNnCi0JICogQHBhcmFtIHdQYXJhbQotCSAqIEBwYXJhbSBsUGFyYW0KLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IHNoZWxsV2luZG93UHJvYyhpbnQgaHduZCwgaW50IG1zZywgaW50IHdQYXJhbSwgaW50IGxQYXJhbSkgewotCQl0cnkgewotCQkJaWYgKENPUFlEQVRBU1RSVUNULldNX0NPUFlEQVRBID09IG1zZykgewotCQkJCXJldHVybiBvbkNvcHlEYXRhKGh3bmQsIHdQYXJhbSwgbmV3IENPUFlEQVRBU1RSVUNUKGxQYXJhbSkpOwotCQkJfQotCQkJcmV0dXJuIE9TLkNhbGxXaW5kb3dQcm9jKG9sZFNoZWxsUHJvYywgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIFdNX0NPUFlEQVRBIGhhbmRsZXIKLQkgKiAKLQkgKiBAcGFyYW0gaHduZAotCSAqIEBwYXJhbSBod25kRnJvbQotCSAqIEBwYXJhbSBjZHMKLQkgKiBAcmV0dXJuIDEgaWYgcHJvY2Vzc2VkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGludCBvbkNvcHlEYXRhKGludCBod25kLCBpbnQgaHduZEZyb20sIENPUFlEQVRBU1RSVUNUIGNkcyk7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuYWN0Zi51dGlsLndpbjMyL3NyYy9vcmcvZWNsaXBzZS9hY3RmL3V0aWwvd2luMzIvV2luZG93VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9XaW5kb3dVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ODY3MWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzIvc3JjL29yZy9lY2xpcHNlL2FjdGYvdXRpbC93aW4zMi9XaW5kb3dVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBUYWthc2hpIElUT0ggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hY3RmLnV0aWwud2luMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC53aW4zMi5PUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuUkVDVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuVENIQVI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3Igd2luZG93IGhhbmRsZS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXaW5kb3dVdGlsIHsKLQotCS8qKgotCSAqIEdldCB3aW5kb3cgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gaFduZAotCSAqICAgICAgICAgICAgdGFyZ2V0IHdpbmRvdwotCSAqIEByZXR1cm4gd2luZG93IHRleHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZXRXaW5kb3dUZXh0KGludCBoV25kKSB7Ci0JCWludCBzaXplID0gT1MuR2V0V2luZG93VGV4dExlbmd0aChoV25kKTsKLQkJaWYgKDAgPT0gc2l6ZSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJVENIQVIgYnVmZmVyID0gbmV3IFRDSEFSKDAsIHNpemUgKyAxKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygwLCBPUy5HZXRXaW5kb3dUZXh0KGhXbmQsIGJ1ZmZlciwgYnVmZmVyCi0JCQkJLmxlbmd0aCgpKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHdpbmRvdyBjbGFzcyBuYW1lCi0JICogCi0JICogQHBhcmFtIGhXbmQKLQkgKiAgICAgICAgICAgIHRhcmdldCB3aW5kb3cKLQkgKiBAcmV0dXJuIHdpbmRvdyBjbGFzcyBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2V0V2luZG93Q2xhc3NOYW1lKGludCBoV25kKSB7Ci0JCVRDSEFSIGJ1ZmZlciA9IG5ldyBUQ0hBUigwLCAyNTYpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKDAsIE9TCi0JCQkJLkdldENsYXNzTmFtZShoV25kLCBidWZmZXIsIGJ1ZmZlci5sZW5ndGgoKSkpOwotCX0KLQotCS8qKgotCSAqIEdldCB3aW5kb3cgcmVjdGFuZ2xlCi0JICogCi0JICogQHBhcmFtIGhXbmQKLQkgKiAgICAgICAgICAgIHRhcmdldCB3aW5kb3cKLQkgKiBAcmV0dXJuIHdpbmRvdyByZWN0YW5nbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlY3RhbmdsZSBHZXRXaW5kb3dSZWN0YW5nbGUoaW50IGhXbmQpIHsKLQkJUkVDVCByZWN0ID0gbmV3IFJFQ1QoKTsKLQkJT1MuR2V0V2luZG93UmVjdChoV25kLCByZWN0KTsKLQkJcmV0dXJuIG5ldyBSZWN0YW5nbGUocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCAtIHJlY3QubGVmdCwKLQkJCQlyZWN0LmJvdHRvbSAtIHJlY3QudG9wKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0YXJnZXQgd2luZG93IGlzIHZpc2libGUKLQkgKiAKLQkgKiBAcGFyYW0gaFduZAotCSAqICAgICAgICAgICAgdGFyZ2V0IHdpbmRvdwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IHdpbmRvdyBpcyB2aXNpYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIElzV2luZG93VmlzaWJsZShpbnQgaFduZCkgewotCQlyZXR1cm4gT1MuSXNXaW5kb3dWaXNpYmxlKGhXbmQpOwotCX0KLQotCS8qKgotCSAqIEdldCBkZXNrdG9wIHdpbmRvdwotCSAqIAotCSAqIEByZXR1cm4gZGVza3RvcCB3aW5kb3cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBHZXREZXNrdG9wV2luZG93KCkgewotCQlyZXR1cm4gT1MuR2V0RGVza3RvcFdpbmRvdygpOwotCX0KLQotCS8qKgotCSAqIEdldCBjaGlsZCB3aW5kb3cKLQkgKiAKLQkgKiBAcGFyYW0gaFduZAotCSAqICAgICAgICAgICAgdGFyZ2V0IHdpbmRvdwotCSAqIEByZXR1cm4gY2hpbGQgd2luZG93IG9mIHRoZSB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBHZXRDaGlsZFdpbmRvdyhpbnQgaFduZCkgewotCQlyZXR1cm4gT1MuR2V0V2luZG93KGhXbmQsIE9TLkdXX0NISUxEKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbmV4dCB3aW5kb3cKLQkgKiAKLQkgKiBAcGFyYW0gaFduZAotCSAqICAgICAgICAgICAgdGFyZ2V0IHdpbmRvdwotCSAqIEByZXR1cm4gbmV4dCB3aW5kb3cgb2YgdGhlIHRhcmdldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IEdldE5leHRXaW5kb3coaW50IGhXbmQpIHsKLQkJcmV0dXJuIE9TLkdldFdpbmRvdyhoV25kLCBPUy5HV19IV05ETkVYVCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IG93bmVyIHdpbmRvdwotCSAqIAotCSAqIEBwYXJhbSBoV25kCi0JICogICAgICAgICAgICB0YXJnZXQgd2luZG93Ci0JICogQHJldHVybiBvd25lciB3aW5kb3cgb2YgdGhlIHRhcmdldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IEdldE93bmVyV2luZG93KGludCBoV25kKSB7Ci0JCXJldHVybiBPUy5HZXRXaW5kb3coaFduZCwgT1MuR1dfT1dORVIpOwotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgd2luZG93Ci0JICogCi0JICogQHBhcmFtIGhXbmQKLQkgKiAgICAgICAgICAgIHRhcmdldCB3aW5kb3cKLQkgKiBAcmV0dXJuIHBhcmVudCB3aW5kb3cgb2YgdGhlIHRhcmdldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IEdldFBhcmVudFdpbmRvdyhpbnQgaFduZCkgewotCQlyZXR1cm4gT1MuR2V0UGFyZW50KGhXbmQpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRhcmdldCBpcyBwb3B1cCBtZW51Ci0JICogCi0JICogQHBhcmFtIGh3bmQKLQkgKiAgICAgICAgICAgIHRhcmdldCB3aW5kb3cKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBpcyBwb3B1cCBtZW51Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUG9wdXBNZW51KGludCBod25kKSB7Ci0JCWlmICgiIzMyNzY4Ii5lcXVhbHMoR2V0V2luZG93Q2xhc3NOYW1lKGh3bmQpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gMCA9PSBHZXRPd25lcldpbmRvdyhod25kKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCVN5c3RlbS5sb2FkTGlicmFyeSgiQWNjZXNzaWJpbHR5V2luMzJMaWJyYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXU19FWF9MQVlFUkVEID0gMHg4MDAwMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExXQV9DT0xPUktFWSA9IDB4MDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMV0FfQUxQSEEgPSAweDAyOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBuYXRpdmUgaW50IFNldExheWVyZWRXaW5kb3dBdHRyaWJ1dGVzKGludCBod25kLAotCQkJaW50IGNyS2V5LCBjaGFyIGJBbHBoYSwgaW50IGR3RmxhZ3MpOwotCi19Cg==